From eaa7e8a1fc2bd1975c72152840e043f8cc352de3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 03:01:19 +0000 Subject: [PATCH 001/333] build: (deps): bump pretty_qr_code from 3.5.0 to 3.6.0 Bumps [pretty_qr_code](https://github.com/promops/flutter_pretty_qr) from 3.5.0 to 3.6.0. - [Release notes](https://github.com/promops/flutter_pretty_qr/releases) - [Changelog](https://github.com/promops/flutter_pretty_qr/blob/master/CHANGELOG.md) - [Commits](https://github.com/promops/flutter_pretty_qr/compare/3.5.0...3.6.0) --- updated-dependencies: - dependency-name: pretty_qr_code dependency-version: 3.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 22d6e0b0..8e0c27e9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1328,10 +1328,10 @@ packages: dependency: "direct main" description: name: pretty_qr_code - sha256: "2291db3f68d70a3dcd46c6bd599f30991ae4c02f27f36215fbb3f4865a609259" + sha256: "474f8a4512113fba06f14a6ec9bbf42353b4e651d7a520e3096f2a9b6bbe7a8a" url: "https://pub.dev" source: hosted - version: "3.5.0" + version: "3.6.0" process: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index dbd54938..8a30a0b2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -61,7 +61,7 @@ dependencies: path: ^1.9.0 path_provider: ^2.1.2 permission_handler: ^12.0.1 - pretty_qr_code: ^3.5.0 + pretty_qr_code: ^3.6.0 provider: ^6.0.2 punycode: ^1.0.0 qr_code_scanner_plus: ^2.0.14 From 4b1970d613aa7fa718ea7910759c24b675fc408f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 03:01:34 +0000 Subject: [PATCH 002/333] build: (deps): bump particles_network from 1.9.0 to 1.9.1 Bumps [particles_network](https://github.com/abod8639/Particles_Network) from 1.9.0 to 1.9.1. - [Changelog](https://github.com/abod8639/Particles_Network/blob/main/CHANGELOG.md) - [Commits](https://github.com/abod8639/Particles_Network/commits) --- updated-dependencies: - dependency-name: particles_network dependency-version: 1.9.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 22d6e0b0..b87116c2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1176,10 +1176,10 @@ packages: dependency: "direct main" description: name: particles_network - sha256: "10350bbf446b504acf591b928b1a39ba687237a8895d73e6567abba1a2740c4c" + sha256: "53b5829f6551c9c079fb41f37bfa5fd514061557b4a5e596c34e26848dd19156" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index dbd54938..dc7f7384 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,7 +57,7 @@ dependencies: mime: ^2.0.0 opus_caf_converter_dart: ^1.0.1 package_info_plus: ^9.0.0 - particles_network: ^1.9.0 + particles_network: ^1.9.1 path: ^1.9.0 path_provider: ^2.1.2 permission_handler: ^12.0.1 From 0c7c8f8d5a122f7ca05cb2cdf0edcd77a000ae03 Mon Sep 17 00:00:00 2001 From: Matias Date: Thu, 5 Feb 2026 20:35:28 +0100 Subject: [PATCH 003/333] fix: get correct aspect ratio from VideoPlayerController --- lib/pages/image_viewer/video_player.dart | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index 7e9937a9..fa18f93c 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -82,10 +82,6 @@ class EventVideoPlayerState extends State { await videoPlayerController.initialize(); - final infoMap = widget.event.content.tryGetMap('info'); - final videoWidth = infoMap?.tryGet('w') ?? 400; - final videoHeight = infoMap?.tryGet('h') ?? 300; - // Create a ChewieController on top. setState(() { _chewieController = ChewieController( @@ -94,7 +90,7 @@ class EventVideoPlayerState extends State { autoPlay: true, autoInitialize: true, looping: true, - aspectRatio: videoHeight == 0 ? null : videoWidth / videoHeight, + aspectRatio: _videoPlayerController?.value.aspectRatio, ); }); } on IOException catch (e) { From 2a390db509f0e535b0d60038bf88ab5c7273a63a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 7 Feb 2026 16:36:21 +0100 Subject: [PATCH 004/333] build: Update to matrix 6.1.0 --- pubspec.lock | 12 ++++++------ pubspec.yaml | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 258900a6..d840df61 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -641,10 +641,10 @@ packages: dependency: "direct main" description: name: flutter_vodozemac - sha256: "16d4b44dd338689441fe42a80d0184e5c864e9563823de9e7e6371620d2c0590" + sha256: ef4c3580a7f2fe8eebb7602c6cba593a42b4a5e5466c372a022f77ccc14914a5 url: "https://pub.dev" source: hosted - version: "0.4.1" + version: "0.5.0" flutter_web_auth_2: dependency: "direct main" description: @@ -1088,10 +1088,10 @@ packages: dependency: "direct main" description: name: matrix - sha256: f1c0cc366a8cd0b9aec6b57f81203c4d9aa9f92793f7ac12ae50410648b070e4 + sha256: f5befb7a9e9658b0b0901cdda86407a909319712a30984ed177f7317ce5f24f1 url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.1.0" meta: dependency: transitive description: @@ -2093,10 +2093,10 @@ packages: dependency: transitive description: name: vodozemac - sha256: "39144e20740807731871c9248d811ed5a037b21d0aa9ffcfa630954de74139d9" + sha256: bbe7dd31d7f623e2aeedb92e4b71a8b519e6109ce1e2911b5a220f6752b65cda url: "https://pub.dev" source: hosted - version: "0.4.0" + version: "0.5.0" wakelock_plus: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index efa133ad..ed6b0427 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -38,7 +38,7 @@ dependencies: flutter_new_badger: ^1.1.1 flutter_secure_storage: ^10.0.0 flutter_shortcuts_new: ^2.0.0 - flutter_vodozemac: ^0.4.1 + flutter_vodozemac: ^0.5.0 flutter_web_auth_2: ^5.0.1 flutter_webrtc: ^1.3.0 geolocator: ^14.0.2 @@ -53,7 +53,7 @@ dependencies: just_audio: ^0.10.5 latlong2: ^0.9.1 linkify: ^5.0.0 - matrix: ^6.0.0 + matrix: ^6.1.0 mime: ^2.0.0 opus_caf_converter_dart: ^1.0.1 package_info_plus: ^9.0.0 From 49003af9498ab34ef489aa0aff04418323c80e7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 03:01:26 +0000 Subject: [PATCH 005/333] build: (deps): bump flutter_local_notifications from 19.5.0 to 20.0.0 Bumps [flutter_local_notifications](https://github.com/MaikuB/flutter_local_notifications) from 19.5.0 to 20.0.0. - [Release notes](https://github.com/MaikuB/flutter_local_notifications/releases) - [Commits](https://github.com/MaikuB/flutter_local_notifications/compare/flutter_local_notifications-v19.5.0...flutter_local_notifications-v20.0.0) --- updated-dependencies: - dependency-name: flutter_local_notifications dependency-version: 20.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- lib/utils/background_push.dart | 4 ++-- lib/utils/client_manager.dart | 12 +++++----- .../notification_background_handler.dart | 10 ++++----- lib/utils/push_helper.dart | 22 +++++++++---------- pubspec.lock | 16 +++++++------- pubspec.yaml | 2 +- 6 files changed, 33 insertions(+), 33 deletions(-) diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 4e0f91f1..85651de3 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -112,7 +112,7 @@ class BackgroundPush { }); } await _flutterLocalNotificationsPlugin.initialize( - const InitializationSettings( + settings: const InitializationSettings( android: AndroidInitializationSettings('notifications_icon'), iOS: DarwinInitializationSettings(), ), @@ -170,7 +170,7 @@ class BackgroundPush { Future cancelNotification(String roomId) async { Logs().v('Cancel notification for room', roomId); - await _flutterLocalNotificationsPlugin.cancel(roomId.hashCode); + await _flutterLocalNotificationsPlugin.cancel(id: roomId.hashCode); // Workaround for app icon badge not updating if (Platform.isIOS) { diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index c318ceb1..31ef6397 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -161,17 +161,17 @@ abstract class ClientManager { final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); await flutterLocalNotificationsPlugin.initialize( - const InitializationSettings( + settings: const InitializationSettings( android: AndroidInitializationSettings('notifications_icon'), iOS: DarwinInitializationSettings(), ), ); - flutterLocalNotificationsPlugin.show( - 0, - title, - body, - const NotificationDetails( + await flutterLocalNotificationsPlugin.show( + id: 0, + title: title, + body: body, + notificationDetails: const NotificationDetails( android: AndroidNotificationDetails( 'error_message', 'Error Messages', diff --git a/lib/utils/notification_background_handler.dart b/lib/utils/notification_background_handler.dart index eaaeb7c6..81213d82 100644 --- a/lib/utils/notification_background_handler.dart +++ b/lib/utils/notification_background_handler.dart @@ -196,7 +196,7 @@ Future notificationTap( .timeout(const Duration(seconds: 3)); final messagingStyleInformation = await AndroidFlutterLocalNotificationsPlugin() - .getActiveNotificationMessagingStyle(room.id.hashCode); + .getActiveNotificationMessagingStyle(id: room.id.hashCode); if (messagingStyleInformation == null) return; l10n ??= await lookupL10n(PlatformDispatcher.instance.locale); messagingStyleInformation.messages?.add( @@ -214,10 +214,10 @@ Future notificationTap( ); await FlutterLocalNotificationsPlugin().show( - room.id.hashCode, - room.getLocalizedDisplayname(MatrixLocals(l10n)), - input, - NotificationDetails( + id: room.id.hashCode, + title: room.getLocalizedDisplayname(MatrixLocals(l10n)), + body: input, + notificationDetails: NotificationDetails( android: AndroidNotificationDetails( AppConfig.pushNotificationsChannelId, l10n.incomingMessages, diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart index 6c9f9338..0fdc9565 100644 --- a/lib/utils/push_helper.dart +++ b/lib/utils/push_helper.dart @@ -41,11 +41,11 @@ Future pushHelper( Logs().e('Push Helper has crashed! Writing into temporary file', e, s); l10n ??= await lookupL10n(PlatformDispatcher.instance.locale); - flutterLocalNotificationsPlugin.show( - notification.roomId?.hashCode ?? 0, - l10n.newMessageInFluffyChat, - l10n.openAppToReadMessages, - NotificationDetails( + await flutterLocalNotificationsPlugin.show( + id: notification.roomId?.hashCode ?? 0, + title: l10n.newMessageInFluffyChat, + body: l10n.openAppToReadMessages, + notificationDetails: NotificationDetails( iOS: const DarwinNotificationDetails(), android: AndroidNotificationDetails( AppConfig.pushNotificationsChannelId, @@ -111,7 +111,7 @@ Future _tryPushHelper( (room) => room.id.hashCode == activeNotification.id, ); if (room == null || !room.isUnreadOrInvited) { - flutterLocalNotificationsPlugin.cancel(activeNotification.id!); + flutterLocalNotificationsPlugin.cancel(id: activeNotification.id!); } } } @@ -220,7 +220,7 @@ Future _tryPushHelper( final messagingStyleInformation = PlatformInfos.isAndroid ? await AndroidFlutterLocalNotificationsPlugin() - .getActiveNotificationMessagingStyle(id) + .getActiveNotificationMessagingStyle(id: id) : null; messagingStyleInformation?.messages?.add(newMessage); @@ -317,10 +317,10 @@ Future _tryPushHelper( } await flutterLocalNotificationsPlugin.show( - id, - title, - body, - platformChannelSpecifics, + id: id, + title: title, + body: body, + notificationDetails: platformChannelSpecifics, payload: FluffyChatPushPayload( client.clientName, event.room.id, diff --git a/pubspec.lock b/pubspec.lock index 258900a6..d88b6e8f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -503,34 +503,34 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "19ffb0a8bb7407875555e5e98d7343a633bb73707bae6c6a5f37c90014077875" + sha256: "76cd20bcfa72fabe50ea27eeaf165527f446f55d3033021462084b87805b4cac" url: "https://pub.dev" source: hosted - version: "19.5.0" + version: "20.0.0" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - sha256: e3c277b2daab8e36ac5a6820536668d07e83851aeeb79c446e525a70710770a5 + sha256: dce0116868cedd2cdf768af0365fc37ff1cbef7c02c4f51d0587482e625868d0 url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "7.0.0" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "277d25d960c15674ce78ca97f57d0bae2ee401c844b6ac80fcd972a9c99d09fe" + sha256: "23de31678a48c084169d7ae95866df9de5c9d2a44be3e5915a2ff067aeeba899" url: "https://pub.dev" source: hosted - version: "9.1.0" + version: "10.0.0" flutter_local_notifications_windows: dependency: transitive description: name: flutter_local_notifications_windows - sha256: "8d658f0d367c48bd420e7cf2d26655e2d1130147bca1eea917e576ca76668aaf" + sha256: "7ddd964fa85b6a23e96956c5b63ef55cdb9e5947b71b95712204db42ad46da61" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "2.0.0" flutter_localizations: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index efa133ad..50502a96 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,7 +31,7 @@ dependencies: sdk: flutter flutter_foreground_task: ^9.2.0 flutter_linkify: ^6.0.0 - flutter_local_notifications: ^19.5.0 + flutter_local_notifications: ^20.0.0 flutter_localizations: sdk: flutter flutter_map: ^8.2.2 From ab2592bdef2daa72445d1b2841de3dfed0d756c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Feb 2026 22:03:32 +0000 Subject: [PATCH 006/333] build: bump aws-sdk-s3 in /ios in the bundler group across 1 directory Bumps the bundler group with 1 update in the /ios directory: [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby). Updates `aws-sdk-s3` from 1.96.1 to 1.208.0 - [Release notes](https://github.com/aws/aws-sdk-ruby/releases) - [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-ruby/commits) --- updated-dependencies: - dependency-name: aws-sdk-s3 dependency-version: 1.208.0 dependency-type: indirect dependency-group: bundler ... Signed-off-by: dependabot[bot] --- ios/Gemfile.lock | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock index 005265cb..d1ee3c35 100644 --- a/ios/Gemfile.lock +++ b/ios/Gemfile.lock @@ -7,23 +7,28 @@ GEM public_suffix (>= 2.0.2, < 6.0) artifactory (3.0.15) atomos (0.1.3) - aws-eventstream (1.1.1) - aws-partitions (1.469.0) - aws-sdk-core (3.114.3) - aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.239.0) - aws-sigv4 (~> 1.1) - jmespath (~> 1.0) - aws-sdk-kms (1.44.0) - aws-sdk-core (~> 3, >= 3.112.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.96.1) - aws-sdk-core (~> 3, >= 3.112.0) + aws-eventstream (1.4.0) + aws-partitions (1.1213.0) + aws-sdk-core (3.242.0) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) + base64 + bigdecimal + jmespath (~> 1, >= 1.6.1) + logger + aws-sdk-kms (1.121.0) + aws-sdk-core (~> 3, >= 3.241.4) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.208.0) + aws-sdk-core (~> 3, >= 3.234.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.1) - aws-sigv4 (1.2.3) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) + base64 (0.3.0) + bigdecimal (4.0.1) claide (1.0.3) colored (1.2) colored2 (3.1.2) @@ -141,6 +146,7 @@ GEM jmespath (1.6.2) json (2.5.1) jwt (2.2.3) + logger (1.7.0) memoist (0.16.2) mini_magick (4.11.0) mini_mime (1.1.0) From abea52d4d72f384247e9efe8de08beca8a1bb0a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 00:15:09 +0000 Subject: [PATCH 007/333] build: (deps): bump go_router from 17.0.1 to 17.1.0 Bumps [go_router](https://github.com/flutter/packages/tree/main/packages) from 17.0.1 to 17.1.0. - [Commits](https://github.com/flutter/packages/commits/go_router-v17.1.0/packages) --- updated-dependencies: - dependency-name: go_router dependency-version: 17.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 72e46e84..1bf1a5b1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -763,10 +763,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: eff94d2a6fc79fa8b811dde79c7549808c2346037ee107a1121b4a644c745f2a + sha256: "7974313e217a7771557add6ff2238acb63f635317c35fa590d348fb238f00896" url: "https://pub.dev" source: hosted - version: "17.0.1" + version: "17.1.0" gsettings: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5ebf4173..ebcd4501 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,7 +42,7 @@ dependencies: flutter_web_auth_2: ^5.0.1 flutter_webrtc: ^1.3.0 geolocator: ^14.0.2 - go_router: ^17.0.1 + go_router: ^17.1.0 handy_window: ^0.4.0 highlight: ^0.7.0 html: ^0.15.4 From d052b5385d37ec89088247122f53657f9fc6f2fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 00:15:18 +0000 Subject: [PATCH 008/333] build: (deps): bump matrix from 6.1.0 to 6.1.1 Bumps [matrix](https://github.com/famedly/matrix-dart-sdk) from 6.1.0 to 6.1.1. - [Release notes](https://github.com/famedly/matrix-dart-sdk/releases) - [Changelog](https://github.com/famedly/matrix-dart-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/famedly/matrix-dart-sdk/compare/v6.1.0...v6.1.1) --- updated-dependencies: - dependency-name: matrix dependency-version: 6.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 72e46e84..1a9cb1aa 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1088,10 +1088,10 @@ packages: dependency: "direct main" description: name: matrix - sha256: f5befb7a9e9658b0b0901cdda86407a909319712a30984ed177f7317ce5f24f1 + sha256: c0214ee99a73957d3c02d54a60afcf9acee577b0924749085d6fdf556e8eba42 url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.1.1" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5ebf4173..913803c5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,7 +53,7 @@ dependencies: just_audio: ^0.10.5 latlong2: ^0.9.1 linkify: ^5.0.0 - matrix: ^6.1.0 + matrix: ^6.1.1 mime: ^2.0.0 opus_caf_converter_dart: ^1.0.1 package_info_plus: ^9.0.0 From 58351535aea1380cedfc02d31ef482120f552785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 11 Feb 2026 09:12:54 +0100 Subject: [PATCH 009/333] fix: Join room by alias even if not found --- lib/utils/url_launcher.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/utils/url_launcher.dart b/lib/utils/url_launcher.dart index 45c93e1b..47613e5d 100644 --- a/lib/utils/url_launcher.dart +++ b/lib/utils/url_launcher.dart @@ -154,12 +154,12 @@ class UrlLauncher { context: context, future: () => matrix.client.getRoomIdByAlias(roomIdOrAlias), ); - if (response.error != null) { - return; // nothing to do, the alias doesn't exist + final result = response.result; + if (result != null) { + roomId = result.roomId; + servers.addAll(result.servers!); + room = matrix.client.getRoomById(roomId!); } - roomId = response.result!.roomId; - servers.addAll(response.result!.servers!); - room = matrix.client.getRoomById(roomId!); } servers.addAll(identityParts.via); if (room != null) { From 8ef3dfd360aedd4ee86dfb8f4aa956cf10ab122a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 21:35:08 +0000 Subject: [PATCH 010/333] build: (deps): bump particles_network from 1.9.1 to 1.9.3 Bumps [particles_network](https://github.com/abod8639/Particles_Network) from 1.9.1 to 1.9.3. - [Changelog](https://github.com/abod8639/Particles_Network/blob/main/CHANGELOG.md) - [Commits](https://github.com/abod8639/Particles_Network/commits) --- updated-dependencies: - dependency-name: particles_network dependency-version: 1.9.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 32 ++++++++++++++++---------------- pubspec.yaml | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 8820a126..8ed6d094 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -157,10 +157,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" charcode: dependency: transitive description: @@ -237,10 +237,10 @@ packages: dependency: transitive description: name: coverage - sha256: "802bd084fb82e55df091ec8ad1553a7331b61c08251eef19a508b6f3f3a9858d" + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" url: "https://pub.dev" source: hosted - version: "1.13.1" + version: "1.15.0" cross_file: dependency: "direct main" description: @@ -1072,18 +1072,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.18" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" matrix: dependency: "direct main" description: @@ -1176,10 +1176,10 @@ packages: dependency: "direct main" description: name: particles_network - sha256: "53b5829f6551c9c079fb41f37bfa5fd514061557b4a5e596c34e26848dd19156" + sha256: fbaead7961925946ff83e5b441bdbc8628139ea161ce901547e6f1190a6161de url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.9.3" path: dependency: "direct main" description: @@ -1813,26 +1813,26 @@ packages: dependency: transitive description: name: test - sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + sha256: "77cc98ea27006c84e71a7356cf3daf9ddbde2d91d84f77dbfe64cf0e4d9611ae" url: "https://pub.dev" source: hosted - version: "1.26.3" + version: "1.28.0" test_api: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "19a78f63e83d3a61f00826d09bc2f60e191bf3504183c001262be6ac75589fb8" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.8" test_core: dependency: transitive description: name: test_core - sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" + sha256: f1072617a6657e5fc09662e721307f7fb009b4ed89b19f47175d11d5254a62d4 url: "https://pub.dev" source: hosted - version: "0.6.12" + version: "0.6.14" timezone: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index a95a56cd..324030c8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,7 +57,7 @@ dependencies: mime: ^2.0.0 opus_caf_converter_dart: ^1.0.1 package_info_plus: ^9.0.0 - particles_network: ^1.9.1 + particles_network: ^1.9.3 path: ^1.9.0 path_provider: ^2.1.2 permission_handler: ^12.0.1 From 7d4fdb60f7db0ab80111d5151ba29a04c615568f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:58:03 +0000 Subject: [PATCH 011/333] build: bump faraday in /ios in the bundler group across 1 directory Bumps the bundler group with 1 update in the /ios directory: [faraday](https://github.com/lostisland/faraday). Updates `faraday` from 1.4.2 to 1.10.5 - [Release notes](https://github.com/lostisland/faraday/releases) - [Changelog](https://github.com/lostisland/faraday/blob/main/CHANGELOG.md) - [Commits](https://github.com/lostisland/faraday/compare/v1.4.2...v1.10.5) --- updated-dependencies: - dependency-name: faraday dependency-version: 1.10.5 dependency-type: indirect dependency-group: bundler ... Signed-off-by: dependabot[bot] --- ios/Gemfile.lock | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/ios/Gemfile.lock b/ios/Gemfile.lock index d1ee3c35..d7d0fcce 100644 --- a/ios/Gemfile.lock +++ b/ios/Gemfile.lock @@ -42,22 +42,32 @@ GEM dotenv (2.7.6) emoji_regex (3.2.2) excon (0.82.0) - faraday (1.4.2) + faraday (1.10.5) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) faraday-net_http (~> 1.0) - faraday-net_http_persistent (~> 1.1) - multipart-post (>= 1.2, < 3) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) faraday-cookie_jar (0.0.7) faraday (>= 0.8.0) http-cookie (~> 1.0.0) faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) + faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) - faraday-net_http (1.0.1) - faraday-net_http_persistent (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.2.0) + multipart-post (~> 2.0) + faraday-net_http (1.0.2) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) faraday_middleware (1.0.0) faraday (~> 1.0) fastimage (2.2.4) @@ -167,7 +177,7 @@ GEM retriable (3.1.2) rexml (3.4.2) rouge (2.0.7) - ruby2_keywords (0.0.4) + ruby2_keywords (0.0.5) rubyzip (2.3.0) security (0.1.3) signet (0.15.0) From 52409ee6576f41398907a45bb6d5ddea69e60b27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Feb 2026 21:35:29 +0000 Subject: [PATCH 012/333] build: (deps): bump flutter_local_notifications from 20.0.0 to 20.1.0 Bumps [flutter_local_notifications](https://github.com/MaikuB/flutter_local_notifications) from 20.0.0 to 20.1.0. - [Release notes](https://github.com/MaikuB/flutter_local_notifications/releases) - [Commits](https://github.com/MaikuB/flutter_local_notifications/compare/flutter_local_notifications-v20.0.0...flutter_local_notifications-v20.1.0) --- updated-dependencies: - dependency-name: flutter_local_notifications dependency-version: 20.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 8ed6d094..43ad6faa 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -503,10 +503,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "76cd20bcfa72fabe50ea27eeaf165527f446f55d3033021462084b87805b4cac" + sha256: "2b50e938a275e1ad77352d6a25e25770f4130baa61eaf02de7a9a884680954ad" url: "https://pub.dev" source: hosted - version: "20.0.0" + version: "20.1.0" flutter_local_notifications_linux: dependency: transitive description: @@ -527,10 +527,10 @@ packages: dependency: transitive description: name: flutter_local_notifications_windows - sha256: "7ddd964fa85b6a23e96956c5b63ef55cdb9e5947b71b95712204db42ad46da61" + sha256: e97a1a3016512437d9c0b12fae7d1491c3c7b9aa7f03a69b974308840656b02a url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" flutter_localizations: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 324030c8..8eec3727 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,7 +31,7 @@ dependencies: sdk: flutter flutter_foreground_task: ^9.2.0 flutter_linkify: ^6.0.0 - flutter_local_notifications: ^20.0.0 + flutter_local_notifications: ^20.1.0 flutter_localizations: sdk: flutter flutter_map: ^8.2.2 From aae427c8a588b6eb072da8ee1922bfa15496c486 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Feb 2026 21:35:36 +0000 Subject: [PATCH 013/333] build: (deps): bump qr_code_scanner_plus from 2.0.14 to 2.1.1 Bumps [qr_code_scanner_plus](https://github.com/vespr-wallet/qr_code_scanner_plus) from 2.0.14 to 2.1.1. - [Changelog](https://github.com/vespr-wallet/qr_code_scanner_plus/blob/master/CHANGELOG.md) - [Commits](https://github.com/vespr-wallet/qr_code_scanner_plus/compare/2.0.14...2.1.1) --- updated-dependencies: - dependency-name: qr_code_scanner_plus dependency-version: 2.1.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 8ed6d094..55e7406a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1392,10 +1392,10 @@ packages: dependency: "direct main" description: name: qr_code_scanner_plus - sha256: b764e5004251c58d9dee0c295e6006e05bd8d249e78ac3383abdb5afe0a996cd + sha256: dae0596b2763c2fd0294f5cfddb1d3a21577ae4dc7fc1449eb5aafc957872f61 url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.1.1" qr_image: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 324030c8..1ce2b78f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,7 +64,7 @@ dependencies: pretty_qr_code: ^3.6.0 provider: ^6.0.2 punycode: ^1.0.0 - qr_code_scanner_plus: ^2.0.14 + qr_code_scanner_plus: ^2.1.1 qr_image: ^1.0.0 receive_sharing_intent: ^1.8.1 record: ^6.1.2 From da8336b1fef89617cc47c559f103892be2144087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 08:31:07 +0100 Subject: [PATCH 014/333] fix: Reply voice message displays a broken html body --- lib/utils/file_description.dart | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/lib/utils/file_description.dart b/lib/utils/file_description.dart index 55ff840b..687fabaf 100644 --- a/lib/utils/file_description.dart +++ b/lib/utils/file_description.dart @@ -12,16 +12,9 @@ extension FileDescriptionExtension on Event { return null; } final filename = content.tryGet('filename'); - final body = content.tryGet('body'); + final body = calcUnlocalizedBody(hideReply: true, plaintextBody: true); - if (filename != body && - body != null && - filename != null && - body.isNotEmpty) { - final formattedBody = content.tryGet('formatted_body'); - if (formattedBody != null && formattedBody.isNotEmpty) { - return formattedBody; - } + if (filename != body && filename != null && body.isNotEmpty) { return body; } return null; From db4b3240c36f391e405129dab3bb422181e20ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 09:01:23 +0100 Subject: [PATCH 015/333] chore: Follow up calculate file description --- lib/utils/file_description.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils/file_description.dart b/lib/utils/file_description.dart index 687fabaf..1d34518c 100644 --- a/lib/utils/file_description.dart +++ b/lib/utils/file_description.dart @@ -14,7 +14,7 @@ extension FileDescriptionExtension on Event { final filename = content.tryGet('filename'); final body = calcUnlocalizedBody(hideReply: true, plaintextBody: true); - if (filename != body && filename != null && body.isNotEmpty) { + if (filename != body && filename != null && this.body.isNotEmpty) { return body; } return null; From acda3e40ff0ca10c45c9e3dc4fd546f2868e0f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 12:50:26 +0100 Subject: [PATCH 016/333] chore: Follow up file description --- lib/utils/file_description.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/utils/file_description.dart b/lib/utils/file_description.dart index 1d34518c..aa6c98ca 100644 --- a/lib/utils/file_description.dart +++ b/lib/utils/file_description.dart @@ -14,7 +14,9 @@ extension FileDescriptionExtension on Event { final filename = content.tryGet('filename'); final body = calcUnlocalizedBody(hideReply: true, plaintextBody: true); - if (filename != body && filename != null && this.body.isNotEmpty) { + if (filename != body && + filename != null && + content.tryGet('body')?.isNotEmpty == true) { return body; } return null; From 65c3566dbd148679f7cc8617d030c8f5227833f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 18:28:36 +0100 Subject: [PATCH 017/333] chore: Adjust design --- lib/config/setting_keys.dart | 2 +- lib/pages/chat/chat_input_row.dart | 26 +++-- lib/pages/chat/recording_input_row.dart | 137 +++++++++++++----------- lib/pages/chat_list/chat_list_view.dart | 13 +-- pubspec.lock | 24 ++--- 5 files changed, 106 insertions(+), 96 deletions(-) diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index b7269f64..7011e864 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -37,7 +37,7 @@ enum AppSettings { sendPublicReadReceipts('chat.fluffy.send_public_read_receipts', true), swipeRightToLeftToReply('chat.fluffy.swipeRightToLeftToReply', true), sendOnEnter('chat.fluffy.send_on_enter', false), - showPresences('chat.fluffy.show_presences', false), + showPresences('chat.fluffy.show_presences', true), displayNavigationRail('chat.fluffy.display_navigation_rail', false), experimentalVoip('chat.fluffy.experimental_voip', false), shareKeysWith('chat.fluffy.share_keys_with_2', 'all'), diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 57eb5f27..2ec8402f 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -19,13 +19,17 @@ import 'input_bar.dart'; class ChatInputRow extends StatelessWidget { final ChatController controller; + static const double height = 56.0; + const ChatInputRow(this.controller, {super.key}); @override Widget build(BuildContext context) { final theme = Theme.of(context); - - const height = 48.0; + final textMessageOnly = + controller.sendController.text.isNotEmpty || + controller.replyEvent != null || + controller.editEvent != null; if (!controller.room.otherPartyCanReceiveMessages) { return Center( @@ -128,9 +132,7 @@ class ChatInputRow extends StatelessWidget { AnimatedContainer( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, - width: controller.sendController.text.isNotEmpty - ? 0 - : height, + width: textMessageOnly ? 0 : 48, height: height, alignment: Alignment.center, decoration: const BoxDecoration(), @@ -221,9 +223,7 @@ class ChatInputRow extends StatelessWidget { AnimatedContainer( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, - width: controller.sendController.text.isNotEmpty - ? 0 - : height, + width: textMessageOnly ? 0 : 48, height: height, alignment: Alignment.center, decoration: const BoxDecoration(), @@ -267,7 +267,7 @@ class ChatInputRow extends StatelessWidget { ), Container( height: height, - width: height, + width: 48, alignment: Alignment.center, child: IconButton( tooltip: L10n.of(context).emojis, @@ -302,13 +302,13 @@ class ChatInputRow extends StatelessWidget { Matrix.of(context).currentBundle!.length > 1) Container( height: height, - width: height, + width: 48, alignment: Alignment.center, child: _ChatAccountPicker(controller), ), Expanded( child: Padding( - padding: const EdgeInsets.symmetric(vertical: 0.0), + padding: const EdgeInsets.symmetric(vertical: 2.0), child: InputBar( room: controller.room, minLines: 1, @@ -358,9 +358,7 @@ class ChatInputRow extends StatelessWidget { height: height, width: height, alignment: Alignment.center, - child: - PlatformInfos.platformCanRecord && - controller.sendController.text.isEmpty + child: PlatformInfos.platformCanRecord && !textMessageOnly ? IconButton( tooltip: L10n.of(context).voiceMessage, onPressed: () => diff --git a/lib/pages/chat/recording_input_row.dart b/lib/pages/chat/recording_input_row.dart index 2a88a784..b7edf3fe 100644 --- a/lib/pages/chat/recording_input_row.dart +++ b/lib/pages/chat/recording_input_row.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/chat_input_row.dart'; import 'package:fluffychat/pages/chat/recording_view_model.dart'; class RecordingInputRow extends StatelessWidget { @@ -19,71 +20,81 @@ class RecordingInputRow extends StatelessWidget { const maxDecibalWidth = 36.0; final time = '${state.duration.inMinutes.toString().padLeft(2, '0')}:${(state.duration.inSeconds % 60).toString().padLeft(2, '0')}'; - return Row( - children: [ - IconButton( - tooltip: L10n.of(context).cancel, - icon: const Icon(Icons.delete_outlined), - color: theme.colorScheme.error, - onPressed: state.cancel, - ), - if (state.isPaused) - IconButton( - tooltip: L10n.of(context).resume, - icon: const Icon(Icons.play_circle_outline_outlined), - onPressed: state.resume, - ) - else - IconButton( - tooltip: L10n.of(context).pause, - icon: const Icon(Icons.pause_circle_outline_outlined), - onPressed: state.pause, - ), - Text(time), - const SizedBox(width: 8), - Expanded( - child: LayoutBuilder( - builder: (context, constraints) { - const width = 4; - return Row( - mainAxisSize: .min, - mainAxisAlignment: .end, - children: state.amplitudeTimeline.reversed - .take((constraints.maxWidth / (width + 2)).floor()) - .toList() - .reversed - .map( - (amplitude) => Container( - margin: const EdgeInsets.only(left: 2), - width: width.toDouble(), - decoration: BoxDecoration( - color: theme.colorScheme.primary, - borderRadius: BorderRadius.circular(2), - ), - height: maxDecibalWidth * (amplitude / 100), - ), + return SizedBox( + height: ChatInputRow.height, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + crossAxisAlignment: .center, + mainAxisAlignment: .spaceBetween, + spacing: 8, + children: [ + IconButton( + tooltip: L10n.of(context).cancel, + icon: const Icon(Icons.delete_outlined), + color: theme.colorScheme.error, + onPressed: state.cancel, + ), + if (state.isPaused) + IconButton( + tooltip: L10n.of(context).resume, + icon: const Icon(Icons.play_circle_outline_outlined), + onPressed: state.resume, + ) + else + IconButton( + tooltip: L10n.of(context).pause, + icon: const Icon(Icons.pause_circle_outline_outlined), + onPressed: state.pause, + ), + Text(time), + Expanded( + child: LayoutBuilder( + builder: (context, constraints) { + const width = 4; + return Row( + mainAxisSize: .min, + mainAxisAlignment: .end, + children: state.amplitudeTimeline.reversed + .take((constraints.maxWidth / (width + 2)).floor()) + .toList() + .reversed + .map( + (amplitude) => Container( + margin: const EdgeInsets.only(left: 2), + width: width.toDouble(), + decoration: BoxDecoration( + color: theme.colorScheme.primary, + borderRadius: BorderRadius.circular(2), + ), + height: maxDecibalWidth * (amplitude / 100), + ), + ) + .toList(), + ); + }, + ), + ), + IconButton( + style: IconButton.styleFrom( + disabledBackgroundColor: theme.bubbleColor.withAlpha(128), + backgroundColor: theme.bubbleColor, + foregroundColor: theme.onBubbleColor, + ), + tooltip: L10n.of(context).sendAudio, + icon: state.isSending + ? const SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive(), ) - .toList(), - ); - }, - ), + : const Icon(Icons.send_outlined), + onPressed: state.isSending + ? null + : () => state.stopAndSend(onSend), + ), + ], ), - IconButton( - style: IconButton.styleFrom( - disabledBackgroundColor: theme.bubbleColor.withAlpha(128), - backgroundColor: theme.bubbleColor, - foregroundColor: theme.onBubbleColor, - ), - tooltip: L10n.of(context).sendAudio, - icon: state.isSending - ? const SizedBox.square( - dimension: 24, - child: CircularProgressIndicator.adaptive(), - ) - : const Icon(Icons.send_outlined), - onPressed: state.isSending ? null : () => state.stopAndSend(onSend), - ), - ], + ), ); } } diff --git a/lib/pages/chat_list/chat_list_view.dart b/lib/pages/chat_list/chat_list_view.dart index 36a4f67b..56b04a1b 100644 --- a/lib/pages/chat_list/chat_list_view.dart +++ b/lib/pages/chat_list/chat_list_view.dart @@ -49,13 +49,14 @@ class ChatListView extends StatelessWidget { body: ChatListViewBody(controller), floatingActionButton: !controller.isSearchMode && controller.activeSpaceId == null - ? FloatingActionButton.extended( + ? FloatingActionButton( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of( + context, + ).colorScheme.onPrimary, onPressed: () => context.go('/rooms/newprivatechat'), - icon: const Icon(Icons.add_outlined), - label: Text( - L10n.of(context).chat, - overflow: TextOverflow.fade, - ), + tooltip: L10n.of(context).newChat, + child: const Icon(Icons.edit_square), ) : const SizedBox.shrink(), ), diff --git a/pubspec.lock b/pubspec.lock index 8ed6d094..0322ee74 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -157,10 +157,10 @@ packages: dependency: transitive description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.0" charcode: dependency: transitive description: @@ -1072,18 +1072,18 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" matrix: dependency: "direct main" description: @@ -1813,26 +1813,26 @@ packages: dependency: transitive description: name: test - sha256: "77cc98ea27006c84e71a7356cf3daf9ddbde2d91d84f77dbfe64cf0e4d9611ae" + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" url: "https://pub.dev" source: hosted - version: "1.28.0" + version: "1.26.3" test_api: dependency: transitive description: name: test_api - sha256: "19a78f63e83d3a61f00826d09bc2f60e191bf3504183c001262be6ac75589fb8" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.8" + version: "0.7.7" test_core: dependency: transitive description: name: test_core - sha256: f1072617a6657e5fc09662e721307f7fb009b4ed89b19f47175d11d5254a62d4 + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" url: "https://pub.dev" source: hosted - version: "0.6.14" + version: "0.6.12" timezone: dependency: transitive description: From 6bdefc43e9077789c022908dba6d9f6b970ee7d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 19:24:58 +0100 Subject: [PATCH 018/333] chore: Follow up input row design --- lib/pages/chat/chat_view.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index dfe81d56..23e0b8ad 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -363,9 +363,7 @@ class ChatView extends StatelessWidget { color: controller.selectedEvents.isNotEmpty ? theme.colorScheme.tertiaryContainer : theme.colorScheme.surfaceContainerHigh, - borderRadius: const BorderRadius.all( - Radius.circular(24), - ), + borderRadius: BorderRadius.circular(32), child: controller.room.isAbandonedDMRoom == true ? Row( mainAxisAlignment: .spaceEvenly, From 51ae4390abfd8b2af4d0fbb60216d7bbc6638c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 19:25:12 +0100 Subject: [PATCH 019/333] fix: Receipt row not auto updating --- lib/pages/chat/seen_by_row.dart | 111 ++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 49 deletions(-) diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart index c55c0736..3f219099 100644 --- a/lib/pages/chat/seen_by_row.dart +++ b/lib/pages/chat/seen_by_row.dart @@ -14,58 +14,71 @@ class SeenByRow extends StatelessWidget { Widget build(BuildContext context) { final theme = Theme.of(context); - final seenByUsers = controller.room.getSeenByUsers(controller.timeline!); const maxAvatars = 7; - return Container( - width: double.infinity, - alignment: Alignment.center, - child: AnimatedContainer( - constraints: const BoxConstraints( - maxWidth: FluffyThemes.maxTimelineWidth, - ), - height: seenByUsers.isEmpty ? 0 : 24, - duration: seenByUsers.isEmpty - ? Duration.zero - : FluffyThemes.animationDuration, - curve: FluffyThemes.animationCurve, - alignment: - controller.timeline!.events.isNotEmpty && - controller.timeline!.events.first.senderId == - Matrix.of(context).client.userID - ? Alignment.topRight - : Alignment.topLeft, - padding: const EdgeInsets.only(left: 8, right: 8, bottom: 4), - child: Wrap( - spacing: 4, - children: [ - ...(seenByUsers.length > maxAvatars - ? seenByUsers.sublist(0, maxAvatars) - : seenByUsers) - .map( - (user) => Avatar( - mxContent: user.avatarUrl, - name: user.calcDisplayname(), - size: 16, - ), - ), - if (seenByUsers.length > maxAvatars) - SizedBox( - width: 16, - height: 16, - child: Material( - color: theme.colorScheme.surface, - borderRadius: BorderRadius.circular(32), - child: Center( - child: Text( - '+${seenByUsers.length - maxAvatars}', - style: const TextStyle(fontSize: 9), + return StreamBuilder( + stream: controller.room.client.onSync.stream.where( + (syncUpdate) => + syncUpdate.rooms?.join?[controller.room.id]?.ephemeral?.any( + (ephemeral) => ephemeral.type == 'm.receipt', + ) ?? + false, + ), + builder: (context, asyncSnapshot) { + final seenByUsers = controller.room.getSeenByUsers( + controller.timeline!, + ); + return Container( + width: double.infinity, + alignment: Alignment.center, + child: AnimatedContainer( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.maxTimelineWidth, + ), + height: seenByUsers.isEmpty ? 0 : 24, + duration: seenByUsers.isEmpty + ? Duration.zero + : FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: + controller.timeline!.events.isNotEmpty && + controller.timeline!.events.first.senderId == + Matrix.of(context).client.userID + ? Alignment.topRight + : Alignment.topLeft, + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 4), + child: Wrap( + spacing: 4, + children: [ + ...(seenByUsers.length > maxAvatars + ? seenByUsers.sublist(0, maxAvatars) + : seenByUsers) + .map( + (user) => Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + size: 16, + ), + ), + if (seenByUsers.length > maxAvatars) + SizedBox( + width: 16, + height: 16, + child: Material( + color: theme.colorScheme.surface, + borderRadius: BorderRadius.circular(32), + child: Center( + child: Text( + '+${seenByUsers.length - maxAvatars}', + style: const TextStyle(fontSize: 9), + ), + ), ), ), - ), - ), - ], - ), - ), + ], + ), + ), + ); + }, ); } } From 819d068485a69321c7508badd7d5acd38ce3f0a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 19:43:46 +0100 Subject: [PATCH 020/333] chore: Adjust status header design --- lib/pages/chat_list/status_msg_list.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pages/chat_list/status_msg_list.dart b/lib/pages/chat_list/status_msg_list.dart index de2690eb..7677e031 100644 --- a/lib/pages/chat_list/status_msg_list.dart +++ b/lib/pages/chat_list/status_msg_list.dart @@ -123,8 +123,8 @@ class PresenceAvatar extends StatelessWidget { final statusMsg = presence.statusMsg; const statusMsgBubbleElevation = 6.0; - final statusMsgBubbleShadowColor = theme.colorScheme.surface; - final statusMsgBubbleColor = Colors.white.withAlpha(230); + final statusMsgBubbleShadowColor = theme.colorScheme.surfaceBright; + final statusMsgBubbleColor = Colors.white.withAlpha(212); return Padding( padding: const EdgeInsets.symmetric(horizontal: 8.0), child: SizedBox( @@ -197,7 +197,7 @@ class PresenceAvatar extends StatelessWidget { Positioned( left: 0, top: 0, - right: 8, + right: 0, child: Column( spacing: 2, crossAxisAlignment: .start, From 7de276f071683479dd1194addd5127f39428929d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 20:13:27 +0100 Subject: [PATCH 021/333] chore: Display spaces filter chip when spaces present even without children --- lib/pages/chat_list/chat_list_body.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index 63e8dee2..b9cb167f 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -142,7 +142,7 @@ class ChatListViewBody extends StatelessWidget { [ ActiveFilter.allChats, - if (spaceDelegateCandidates.isNotEmpty && + if (spaces.isNotEmpty && !AppSettings .displayNavigationRail .value && From 402801c458f5836adb3a79b72b2343533b826a20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 20:47:15 +0100 Subject: [PATCH 022/333] fix: Audioplayer on web buggy --- lib/pages/chat/events/audio_player.dart | 33 ++++++------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index ffccea6c..16b0af24 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -10,6 +10,7 @@ import 'package:just_audio/just_audio.dart'; import 'package:matrix/matrix.dart'; import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:universal_html/html.dart' as html; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; @@ -131,10 +132,8 @@ class AudioPlayerState extends State { matrix.voiceMessageEventId.value != widget.event.eventId ? null : matrix.audioPlayer; - if (currentPlayer != null) { - if (currentPlayer.isAtEndPosition) { - currentPlayer.seek(Duration.zero); - } else if (currentPlayer.playing) { + if (currentPlayer != null && !currentPlayer.isAtEndPosition) { + if (currentPlayer.playing) { currentPlayer.pause(); } else { currentPlayer.play(); @@ -204,8 +203,12 @@ class AudioPlayerState extends State { if (file != null) { audioPlayer.setFilePath(file.path); + } else if (kIsWeb) { + final blob = html.Blob([matrixFile.bytes], 'audio/mpeg'); + final url = html.Url.createObjectUrlFromBlob(blob); + await audioPlayer.setAudioSource(AudioSource.uri(Uri.parse(url))); } else { - await audioPlayer.setAudioSource(MatrixFileAudioSource(matrixFile)); + throw Exception('No audio file provided!'); } audioPlayer.play().onError( @@ -513,26 +516,6 @@ class AudioPlayerState extends State { } } -/// To use a MatrixFile as an AudioSource for the just_audio package -class MatrixFileAudioSource extends StreamAudioSource { - final MatrixFile file; - - MatrixFileAudioSource(this.file); - - @override - Future request([int? start, int? end]) async { - start ??= 0; - end ??= file.bytes.length; - return StreamAudioResponse( - sourceLength: file.bytes.length, - contentLength: end - start, - offset: start, - stream: Stream.value(file.bytes.sublist(start, end)), - contentType: file.mimeType, - ); - } -} - extension on AudioPlayer { bool get isAtEndPosition { final duration = this.duration; From c5b683f8422ef561122f3c50c855cd6ef2417c0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 22:01:44 +0100 Subject: [PATCH 023/333] chore: Adjust chat input row design --- lib/pages/chat/chat_input_row.dart | 7 ++ lib/pages/chat/recording_input_row.dart | 122 +++++++++++++----------- 2 files changed, 72 insertions(+), 57 deletions(-) diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 2ec8402f..1303e36e 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -364,6 +364,13 @@ class ChatInputRow extends StatelessWidget { onPressed: () => ScaffoldMessenger.of(context).showSnackBar( SnackBar( + margin: EdgeInsets.only( + bottom: height + 16, + left: 16, + right: 16, + top: 16, + ), + showCloseIcon: true, content: Text( L10n.of( context, diff --git a/lib/pages/chat/recording_input_row.dart b/lib/pages/chat/recording_input_row.dart index b7edf3fe..5e4686e5 100644 --- a/lib/pages/chat/recording_input_row.dart +++ b/lib/pages/chat/recording_input_row.dart @@ -22,78 +22,86 @@ class RecordingInputRow extends StatelessWidget { '${state.duration.inMinutes.toString().padLeft(2, '0')}:${(state.duration.inSeconds % 60).toString().padLeft(2, '0')}'; return SizedBox( height: ChatInputRow.height, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - crossAxisAlignment: .center, - mainAxisAlignment: .spaceBetween, - spacing: 8, - children: [ - IconButton( + child: Row( + crossAxisAlignment: .center, + mainAxisAlignment: .spaceBetween, + children: [ + const SizedBox(width: 4), + Container( + alignment: .center, + width: 48, + child: IconButton( tooltip: L10n.of(context).cancel, icon: const Icon(Icons.delete_outlined), color: theme.colorScheme.error, onPressed: state.cancel, ), - if (state.isPaused) - IconButton( + ), + if (state.isPaused) + Container( + alignment: .center, + width: 48, + child: IconButton( tooltip: L10n.of(context).resume, icon: const Icon(Icons.play_circle_outline_outlined), onPressed: state.resume, - ) - else - IconButton( + ), + ) + else + Container( + alignment: .center, + width: 48, + child: IconButton( tooltip: L10n.of(context).pause, icon: const Icon(Icons.pause_circle_outline_outlined), onPressed: state.pause, ), - Text(time), - Expanded( - child: LayoutBuilder( - builder: (context, constraints) { - const width = 4; - return Row( - mainAxisSize: .min, - mainAxisAlignment: .end, - children: state.amplitudeTimeline.reversed - .take((constraints.maxWidth / (width + 2)).floor()) - .toList() - .reversed - .map( - (amplitude) => Container( - margin: const EdgeInsets.only(left: 2), - width: width.toDouble(), - decoration: BoxDecoration( - color: theme.colorScheme.primary, - borderRadius: BorderRadius.circular(2), - ), - height: maxDecibalWidth * (amplitude / 100), + ), + Text(time), + Expanded( + child: LayoutBuilder( + builder: (context, constraints) { + const width = 4; + return Row( + mainAxisSize: .min, + mainAxisAlignment: .end, + children: state.amplitudeTimeline.reversed + .take((constraints.maxWidth / (width + 2)).floor()) + .toList() + .reversed + .map( + (amplitude) => Container( + margin: const EdgeInsets.only(left: 2), + width: width.toDouble(), + decoration: BoxDecoration( + color: theme.colorScheme.primary, + borderRadius: BorderRadius.circular(2), ), - ) - .toList(), - ); - }, - ), + height: maxDecibalWidth * (amplitude / 100), + ), + ) + .toList(), + ); + }, ), - IconButton( - style: IconButton.styleFrom( - disabledBackgroundColor: theme.bubbleColor.withAlpha(128), - backgroundColor: theme.bubbleColor, - foregroundColor: theme.onBubbleColor, - ), - tooltip: L10n.of(context).sendAudio, - icon: state.isSending - ? const SizedBox.square( - dimension: 24, - child: CircularProgressIndicator.adaptive(), - ) - : const Icon(Icons.send_outlined), - onPressed: state.isSending - ? null - : () => state.stopAndSend(onSend), + ), + IconButton( + style: IconButton.styleFrom( + disabledBackgroundColor: theme.bubbleColor.withAlpha(128), + backgroundColor: theme.bubbleColor, + foregroundColor: theme.onBubbleColor, ), - ], - ), + tooltip: L10n.of(context).sendAudio, + icon: state.isSending + ? const SizedBox.square( + dimension: 24, + child: CircularProgressIndicator.adaptive(), + ) + : const Icon(Icons.send_outlined), + onPressed: state.isSending ? null : () => state.stopAndSend(onSend), + ), + const SizedBox(width: 4), + ], ), ); } From 7be2d3df594cc0da826195b3fceac7eb9788ce4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 14 Feb 2026 22:05:14 +0100 Subject: [PATCH 024/333] chore: Follow up chat input row --- lib/pages/chat/chat_input_row.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 1303e36e..f6e1835d 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -358,7 +358,10 @@ class ChatInputRow extends StatelessWidget { height: height, width: height, alignment: Alignment.center, - child: PlatformInfos.platformCanRecord && !textMessageOnly + child: + PlatformInfos.platformCanRecord && + !controller.sendController.text.isNotEmpty || + controller.editEvent != null ? IconButton( tooltip: L10n.of(context).voiceMessage, onPressed: () => From 727e442c94d9f47650d8ccebd769e420a4213a7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 15 Feb 2026 10:34:03 +0100 Subject: [PATCH 025/333] chore: Adjust design of navrail --- lib/config/routes.dart | 1 + lib/pages/chat_list/chat_list_view.dart | 18 +- lib/pages/chat_list/start_chat_fab.dart | 21 + lib/pages/settings/settings_view.dart | 421 ++++++++++----------- lib/widgets/layouts/two_column_layout.dart | 6 +- lib/widgets/navigation_rail.dart | 21 +- 6 files changed, 229 insertions(+), 259 deletions(-) create mode 100644 lib/pages/chat_list/start_chat_fab.dart diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 83431003..60e78878 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -197,6 +197,7 @@ abstract class AppRoutes { ? TwoColumnLayout( mainView: Settings(key: state.pageKey), sideView: child, + hasNavigationRail: false, ) : child, ), diff --git a/lib/pages/chat_list/chat_list_view.dart b/lib/pages/chat_list/chat_list_view.dart index 56b04a1b..3c332ce4 100644 --- a/lib/pages/chat_list/chat_list_view.dart +++ b/lib/pages/chat_list/chat_list_view.dart @@ -1,11 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/pages/chat_list/start_chat_fab.dart'; import 'package:fluffychat/widgets/navigation_rail.dart'; import 'chat_list_body.dart'; @@ -48,16 +46,10 @@ class ChatListView extends StatelessWidget { child: Scaffold( body: ChatListViewBody(controller), floatingActionButton: - !controller.isSearchMode && controller.activeSpaceId == null - ? FloatingActionButton( - backgroundColor: Theme.of(context).colorScheme.primary, - foregroundColor: Theme.of( - context, - ).colorScheme.onPrimary, - onPressed: () => context.go('/rooms/newprivatechat'), - tooltip: L10n.of(context).newChat, - child: const Icon(Icons.edit_square), - ) + !controller.isSearchMode && + controller.activeSpaceId == null && + !FluffyThemes.isColumnMode(context) + ? StartChatFab() : const SizedBox.shrink(), ), ), diff --git a/lib/pages/chat_list/start_chat_fab.dart b/lib/pages/chat_list/start_chat_fab.dart new file mode 100644 index 00000000..3f206b2a --- /dev/null +++ b/lib/pages/chat_list/start_chat_fab.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/l10n/l10n.dart'; + +class StartChatFab extends StatelessWidget { + const StartChatFab({super.key}); + + @override + Widget build(BuildContext context) { + return FloatingActionButton( + heroTag: 'start_chat_fab', + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + onPressed: () => context.go('/rooms/newprivatechat'), + tooltip: L10n.of(context).newChat, + child: const Icon(Icons.edit_square), + ); + } +} diff --git a/lib/pages/settings/settings_view.dart b/lib/pages/settings/settings_view.dart index 419db1ce..476c56d8 100644 --- a/lib/pages/settings/settings_view.dart +++ b/lib/pages/settings/settings_view.dart @@ -6,13 +6,11 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; -import 'package:fluffychat/widgets/navigation_rail.dart'; import '../../widgets/mxc_image_viewer.dart'; import 'settings.dart'; @@ -29,243 +27,208 @@ class SettingsView extends StatelessWidget { context, ).routeInformationProvider.value.uri.path; - return Row( - children: [ - if (FluffyThemes.isColumnMode(context)) ...[ - SpacesNavigationRail( - activeSpaceId: null, - onGoToChats: () => context.go('/rooms'), - onGoToSpaceId: (spaceId) => context.go('/rooms?spaceId=$spaceId'), - ), - Container(color: Theme.of(context).dividerColor, width: 1), - ], - Expanded( - child: Scaffold( - appBar: FluffyThemes.isColumnMode(context) - ? null - : AppBar( - title: Text(L10n.of(context).settings), - leading: Center( - child: BackButton(onPressed: () => context.go('/rooms')), - ), - ), - body: ListTileTheme( - iconColor: theme.colorScheme.onSurface, - child: ListView( - key: const Key('SettingsListViewContent'), - children: [ - FutureBuilder( - future: controller.profileFuture, - builder: (context, snapshot) { - final profile = snapshot.data; - final avatar = profile?.avatarUrl; - final mxid = - Matrix.of(context).client.userID ?? - L10n.of(context).user; - final displayname = - profile?.displayName ?? mxid.localpart ?? mxid; - return Row( + return Scaffold( + appBar: AppBar( + title: Text(L10n.of(context).settings), + leading: Center( + child: BackButton(onPressed: () => context.go('/rooms')), + ), + ), + body: ListTileTheme( + iconColor: theme.colorScheme.onSurface, + child: ListView( + key: const Key('SettingsListViewContent'), + children: [ + FutureBuilder( + future: controller.profileFuture, + builder: (context, snapshot) { + final profile = snapshot.data; + final avatar = profile?.avatarUrl; + final mxid = + Matrix.of(context).client.userID ?? L10n.of(context).user; + final displayname = + profile?.displayName ?? mxid.localpart ?? mxid; + return Row( + children: [ + Padding( + padding: const EdgeInsets.all(32.0), + child: Stack( children: [ - Padding( - padding: const EdgeInsets.all(32.0), - child: Stack( - children: [ - Avatar( - mxContent: avatar, - name: displayname, - size: Avatar.defaultSize * 2.5, - onTap: avatar != null - ? () => showDialog( - context: context, - builder: (_) => - MxcImageViewer(avatar), - ) - : null, - ), - if (profile != null) - Positioned( - bottom: 0, - right: 0, - child: FloatingActionButton.small( - elevation: 2, - onPressed: controller.setAvatarAction, - heroTag: null, - child: const Icon( - Icons.camera_alt_outlined, - ), - ), - ), - ], + Avatar( + mxContent: avatar, + name: displayname, + size: Avatar.defaultSize * 2.5, + onTap: avatar != null + ? () => showDialog( + context: context, + builder: (_) => MxcImageViewer(avatar), + ) + : null, + ), + if (profile != null) + Positioned( + bottom: 0, + right: 0, + child: FloatingActionButton.small( + elevation: 2, + onPressed: controller.setAvatarAction, + heroTag: null, + child: const Icon(Icons.camera_alt_outlined), + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: .center, + crossAxisAlignment: .start, + children: [ + TextButton.icon( + onPressed: controller.setDisplaynameAction, + icon: const Icon(Icons.edit_outlined, size: 16), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.onSurface, + iconColor: theme.colorScheme.onSurface, + ), + label: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 18), ), ), - Expanded( - child: Column( - mainAxisAlignment: .center, - crossAxisAlignment: .start, - children: [ - TextButton.icon( - onPressed: controller.setDisplaynameAction, - icon: const Icon( - Icons.edit_outlined, - size: 16, - ), - style: TextButton.styleFrom( - foregroundColor: - theme.colorScheme.onSurface, - iconColor: theme.colorScheme.onSurface, - ), - label: Text( - displayname, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: const TextStyle(fontSize: 18), - ), - ), - TextButton.icon( - onPressed: () => - FluffyShare.share(mxid, context), - icon: const Icon( - Icons.copy_outlined, - size: 14, - ), - style: TextButton.styleFrom( - foregroundColor: - theme.colorScheme.secondary, - iconColor: theme.colorScheme.secondary, - ), - label: Text( - mxid, - maxLines: 1, - overflow: TextOverflow.ellipsis, - // style: const TextStyle(fontSize: 12), - ), - ), - ], + TextButton.icon( + onPressed: () => FluffyShare.share(mxid, context), + icon: const Icon(Icons.copy_outlined, size: 14), + style: TextButton.styleFrom( + foregroundColor: theme.colorScheme.secondary, + iconColor: theme.colorScheme.secondary, + ), + label: Text( + mxid, + maxLines: 1, + overflow: TextOverflow.ellipsis, + // style: const TextStyle(fontSize: 12), ), ), ], - ); - }, - ), - FutureBuilder( - future: Matrix.of(context).client.getWellknown(), - builder: (context, snapshot) { - final accountManageUrl = snapshot - .data - ?.additionalProperties - .tryGetMap( - 'org.matrix.msc2965.authentication', - ) - ?.tryGet('account'); - if (accountManageUrl == null) { - return const SizedBox.shrink(); - } - return ListTile( - leading: const Icon(Icons.account_circle_outlined), - title: Text(L10n.of(context).manageAccount), - trailing: const Icon(Icons.open_in_new_outlined), - onTap: () => launchUrlString( - accountManageUrl, - mode: LaunchMode.inAppBrowserView, - ), - ); - }, - ), - Divider(color: theme.dividerColor), - if (showChatBackupBanner == null) - ListTile( - leading: const Icon(Icons.backup_outlined), - title: Text(L10n.of(context).chatBackup), - trailing: const CircularProgressIndicator.adaptive(), - ) - else - SwitchListTile.adaptive( - controlAffinity: ListTileControlAffinity.trailing, - value: controller.showChatBackupBanner == false, - secondary: const Icon(Icons.backup_outlined), - title: Text(L10n.of(context).chatBackup), - onChanged: controller.firstRunBootstrapAction, - ), - Divider(color: theme.dividerColor), - ListTile( - leading: const Icon(Icons.format_paint_outlined), - title: Text(L10n.of(context).changeTheme), - tileColor: activeRoute.startsWith('/rooms/settings/style') - ? theme.colorScheme.surfaceContainerHigh - : null, - onTap: () => context.go('/rooms/settings/style'), - ), - ListTile( - leading: const Icon(Icons.notifications_outlined), - title: Text(L10n.of(context).notifications), - tileColor: - activeRoute.startsWith('/rooms/settings/notifications') - ? theme.colorScheme.surfaceContainerHigh - : null, - onTap: () => context.go('/rooms/settings/notifications'), - ), - ListTile( - leading: const Icon(Icons.devices_outlined), - title: Text(L10n.of(context).devices), - onTap: () => context.go('/rooms/settings/devices'), - tileColor: activeRoute.startsWith('/rooms/settings/devices') - ? theme.colorScheme.surfaceContainerHigh - : null, - ), - ListTile( - leading: const Icon(Icons.forum_outlined), - title: Text(L10n.of(context).chat), - onTap: () => context.go('/rooms/settings/chat'), - tileColor: activeRoute.startsWith('/rooms/settings/chat') - ? theme.colorScheme.surfaceContainerHigh - : null, - ), - ListTile( - leading: const Icon(Icons.shield_outlined), - title: Text(L10n.of(context).security), - onTap: () => context.go('/rooms/settings/security'), - tileColor: - activeRoute.startsWith('/rooms/settings/security') - ? theme.colorScheme.surfaceContainerHigh - : null, - ), - Divider(color: theme.dividerColor), - ListTile( - leading: const Icon(Icons.dns_outlined), - title: Text( - L10n.of(context).aboutHomeserver( - Matrix.of(context).client.userID?.domain ?? - 'homeserver', ), ), - onTap: () => context.go('/rooms/settings/homeserver'), - tileColor: - activeRoute.startsWith('/rooms/settings/homeserver') - ? theme.colorScheme.surfaceContainerHigh - : null, - ), - ListTile( - leading: const Icon(Icons.privacy_tip_outlined), - title: Text(L10n.of(context).privacy), - onTap: () => launchUrl(AppConfig.privacyUrl), - ), - ListTile( - leading: const Icon(Icons.info_outline_rounded), - title: Text(L10n.of(context).about), - onTap: () => PlatformInfos.showDialog(context), - ), - Divider(color: theme.dividerColor), - ListTile( - leading: const Icon(Icons.logout_outlined), - title: Text(L10n.of(context).logout), - onTap: controller.logoutAction, - ), - ], - ), + ], + ); + }, ), - ), + FutureBuilder( + future: Matrix.of(context).client.getWellknown(), + builder: (context, snapshot) { + final accountManageUrl = snapshot.data?.additionalProperties + .tryGetMap( + 'org.matrix.msc2965.authentication', + ) + ?.tryGet('account'); + if (accountManageUrl == null) { + return const SizedBox.shrink(); + } + return ListTile( + leading: const Icon(Icons.account_circle_outlined), + title: Text(L10n.of(context).manageAccount), + trailing: const Icon(Icons.open_in_new_outlined), + onTap: () => launchUrlString( + accountManageUrl, + mode: LaunchMode.inAppBrowserView, + ), + ); + }, + ), + Divider(color: theme.dividerColor), + if (showChatBackupBanner == null) + ListTile( + leading: const Icon(Icons.backup_outlined), + title: Text(L10n.of(context).chatBackup), + trailing: const CircularProgressIndicator.adaptive(), + ) + else + SwitchListTile.adaptive( + controlAffinity: ListTileControlAffinity.trailing, + value: controller.showChatBackupBanner == false, + secondary: const Icon(Icons.backup_outlined), + title: Text(L10n.of(context).chatBackup), + onChanged: controller.firstRunBootstrapAction, + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.format_paint_outlined), + title: Text(L10n.of(context).changeTheme), + tileColor: activeRoute.startsWith('/rooms/settings/style') + ? theme.colorScheme.surfaceContainerHigh + : null, + onTap: () => context.go('/rooms/settings/style'), + ), + ListTile( + leading: const Icon(Icons.notifications_outlined), + title: Text(L10n.of(context).notifications), + tileColor: activeRoute.startsWith('/rooms/settings/notifications') + ? theme.colorScheme.surfaceContainerHigh + : null, + onTap: () => context.go('/rooms/settings/notifications'), + ), + ListTile( + leading: const Icon(Icons.devices_outlined), + title: Text(L10n.of(context).devices), + onTap: () => context.go('/rooms/settings/devices'), + tileColor: activeRoute.startsWith('/rooms/settings/devices') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + ListTile( + leading: const Icon(Icons.forum_outlined), + title: Text(L10n.of(context).chat), + onTap: () => context.go('/rooms/settings/chat'), + tileColor: activeRoute.startsWith('/rooms/settings/chat') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + ListTile( + leading: const Icon(Icons.shield_outlined), + title: Text(L10n.of(context).security), + onTap: () => context.go('/rooms/settings/security'), + tileColor: activeRoute.startsWith('/rooms/settings/security') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.dns_outlined), + title: Text( + L10n.of(context).aboutHomeserver( + Matrix.of(context).client.userID?.domain ?? 'homeserver', + ), + ), + onTap: () => context.go('/rooms/settings/homeserver'), + tileColor: activeRoute.startsWith('/rooms/settings/homeserver') + ? theme.colorScheme.surfaceContainerHigh + : null, + ), + ListTile( + leading: const Icon(Icons.privacy_tip_outlined), + title: Text(L10n.of(context).privacy), + onTap: () => launchUrl(AppConfig.privacyUrl), + ), + ListTile( + leading: const Icon(Icons.info_outline_rounded), + title: Text(L10n.of(context).about), + onTap: () => PlatformInfos.showDialog(context), + ), + Divider(color: theme.dividerColor), + ListTile( + leading: const Icon(Icons.logout_outlined), + title: Text(L10n.of(context).logout), + onTap: controller.logoutAction, + ), + ], ), - ], + ), ); } } diff --git a/lib/widgets/layouts/two_column_layout.dart b/lib/widgets/layouts/two_column_layout.dart index 4c43d424..9bcbd515 100644 --- a/lib/widgets/layouts/two_column_layout.dart +++ b/lib/widgets/layouts/two_column_layout.dart @@ -5,11 +5,13 @@ import 'package:fluffychat/config/themes.dart'; class TwoColumnLayout extends StatelessWidget { final Widget mainView; final Widget sideView; + final bool hasNavigationRail; const TwoColumnLayout({ super.key, required this.mainView, required this.sideView, + this.hasNavigationRail = true, }); @override Widget build(BuildContext context) { @@ -22,7 +24,9 @@ class TwoColumnLayout extends StatelessWidget { Container( clipBehavior: Clip.antiAlias, decoration: const BoxDecoration(), - width: FluffyThemes.columnWidth + FluffyThemes.navRailWidth, + width: + FluffyThemes.columnWidth + + (hasNavigationRail ? FluffyThemes.navRailWidth : 0), child: mainView, ), Container(width: 1.0, color: theme.dividerColor), diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index f6df4e29..a287f608 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -7,6 +7,7 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/navi_rail_item.dart'; +import 'package:fluffychat/pages/chat_list/start_chat_fab.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -27,9 +28,6 @@ class SpacesNavigationRail extends StatelessWidget { @override Widget build(BuildContext context) { final client = Matrix.of(context).client; - final isSettings = GoRouter.of( - context, - ).routeInformationProvider.value.uri.path.startsWith('/rooms/settings'); return Material( child: SafeArea( child: StreamBuilder( @@ -55,7 +53,7 @@ class SpacesNavigationRail extends StatelessWidget { itemBuilder: (context, i) { if (i == 0) { return NaviRailItem( - isSelected: activeSpaceId == null && !isSettings, + isSelected: activeSpaceId == null, onTap: onGoToChats, icon: const Padding( padding: EdgeInsets.all(10.0), @@ -110,18 +108,9 @@ class SpacesNavigationRail extends StatelessWidget { }, ), ), - NaviRailItem( - isSelected: isSettings, - onTap: () => context.go('/rooms/settings'), - icon: const Padding( - padding: EdgeInsets.all(10.0), - child: Icon(Icons.settings_outlined), - ), - selectedIcon: const Padding( - padding: EdgeInsets.all(10.0), - child: Icon(Icons.settings), - ), - toolTip: L10n.of(context).settings, + Padding( + padding: const EdgeInsets.all(12.0), + child: StartChatFab(), ), ], ), From 193d68a52563811790eac9b0a2a21984a863e266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 15 Feb 2026 11:48:38 +0100 Subject: [PATCH 026/333] fix: Receipts disappear after reaction --- lib/pages/chat/chat_event_list.dart | 5 ++++- lib/pages/chat/seen_by_row.dart | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index a6898f51..4c7adfad 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -79,7 +79,10 @@ class ChatEventList extends StatelessWidget { } return Column( mainAxisSize: .min, - children: [SeenByRow(controller), TypingIndicators(controller)], + children: [ + SeenByRow(timeline: timeline, event: events.first), + TypingIndicators(controller), + ], ); } diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart index 3f219099..1cce7efb 100644 --- a/lib/pages/chat/seen_by_row.dart +++ b/lib/pages/chat/seen_by_row.dart @@ -1,14 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/utils/room_status_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; class SeenByRow extends StatelessWidget { - final ChatController controller; - const SeenByRow(this.controller, {super.key}); + final Timeline timeline; + final Event event; + const SeenByRow({super.key, required this.timeline, required this.event}); @override Widget build(BuildContext context) { @@ -16,16 +18,17 @@ class SeenByRow extends StatelessWidget { const maxAvatars = 7; return StreamBuilder( - stream: controller.room.client.onSync.stream.where( + stream: timeline.room.client.onSync.stream.where( (syncUpdate) => - syncUpdate.rooms?.join?[controller.room.id]?.ephemeral?.any( + syncUpdate.rooms?.join?[timeline.room.id]?.ephemeral?.any( (ephemeral) => ephemeral.type == 'm.receipt', ) ?? false, ), builder: (context, asyncSnapshot) { - final seenByUsers = controller.room.getSeenByUsers( - controller.timeline!, + final seenByUsers = timeline.room.getSeenByUsers( + timeline, + eventId: event.eventId, ); return Container( width: double.infinity, @@ -40,8 +43,8 @@ class SeenByRow extends StatelessWidget { : FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, alignment: - controller.timeline!.events.isNotEmpty && - controller.timeline!.events.first.senderId == + timeline.events.isNotEmpty && + timeline.events.first.senderId == Matrix.of(context).client.userID ? Alignment.topRight : Alignment.topLeft, From 6cb7775c93d55c01eb081f8293991bd03fcff103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 15 Feb 2026 11:54:47 +0100 Subject: [PATCH 027/333] feat: Display read receipts for every event --- lib/pages/chat/chat_event_list.dart | 9 +-------- lib/pages/chat/events/message.dart | 7 +++++-- lib/pages/chat/seen_by_row.dart | 8 ++------ 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index 4c7adfad..910641e0 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -8,7 +8,6 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pages/chat/events/message.dart'; -import 'package:fluffychat/pages/chat/seen_by_row.dart'; import 'package:fluffychat/pages/chat/typing_indicators.dart'; import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; @@ -77,13 +76,7 @@ class ChatEventList extends StatelessWidget { ), ); } - return Column( - mainAxisSize: .min, - children: [ - SeenByRow(timeline: timeline, event: events.first), - TypingIndicators(controller), - ], - ); + return TypingIndicators(controller); } // Request history button or progress indicator: diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 69cb567a..f2239c8a 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -10,6 +10,7 @@ import 'package:swipe_to_action/swipe_to_action.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/chat/seen_by_row.dart'; import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/file_description.dart'; @@ -196,7 +197,7 @@ class Message extends StatelessWidget { ); } - final showReceiptsRow = event.hasAggregatedEvents( + final hasReactions = event.hasAggregatedEvents( timeline, RelationshipTypes.reaction, ); @@ -841,11 +842,12 @@ class Message extends StatelessWidget { ); }, ), + AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, alignment: Alignment.bottomCenter, - child: !showReceiptsRow + child: !hasReactions ? const SizedBox.shrink() : Padding( padding: EdgeInsets.only( @@ -856,6 +858,7 @@ class Message extends StatelessWidget { child: MessageReactions(event, timeline), ), ), + SeenByRow(timeline: timeline, event: event), if (enterThread != null) AnimatedSize( duration: FluffyThemes.animationDuration, diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart index 1cce7efb..ef087dd3 100644 --- a/lib/pages/chat/seen_by_row.dart +++ b/lib/pages/chat/seen_by_row.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/utils/room_status_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -26,10 +25,7 @@ class SeenByRow extends StatelessWidget { false, ), builder: (context, asyncSnapshot) { - final seenByUsers = timeline.room.getSeenByUsers( - timeline, - eventId: event.eventId, - ); + final seenByUsers = event.receipts.map((r) => r.user).toList(); return Container( width: double.infinity, alignment: Alignment.center, @@ -48,7 +44,7 @@ class SeenByRow extends StatelessWidget { Matrix.of(context).client.userID ? Alignment.topRight : Alignment.topLeft, - padding: const EdgeInsets.only(left: 8, right: 8, bottom: 4), + padding: const EdgeInsets.only(bottom: 4, top: 1), child: Wrap( spacing: 4, children: [ From 0323a168215c5338ea0d3b0a17a58c8b61359a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 15 Feb 2026 11:55:53 +0100 Subject: [PATCH 028/333] chore: Follow up padding --- lib/pages/chat/events/message.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index f2239c8a..f05c54da 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -851,7 +851,7 @@ class Message extends StatelessWidget { ? const SizedBox.shrink() : Padding( padding: EdgeInsets.only( - top: 4.0, + top: 2.0, left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0, right: ownMessage ? 0 : 12.0, ), From 39a335fface716f211c02da497383ba5fa089be6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 15 Feb 2026 11:56:40 +0100 Subject: [PATCH 029/333] chore: Follow up padding --- lib/pages/chat/events/message.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index f05c54da..434703c7 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -851,7 +851,7 @@ class Message extends StatelessWidget { ? const SizedBox.shrink() : Padding( padding: EdgeInsets.only( - top: 2.0, + top: 1.0, left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0, right: ownMessage ? 0 : 12.0, ), From 127bc6d698d7d13fc15a0209637ddef95393afe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 15 Feb 2026 12:08:17 +0100 Subject: [PATCH 030/333] chore: Follow up seen by row --- lib/pages/chat/chat_event_list.dart | 9 ++++++++- lib/pages/chat/events/message.dart | 2 -- lib/pages/chat/seen_by_row.dart | 19 ++++++++++--------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index 910641e0..a1e3e953 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -8,6 +8,7 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pages/chat/events/message.dart'; +import 'package:fluffychat/pages/chat/seen_by_row.dart'; import 'package:fluffychat/pages/chat/typing_indicators.dart'; import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; @@ -76,7 +77,13 @@ class ChatEventList extends StatelessWidget { ), ); } - return TypingIndicators(controller); + return Column( + mainAxisSize: .min, + children: [ + SeenByRow(event: events.first), + TypingIndicators(controller), + ], + ); } // Request history button or progress indicator: diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 434703c7..2daa4065 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -10,7 +10,6 @@ import 'package:swipe_to_action/swipe_to_action.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pages/chat/seen_by_row.dart'; import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/file_description.dart'; @@ -858,7 +857,6 @@ class Message extends StatelessWidget { child: MessageReactions(event, timeline), ), ), - SeenByRow(timeline: timeline, event: event), if (enterThread != null) AnimatedSize( duration: FluffyThemes.animationDuration, diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart index ef087dd3..62185a45 100644 --- a/lib/pages/chat/seen_by_row.dart +++ b/lib/pages/chat/seen_by_row.dart @@ -7,9 +7,8 @@ import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; class SeenByRow extends StatelessWidget { - final Timeline timeline; final Event event; - const SeenByRow({super.key, required this.timeline, required this.event}); + const SeenByRow({super.key, required this.event}); @override Widget build(BuildContext context) { @@ -17,9 +16,9 @@ class SeenByRow extends StatelessWidget { const maxAvatars = 7; return StreamBuilder( - stream: timeline.room.client.onSync.stream.where( + stream: event.room.client.onSync.stream.where( (syncUpdate) => - syncUpdate.rooms?.join?[timeline.room.id]?.ephemeral?.any( + syncUpdate.rooms?.join?[event.room.id]?.ephemeral?.any( (ephemeral) => ephemeral.type == 'm.receipt', ) ?? false, @@ -38,13 +37,15 @@ class SeenByRow extends StatelessWidget { ? Duration.zero : FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, - alignment: - timeline.events.isNotEmpty && - timeline.events.first.senderId == - Matrix.of(context).client.userID + alignment: event.senderId == Matrix.of(context).client.userID ? Alignment.topRight : Alignment.topLeft, - padding: const EdgeInsets.only(bottom: 4, top: 1), + padding: const EdgeInsets.only( + bottom: 4, + top: 1, + left: 8, + right: 8, + ), child: Wrap( spacing: 4, children: [ From c87e07843f538b1b3649c4c3fd23a44264bb7c13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 15 Feb 2026 13:25:09 +0100 Subject: [PATCH 031/333] chore: Follow up voice message button --- lib/pages/chat/chat_input_row.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index f6e1835d..d24b6e23 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -361,7 +361,7 @@ class ChatInputRow extends StatelessWidget { child: PlatformInfos.platformCanRecord && !controller.sendController.text.isNotEmpty || - controller.editEvent != null + controller.editEvent == null ? IconButton( tooltip: L10n.of(context).voiceMessage, onPressed: () => From 10a138bb6f24051d0b0a282f3d6256c9435d89e8 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 15 Feb 2026 20:50:20 +0100 Subject: [PATCH 032/333] chore: Follow up send button --- lib/pages/chat/chat_input_row.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index d24b6e23..d7afb895 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -360,7 +360,7 @@ class ChatInputRow extends StatelessWidget { alignment: Alignment.center, child: PlatformInfos.platformCanRecord && - !controller.sendController.text.isNotEmpty || + !controller.sendController.text.isNotEmpty && controller.editEvent == null ? IconButton( tooltip: L10n.of(context).voiceMessage, From ecd13b7efc3679b560b541548df53d1e06ba0760 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 15 Feb 2026 20:51:00 +0100 Subject: [PATCH 033/333] chore: Follow up seen by row --- lib/pages/chat/seen_by_row.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart index 62185a45..d6800883 100644 --- a/lib/pages/chat/seen_by_row.dart +++ b/lib/pages/chat/seen_by_row.dart @@ -24,7 +24,10 @@ class SeenByRow extends StatelessWidget { false, ), builder: (context, asyncSnapshot) { - final seenByUsers = event.receipts.map((r) => r.user).toList(); + final seenByUsers = event.receipts + .map((r) => r.user) + .where((user) => user.id != event.room.client.userID) + .toList(); return Container( width: double.infinity, alignment: Alignment.center, From fe51d22b26a433b6638fd5b9054649723ed7fe03 Mon Sep 17 00:00:00 2001 From: Vespe-r Date: Mon, 16 Feb 2026 12:09:44 +0000 Subject: [PATCH 034/333] fix: Add app id to TileLayer user agent --- lib/pages/chat/events/map_bubble.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/pages/chat/events/map_bubble.dart b/lib/pages/chat/events/map_bubble.dart index 4a2befae..a23dc7a8 100644 --- a/lib/pages/chat/events/map_bubble.dart +++ b/lib/pages/chat/events/map_bubble.dart @@ -3,6 +3,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; +import '../../../config/app_config.dart'; + class MapBubble extends StatelessWidget { final double latitude; final double longitude; @@ -43,6 +45,7 @@ class MapBubble extends StatelessWidget { minZoom: 0, urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: AppConfig.appId, subdomains: const ['a', 'b', 'c'], ), MarkerLayer( From 299174c9229a5eff853296cceebfa8f0f6896c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 16 Feb 2026 15:51:54 +0100 Subject: [PATCH 035/333] feat: Enable audio recording on web --- lib/pages/chat/recording_view_model.dart | 12 ++++-------- lib/utils/platform_infos.dart | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index 3898c489..65d7caa1 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -61,14 +61,10 @@ class RecordingViewModelState extends State { setState(() {}); try { - final codec = kIsWeb - // Web seems to create webm instead of ogg when using opus encoder - // which does not play on iOS right now. So we use wav for now: - ? AudioEncoder.wav - // Everywhere else we use opus if supported by the platform: - : !PlatformInfos - .isIOS && // Blocked by https://github.com/llfbandit/record/issues/560 - await audioRecorder.isEncoderSupported(AudioEncoder.opus) + final codec = + !PlatformInfos + .isIOS && // Blocked by https://github.com/llfbandit/record/issues/560 + await audioRecorder.isEncoderSupported(AudioEncoder.opus) ? AudioEncoder.opus : AudioEncoder.aacLc; fileName = diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index 620dce9a..36cd454c 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -34,7 +34,7 @@ abstract class PlatformInfos { !PlatformInfos.isWindows && !PlatformInfos.isLinux; /// Web could also record in theory but currently only wav which is too large - static bool get platformCanRecord => (isMobile || isMacOS); + static bool get platformCanRecord => (isMobile || isMacOS || isWeb); static String get clientName => '${AppSettings.applicationName.value} ${isWeb ? 'web' : Platform.operatingSystem}${kReleaseMode ? '' : 'Debug'}'; From 413352628ea830d26ea0f2e6b85d82e26a8f0a07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 16 Feb 2026 21:02:39 +0100 Subject: [PATCH 036/333] chore: Follow up recording on web --- lib/pages/chat/chat_input_row.dart | 59 +++++++++++++++++------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index d7afb895..0fd59bcd 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:flutter/material.dart'; import 'package:animations/animations.dart'; @@ -362,32 +363,40 @@ class ChatInputRow extends StatelessWidget { PlatformInfos.platformCanRecord && !controller.sendController.text.isNotEmpty && controller.editEvent == null - ? IconButton( - tooltip: L10n.of(context).voiceMessage, - onPressed: () => - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - margin: EdgeInsets.only( - bottom: height + 16, - left: 16, - right: 16, - top: 16, - ), - showCloseIcon: true, - content: Text( - L10n.of( - context, - ).longPressToRecordVoiceMessage, - ), - ), - ), - onLongPress: () => recordingViewModel - .startRecording(controller.room), - style: IconButton.styleFrom( - backgroundColor: theme.bubbleColor, - foregroundColor: theme.onBubbleColor, + ? HoverBuilder( + builder: (context, hovered) => IconButton( + tooltip: L10n.of(context).voiceMessage, + onPressed: hovered + ? () => recordingViewModel.startRecording( + controller.room, + ) + : () => ScaffoldMessenger.of(context) + .showSnackBar( + SnackBar( + margin: EdgeInsets.only( + bottom: height + 16, + left: 16, + right: 16, + top: 16, + ), + showCloseIcon: true, + content: Text( + L10n.of( + context, + ).longPressToRecordVoiceMessage, + ), + ), + ), + onLongPress: () => recordingViewModel + .startRecording(controller.room), + style: IconButton.styleFrom( + backgroundColor: theme.bubbleColor, + foregroundColor: theme.onBubbleColor, + ), + icon: Icon( + hovered ? Icons.mic : Icons.mic_none_outlined, + ), ), - icon: const Icon(Icons.mic_none_outlined), ) : IconButton( tooltip: L10n.of(context).send, From 6d5ceba8856e546759e878e9f5c065a44c34cbce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 18 Feb 2026 09:02:19 +0100 Subject: [PATCH 037/333] chore: Adjust design of space avatars and more --- lib/config/app_config.dart | 1 + lib/pages/chat/chat_app_bar_title.dart | 17 +------- lib/pages/chat/chat_input_row.dart | 2 +- lib/pages/chat_list/chat_list_header.dart | 9 +---- lib/pages/chat_list/chat_list_item.dart | 47 +++++++++++++++-------- lib/pages/chat_list/space_view.dart | 24 ++++++++---- lib/widgets/avatar.dart | 14 ++++--- lib/widgets/navigation_rail.dart | 13 +++++-- 8 files changed, 70 insertions(+), 57 deletions(-) diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index c5a332a0..e635e96c 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -18,6 +18,7 @@ abstract class AppConfig { static const String pushNotificationsChannelId = 'fluffychat_push'; static const String pushNotificationsAppId = 'chat.fluffy.fluffychat'; static const double borderRadius = 18.0; + static const double spaceBorderRadius = 11.0; static const double columnWidth = 360.0; static const String website = 'https://fluffy.chat'; diff --git a/lib/pages/chat/chat_app_bar_title.dart b/lib/pages/chat/chat_app_bar_title.dart index cce3a0d8..cbda4bc3 100644 --- a/lib/pages/chat/chat_app_bar_title.dart +++ b/lib/pages/chat/chat_app_bar_title.dart @@ -78,10 +78,7 @@ class ChatAppBarTitle extends StatelessWidget { builder: (context, presence) { final lastActiveTimestamp = presence?.lastActiveTimestamp; - final style = TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.outline, - ); + final style = TextStyle(fontSize: 11); if (presence?.currentlyActive == true) { return Text( L10n.of(context).currentlyActive, @@ -108,23 +105,13 @@ class ChatAppBarTitle extends StatelessWidget { child: CircularProgressIndicator.adaptive( strokeWidth: 1, value: status.progress, - valueColor: status.error != null - ? AlwaysStoppedAnimation( - Theme.of(context).colorScheme.error, - ) - : null, ), ), const SizedBox(width: 4), Expanded( child: Text( status.calcLocalizedString(context), - style: TextStyle( - fontSize: 12, - color: status.error != null - ? Theme.of(context).colorScheme.error - : null, - ), + style: TextStyle(fontSize: 12), ), ), ], diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 0fd59bcd..90173d23 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -1,4 +1,3 @@ -import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:flutter/material.dart'; import 'package:animations/animations.dart'; @@ -12,6 +11,7 @@ import 'package:fluffychat/pages/chat/recording_view_model.dart'; import 'package:fluffychat/utils/other_party_can_receive.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../config/themes.dart'; import 'chat.dart'; diff --git a/lib/pages/chat_list/chat_list_header.dart b/lib/pages/chat_list/chat_list_header.dart index b1b876fd..fa1b9ff1 100644 --- a/lib/pages/chat_list/chat_list_header.dart +++ b/lib/pages/chat_list/chat_list_header.dart @@ -59,9 +59,7 @@ class ChatListHeader extends StatelessWidget implements PreferredSizeWidget { ? L10n.of(context).searchChatsRooms : status.calcLocalizedString(context), hintStyle: TextStyle( - color: status.error != null - ? Colors.orange - : theme.colorScheme.onPrimaryContainer, + color: theme.colorScheme.onPrimaryContainer, fontWeight: FontWeight.normal, ), prefixIcon: hide @@ -87,11 +85,6 @@ class ChatListHeader extends StatelessWidget implements PreferredSizeWidget { child: CircularProgressIndicator.adaptive( strokeWidth: 2, value: status.progress, - valueColor: status.error != null - ? const AlwaysStoppedAnimation( - Colors.orange, - ) - : null, ), ), ), diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index fc9499cc..02ed40cf 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -92,14 +92,19 @@ class ChatListItem extends StatelessWidget { top: 0, left: 0, child: Avatar( - border: BorderSide( - width: 2, - color: - backgroundColor ?? - theme.colorScheme.surface, + shapeBorder: RoundedSuperellipseBorder( + side: BorderSide( + width: 2, + color: + backgroundColor ?? + theme.colorScheme.surface, + ), + borderRadius: BorderRadius.circular( + AppConfig.spaceBorderRadius * 0.75, + ), ), borderRadius: BorderRadius.circular( - AppConfig.borderRadius / 4, + AppConfig.spaceBorderRadius * 0.75, ), mxContent: space.avatar, size: Avatar.defaultSize * 0.75, @@ -111,22 +116,32 @@ class ChatListItem extends StatelessWidget { bottom: 0, right: 0, child: Avatar( - border: space == null + shapeBorder: space == null ? room.isSpace - ? BorderSide( - width: 1, - color: theme.dividerColor, + ? RoundedSuperellipseBorder( + side: BorderSide( + width: 1, + color: theme.dividerColor, + ), + borderRadius: BorderRadius.circular( + AppConfig.spaceBorderRadius, + ), ) : null - : BorderSide( - width: 2, - color: - backgroundColor ?? - theme.colorScheme.surface, + : RoundedRectangleBorder( + side: BorderSide( + width: 2, + color: + backgroundColor ?? + theme.colorScheme.surface, + ), + borderRadius: BorderRadius.circular( + Avatar.defaultSize, + ), ), borderRadius: room.isSpace ? BorderRadius.circular( - AppConfig.borderRadius / 4, + AppConfig.spaceBorderRadius, ) : null, mxContent: room.avatar, diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index 0295069a..a2209600 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -403,8 +403,11 @@ class _SpaceViewState extends State { size: avatarSize, mxContent: room?.avatar, name: displayname, - border: BorderSide(width: 1, color: theme.dividerColor), - borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + shapeBorder: RoundedSuperellipseBorder( + side: BorderSide(width: 1, color: theme.dividerColor), + borderRadius: BorderRadius.circular(AppConfig.spaceBorderRadius), + ), + borderRadius: BorderRadius.circular(AppConfig.spaceBorderRadius), ), title: Text( displayname, @@ -637,11 +640,18 @@ class _SpaceViewState extends State { textColor: item.name?.darkColor ?? theme.colorScheme.onSurface, - border: item.roomType == 'm.space' - ? BorderSide( - color: theme - .colorScheme - .surfaceContainerHighest, + shapeBorder: item.roomType == 'm.space' + ? RoundedSuperellipseBorder( + side: BorderSide( + color: theme + .colorScheme + .surfaceContainerHighest, + ), + borderRadius: + BorderRadius.circular( + AppConfig.borderRadius / + 4, + ), ) : null, borderRadius: item.roomType == 'm.space' diff --git a/lib/widgets/avatar.dart b/lib/widgets/avatar.dart index b1e9637c..baf20ffb 100644 --- a/lib/widgets/avatar.dart +++ b/lib/widgets/avatar.dart @@ -17,7 +17,7 @@ class Avatar extends StatelessWidget { final Color? presenceBackgroundColor; final BorderRadius? borderRadius; final IconData? icon; - final BorderSide? border; + final ShapeBorder? shapeBorder; final Color? backgroundColor; final Color? textColor; @@ -30,7 +30,7 @@ class Avatar extends StatelessWidget { this.presenceUserId, this.presenceBackgroundColor, this.borderRadius, - this.border, + this.shapeBorder, this.icon, this.backgroundColor, this.textColor, @@ -61,10 +61,12 @@ class Avatar extends StatelessWidget { color: theme.brightness == Brightness.light ? Colors.white : Colors.black, - shape: RoundedRectangleBorder( - borderRadius: borderRadius, - side: border ?? BorderSide.none, - ), + shape: + shapeBorder ?? + RoundedSuperellipseBorder( + borderRadius: borderRadius, + side: BorderSide.none, + ), clipBehavior: Clip.antiAlias, child: MxcImage( client: client, diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index a287f608..b1671700 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -96,12 +96,17 @@ class SpacesNavigationRail extends StatelessWidget { icon: Avatar( mxContent: allSpaces[i].avatar, name: displayname, - border: BorderSide( - width: 1, - color: Theme.of(context).dividerColor, + shapeBorder: RoundedSuperellipseBorder( + side: BorderSide( + width: 1, + color: Theme.of(context).dividerColor, + ), + borderRadius: BorderRadius.circular( + AppConfig.spaceBorderRadius, + ), ), borderRadius: BorderRadius.circular( - AppConfig.borderRadius / 2, + AppConfig.spaceBorderRadius, ), ), ); From b4fbe46d4367b1a75bd4c08f4a97d6cfffbc1c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 18 Feb 2026 15:57:42 +0100 Subject: [PATCH 038/333] chore: Adjust join space child UX --- lib/l10n/intl_en.arb | 3 ++- lib/pages/chat_list/space_view.dart | 36 ++++++++++++++++------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index d90ff8b3..b455b035 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -3496,5 +3496,6 @@ "signUpGreeting": "FluffyChat is decentralized! Select a server where you want to create your account and let's go!", "signInGreeting": "You already have an account in Matrix? Welcome back! Select your homeserver and sign in.", "appIntro": "With FluffyChat you can chat with your friends. It's a secure decentralized [matrix] messenger! Learn more on https://matrix.org if you like or just sign up.", - "theProcessWasCanceled": "The process was canceled." + "theProcessWasCanceled": "The process was canceled.", + "join": "Join" } diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index a2209600..719fa2fb 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -15,7 +15,6 @@ import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/utils/string_color.dart'; -import 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; @@ -131,19 +130,20 @@ class _SpaceViewState extends State { void _joinChildRoom(SpaceRoomsChunk$2 item) async { final client = Matrix.of(context).client; final space = client.getRoomById(widget.spaceId); - - final joined = await showAdaptiveDialog( + final via = space?.spaceChildren + .firstWhereOrNull((child) => child.roomId == item.roomId) + ?.via; + final roomResult = await showFutureLoadingDialog( context: context, - builder: (_) => PublicRoomDialog( - chunk: item, - via: space?.spaceChildren - .firstWhereOrNull((child) => child.roomId == item.roomId) - ?.via, - ), + future: () async { + final waitForRoom = client.waitForRoomInSync(item.roomId, join: true); + await client.joinRoom(item.roomId, via: via); + await waitForRoom; + return client.getRoomById(item.roomId)!; + }, ); - if (mounted && joined == true) { - setState(() {}); - } + final room = roomResult.result; + if (room != null) widget.onChatTab(room); } void _onSpaceAction(SpaceActions action) async { @@ -597,12 +597,13 @@ class _SpaceViewState extends State { visualDensity: const VisualDensity( vertical: -0.5, ), - contentPadding: const EdgeInsets.symmetric( - horizontal: 8, + contentPadding: EdgeInsets.only( + left: 8, + right: joinedRoom == null ? 0 : 8, ), onTap: joinedRoom != null ? () => widget.onChatTab(joinedRoom!) - : () => _joinChildRoom(item), + : null, onLongPress: isAdmin ? () => _showSpaceChildEditMenu( context, @@ -675,7 +676,10 @@ class _SpaceViewState extends State { if (joinedRoom != null) UnreadBubble(room: joinedRoom) else - const Icon(Icons.chevron_right_outlined), + TextButton( + onPressed: () => _joinChildRoom(item), + child: Text(L10n.of(context).join), + ), ], ), ), From 1896c56544a1a417f0a2a9850979afa21f986578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 18 Feb 2026 16:10:23 +0100 Subject: [PATCH 039/333] chore: Add code lint check for unused code --- .github/workflows/integrate.yaml | 3 + lib/config/app_emojis.dart | 30 ------- lib/pages/chat/add_widget_tile.dart | 85 ------------------- lib/pages/chat/add_widget_tile_view.dart | 73 ----------------- lib/pages/chat_details/chat_details.dart | 2 - lib/pages/chat_list/chat_list.dart | 11 --- lib/pages/chat_list/chat_list_item.dart | 2 - lib/utils/background_push.dart | 4 - lib/widgets/avatar_page_header.dart | 100 ----------------------- lib/widgets/error_widget.dart | 45 ---------- pubspec.lock | 32 ++++++++ pubspec.yaml | 1 + 12 files changed, 36 insertions(+), 352 deletions(-) delete mode 100644 lib/config/app_emojis.dart delete mode 100644 lib/pages/chat/add_widget_tile.dart delete mode 100644 lib/pages/chat/add_widget_tile_view.dart delete mode 100644 lib/widgets/avatar_page_header.dart delete mode 100644 lib/widgets/error_widget.dart diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 9c8cbbb6..35d8d55f 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -29,6 +29,9 @@ jobs: run: ./scripts/add-firebase-messaging.sh - run: flutter analyze - run: flutter test + - run: dart run dart_code_linter:metrics check-unused-code lib + - run: dart run dart_code_linter:metrics check-unused-files lib + - run: dart run dart_code_linter:metrics check-unused-l10n lib build_debug_apk: runs-on: ubuntu-latest diff --git a/lib/config/app_emojis.dart b/lib/config/app_emojis.dart deleted file mode 100644 index 3c38e2fa..00000000 --- a/lib/config/app_emojis.dart +++ /dev/null @@ -1,30 +0,0 @@ -abstract class AppEmojis { - static const List emojis = [ - '👍', - '😊', - '😀', - '❤️', - '😍', - '😘', - '😇', - '😅', - '😭', - '😜', - '😱', - '😆', - '😉', - '😡', - '👋', - '🤔', - '🙁', - '🥳', - '😟', - '😄', - '😁', - '🙄', - '😂', - '🤣', - '😌', - '😬', - ]; -} diff --git a/lib/pages/chat/add_widget_tile.dart b/lib/pages/chat/add_widget_tile.dart deleted file mode 100644 index 88a4022d..00000000 --- a/lib/pages/chat/add_widget_tile.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pages/chat/add_widget_tile_view.dart'; - -class AddWidgetTile extends StatefulWidget { - final Room room; - - const AddWidgetTile({super.key, required this.room}); - - @override - State createState() => AddWidgetTileState(); -} - -class AddWidgetTileState extends State { - final TextEditingController urlController = TextEditingController(); - final TextEditingController nameController = TextEditingController(); - String widgetType = 'm.etherpad'; - - late final bool initiallyExpanded; - - String? nameError; - String? urlError; - - @override - void initState() { - initiallyExpanded = widget.room.widgets.isEmpty; - super.initState(); - } - - void setWidgetType(String value) => setState(() => widgetType = value); - - void addWidget() { - try { - nameError = null; - urlError = null; - - final room = widget.room; - final name = nameController.text; - final uri = Uri.tryParse(urlController.text); - - if (name.length < 3) { - setState(() { - nameError = L10n.of(context).widgetNameError; - }); - return; - } - - if (uri == null || uri.scheme != 'https') { - setState(() { - urlError = L10n.of(context).widgetUrlError; - }); - return; - } - setState(() {}); - - late MatrixWidget matrixWidget; - switch (widgetType) { - case 'm.etherpad': - matrixWidget = MatrixWidget.etherpad(room, name, uri); - break; - case 'm.jitsi': - matrixWidget = MatrixWidget.jitsi(room, name, uri); - break; - case 'm.video': - matrixWidget = MatrixWidget.video(room, name, uri); - break; - default: - matrixWidget = MatrixWidget.custom(room, name, uri); - break; - } - widget.room.addWidget(matrixWidget); - Navigator.of(context).pop(); - } catch (e) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).errorAddingWidget)), - ); - } - } - - @override - Widget build(BuildContext context) => AddWidgetTileView(controller: this); -} diff --git a/lib/pages/chat/add_widget_tile_view.dart b/lib/pages/chat/add_widget_tile_view.dart deleted file mode 100644 index c69968d6..00000000 --- a/lib/pages/chat/add_widget_tile_view.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pages/chat/add_widget_tile.dart'; - -class AddWidgetTileView extends StatelessWidget { - final AddWidgetTileState controller; - - const AddWidgetTileView({super.key, required this.controller}); - - @override - Widget build(BuildContext context) { - return ExpansionTile( - title: Text(L10n.of(context).addWidget), - leading: const Icon(Icons.add), - initiallyExpanded: controller.initiallyExpanded, - children: [ - CupertinoSegmentedControl( - groupValue: controller.widgetType, - padding: const EdgeInsets.all(8), - children: - { - 'm.etherpad': Text(L10n.of(context).widgetEtherpad), - 'm.jitsi': Text(L10n.of(context).widgetJitsi), - 'm.video': Text(L10n.of(context).widgetVideo), - 'm.custom': Text(L10n.of(context).widgetCustom), - }.map( - (key, value) => MapEntry( - key, - Padding( - padding: const EdgeInsets.symmetric(horizontal: 4.0), - child: value, - ), - ), - ), - onValueChanged: controller.setWidgetType, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: TextField( - controller: controller.nameController, - autofocus: true, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.label), - label: Text(L10n.of(context).widgetName), - errorText: controller.nameError, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: TextField( - controller: controller.urlController, - decoration: InputDecoration( - prefixIcon: const Icon(Icons.add_link), - label: Text(L10n.of(context).link), - errorText: controller.urlError, - ), - ), - ), - OverflowBar( - children: [ - TextButton( - onPressed: controller.addWidget, - child: Text(L10n.of(context).addWidget), - ), - ], - ), - ], - ); - } -} diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index 69dda16e..ad2fa8dc 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -16,8 +16,6 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart' import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; -enum AliasActions { copy, delete, setCanonical } - class ChatDetails extends StatefulWidget { final String roomId; final Widget? embeddedCloseButton; diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 01e3e009..45e63851 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -29,15 +29,6 @@ import '../../config/setting_keys.dart'; import '../../utils/url_launcher.dart'; import '../../widgets/matrix.dart'; -enum PopupMenuAction { - settings, - invite, - newGroup, - newSpace, - setStatus, - archive, -} - enum ActiveFilter { allChats, messages, groups, unread, spaces } extension LocalizedActiveFilter on ActiveFilter { @@ -879,8 +870,6 @@ class ChatListController extends State enum EditBundleAction { addToBundle, removeFromBundle } -enum InviteActions { accept, decline, block } - enum ChatContextAction { open, goToSpace, diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index 02ed40cf..eb0e5700 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -14,8 +14,6 @@ import '../../config/themes.dart'; import '../../utils/date_time_extension.dart'; import '../../widgets/avatar.dart'; -enum ArchivedRoomAction { delete, rejoin } - class ChatListItem extends StatelessWidget { final Room room; final Room? space; diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 85651de3..776af782 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -45,10 +45,6 @@ import 'platform_infos.dart'; //import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; -class NoTokenException implements Exception { - String get cause => 'Cannot get firebase token'; -} - class BackgroundPush { static BackgroundPush? _instance; final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = diff --git a/lib/widgets/avatar_page_header.dart b/lib/widgets/avatar_page_header.dart deleted file mode 100644 index bff0d388..00000000 --- a/lib/widgets/avatar_page_header.dart +++ /dev/null @@ -1,100 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:fluffychat/config/themes.dart'; - -class AvatarPageHeader extends StatelessWidget { - final Widget avatar; - final void Function()? onAvatarEdit; - final Widget? textButtonLeft, textButtonRight; - final List iconButtons; - - const AvatarPageHeader({ - super.key, - required this.avatar, - this.onAvatarEdit, - this.iconButtons = const [], - this.textButtonLeft, - this.textButtonRight, - }); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final onAvatarEdit = this.onAvatarEdit; - return Center( - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: FluffyThemes.columnWidth), - child: Column( - mainAxisSize: .min, - crossAxisAlignment: .center, - spacing: 8.0, - children: [ - Stack( - children: [ - avatar, - if (onAvatarEdit != null) - Positioned( - bottom: 0, - right: 0, - child: FloatingActionButton.small( - elevation: 2, - onPressed: onAvatarEdit, - heroTag: null, - child: const Icon(Icons.camera_alt_outlined), - ), - ), - ], - ), - TextButtonTheme( - data: TextButtonThemeData( - style: TextButton.styleFrom( - disabledForegroundColor: theme.colorScheme.onSurface, - foregroundColor: theme.colorScheme.onSurface, - textStyle: const TextStyle(fontWeight: FontWeight.normal), - ), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: LayoutBuilder( - builder: (context, constraints) { - return Row( - mainAxisAlignment: .center, - children: [ - ConstrainedBox( - constraints: BoxConstraints( - maxWidth: constraints.maxWidth / 2, - ), - child: textButtonLeft, - ), - ConstrainedBox( - constraints: BoxConstraints( - maxWidth: constraints.maxWidth / 2, - ), - child: textButtonRight, - ), - ], - ); - }, - ), - ), - ), - IconButtonTheme( - data: IconButtonThemeData( - style: IconButton.styleFrom( - backgroundColor: theme.colorScheme.surfaceContainer, - iconSize: 24, - padding: const EdgeInsets.all(16), - ), - ), - child: Row( - mainAxisAlignment: .spaceEvenly, - children: iconButtons, - ), - ), - const SizedBox(height: 0.0), - ], - ), - ), - ); - } -} diff --git a/lib/widgets/error_widget.dart b/lib/widgets/error_widget.dart deleted file mode 100644 index 7e786d46..00000000 --- a/lib/widgets/error_widget.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:fluffychat/utils/error_reporter.dart'; - -class FluffyChatErrorWidget extends StatefulWidget { - final FlutterErrorDetails details; - const FluffyChatErrorWidget(this.details, {super.key}); - - @override - State createState() => _FluffyChatErrorWidgetState(); -} - -class _FluffyChatErrorWidgetState extends State { - static final Set knownExceptions = {}; - @override - void initState() { - super.initState(); - - if (knownExceptions.contains(widget.details.exception.toString())) { - return; - } - knownExceptions.add(widget.details.exception.toString()); - WidgetsBinding.instance.addPostFrameCallback((_) { - ErrorReporter( - context, - 'Error Widget', - ).onErrorCallback(widget.details.exception, widget.details.stack); - }); - } - - @override - Widget build(BuildContext context) { - return Material( - color: Colors.orange, - child: Placeholder( - child: Center( - child: Material( - color: Colors.white.withAlpha(230), - borderRadius: BorderRadius.circular(8), - ), - ), - ), - ); - } -} diff --git a/pubspec.lock b/pubspec.lock index 29662f46..1f5fde69 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -17,6 +17,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.4.1" + analyzer_plugin: + dependency: transitive + description: + name: analyzer_plugin + sha256: "825071d553c4aef2252196d46a665fbd8e0cb06de07725f25d1b29bd18d65fff" + url: "https://pub.dev" + source: hosted + version: "0.13.6" animations: dependency: "direct main" description: @@ -273,6 +281,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dart_code_linter: + dependency: "direct dev" + description: + name: dart_code_linter + sha256: "1b53722d9933a5f5d4580acc29c7f16b1fde66d21d1ecf7bb2a811caf3a42b42" + url: "https://pub.dev" + source: hosted + version: "3.2.1" dart_earcut: dependency: transitive description: @@ -289,6 +305,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b + url: "https://pub.dev" + source: hosted + version: "3.1.3" dart_webrtc: dependency: transitive description: @@ -1364,6 +1388,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + pub_updater: + dependency: transitive + description: + name: pub_updater + sha256: "739a0161d73a6974c0675b864fb0cf5147305f7b077b7f03a58fa7a9ab3e7e7d" + url: "https://pub.dev" + source: hosted + version: "0.5.0" pubspec_parse: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f8110a79..9fd3fc71 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -85,6 +85,7 @@ dependencies: webrtc_interface: ^1.3.0 dev_dependencies: + dart_code_linter: ^3.2.1 flutter_lints: ^6.0.0 flutter_native_splash: ^2.4.7 flutter_test: From e852453dec058ab67fcf5fad2b345c987e13c892 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Wed, 18 Feb 2026 16:58:51 +0100 Subject: [PATCH 040/333] chore: Adjust avatar size and chat list item design --- lib/pages/chat_list/chat_list_item.dart | 20 ++------------------ lib/pages/chat_list/unread_bubble.dart | 2 +- lib/widgets/avatar.dart | 2 +- 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index eb0e5700..10f07a80 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -42,7 +42,6 @@ class ChatListItem extends StatelessWidget { final typingText = room.getLocalizedTypingText(context); final lastEvent = room.lastEvent; final ownMessage = lastEvent?.senderId == room.client.userID; - final unread = room.isUnread; final directChatMatrixId = room.directChatMatrixID; final isDirectChat = directChatMatrixId != null; final hasNotifications = room.notificationCount > 0; @@ -185,11 +184,6 @@ class ChatListItem extends StatelessWidget { maxLines: 1, overflow: TextOverflow.ellipsis, softWrap: false, - style: TextStyle( - fontWeight: unread || room.hasNewMessages - ? FontWeight.w500 - : null, - ), ), ), if (isMuted) @@ -215,10 +209,7 @@ class ChatListItem extends StatelessWidget { room.latestEventReceivedTime.localizedTimeShort( context, ), - style: TextStyle( - fontSize: 12, - color: theme.colorScheme.outline, - ), + style: TextStyle(fontSize: 11), ), ), ], @@ -276,10 +267,7 @@ class ChatListItem extends StatelessWidget { const SizedBox(width: 4), Text( L10n.of(context).thread, - style: TextStyle( - fontSize: 12, - color: theme.colorScheme.outline, - ), + style: TextStyle(fontSize: 11), ), ], ), @@ -292,7 +280,6 @@ class ChatListItem extends StatelessWidget { L10n.of( context, ).countChats(room.spaceChildren.length), - style: TextStyle(color: theme.colorScheme.outline), ) : typingText.isNotEmpty ? Text( @@ -347,9 +334,6 @@ class ChatListItem extends StatelessWidget { maxLines: room.notificationCount >= 1 ? 2 : 1, overflow: TextOverflow.ellipsis, style: TextStyle( - color: unread || room.hasNewMessages - ? theme.colorScheme.onSurface - : theme.colorScheme.outline, decoration: room.lastEvent?.redacted == true ? TextDecoration.lineThrough : null, diff --git a/lib/pages/chat_list/unread_bubble.dart b/lib/pages/chat_list/unread_bubble.dart index ba1344db..9dfd9249 100644 --- a/lib/pages/chat_list/unread_bubble.dart +++ b/lib/pages/chat_list/unread_bubble.dart @@ -48,7 +48,7 @@ class UnreadBubble extends StatelessWidget { fontSize: 13, fontWeight: FontWeight.w500, ), - textAlign: TextAlign.center, + textAlign: .center, ) : const SizedBox.shrink(), ); diff --git a/lib/widgets/avatar.dart b/lib/widgets/avatar.dart index baf20ffb..d78a2fcd 100644 --- a/lib/widgets/avatar.dart +++ b/lib/widgets/avatar.dart @@ -11,7 +11,7 @@ class Avatar extends StatelessWidget { final String? name; final double size; final void Function()? onTap; - static const double defaultSize = 44; + static const double defaultSize = 48; final Client? client; final String? presenceUserId; final Color? presenceBackgroundColor; From 83812810863fd83e29874d214d2961fc69aabb1f Mon Sep 17 00:00:00 2001 From: krille-chan Date: Wed, 18 Feb 2026 17:03:48 +0100 Subject: [PATCH 041/333] build: Upgrade to flutter 3.41.1 --- .github/workflows/versions.env | 2 +- lib/pages/chat/chat_app_bar_list_tile.dart | 4 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 - pubspec.lock | 304 ++++++++++-------- snap/snapcraft.yaml | 2 +- 5 files changed, 168 insertions(+), 146 deletions(-) diff --git a/.github/workflows/versions.env b/.github/workflows/versions.env index 6d4ca00e..3bda5706 100644 --- a/.github/workflows/versions.env +++ b/.github/workflows/versions.env @@ -1,2 +1,2 @@ -FLUTTER_VERSION=3.38.8 +FLUTTER_VERSION=3.41.1 JAVA_VERSION=17 diff --git a/lib/pages/chat/chat_app_bar_list_tile.dart b/lib/pages/chat/chat_app_bar_list_tile.dart index a1fc21b4..0f038a89 100644 --- a/lib/pages/chat/chat_app_bar_list_tile.dart +++ b/lib/pages/chat/chat_app_bar_list_tile.dart @@ -31,7 +31,7 @@ class ChatAppBarListTile extends StatelessWidget { onTap: onTap, child: Row( children: [ - if (leading != null) leading, + ?leading, Expanded( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 4.0), @@ -56,7 +56,7 @@ class ChatAppBarListTile extends StatelessWidget { ), ), ), - if (trailing != null) trailing, + ?trailing, ], ), ), diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 03f1fc53..0e1ab0ca 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -22,7 +22,6 @@ import flutter_webrtc import geolocator_apple import just_audio import package_info_plus -import path_provider_foundation import record_macos import screen_retriever_macos import share_plus @@ -54,7 +53,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 1f5fde69..f18e1f45 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -77,10 +77,10 @@ packages: dependency: "direct main" description: name: archive - sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff url: "https://pub.dev" source: hosted - version: "4.0.7" + version: "4.0.9" args: dependency: transitive description: @@ -101,10 +101,10 @@ packages: dependency: transitive description: name: audio_session - sha256: "2b7fff16a552486d078bfc09a8cde19f426dc6d6329262b684182597bec5b1ac" + sha256: "8f96a7fecbb718cb093070f868b4cdcb8a9b1053dce342ff8ab2fde10eb9afb7" url: "https://pub.dev" source: hosted - version: "0.1.25" + version: "0.2.2" badges: dependency: "direct main" description: @@ -149,10 +149,10 @@ packages: dependency: transitive description: name: build_cli_annotations - sha256: b59d2769769efd6c9ff6d4c4cede0be115a566afc591705c2040b707534b1172 + sha256: e563c2e01de8974566a1998410d3f6f03521788160a02503b0b1f1a46c7b3d95 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" canonical_json: dependency: transitive description: @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" charcode: dependency: transitive description: @@ -181,10 +181,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" chewie: dependency: "direct main" description: @@ -217,6 +217,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" collection: dependency: "direct main" description: @@ -253,18 +261,18 @@ packages: dependency: "direct main" description: name: cross_file - sha256: "942a4791cd385a68ccb3b32c71c427aba508a1bb949b86dff2adbe4049f16239" + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.3.5+2" crypto: dependency: transitive description: name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" csslib: dependency: transitive description: @@ -325,10 +333,10 @@ packages: dependency: transitive description: name: dbus - sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 url: "https://pub.dev" source: hosted - version: "0.7.11" + version: "0.7.12" desktop_drop: dependency: "direct main" description: @@ -397,10 +405,10 @@ packages: dependency: transitive description: name: ffi - sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" file: dependency: transitive description: @@ -429,18 +437,18 @@ packages: dependency: transitive description: name: file_selector_android - sha256: "6bba3d590ee9462758879741abc132a19133600dd31832f55627442f1ebd7b54" + sha256: "51e8fd0446de75e4b62c065b76db2210c704562d072339d333bd89c57a7f8a7c" url: "https://pub.dev" source: hosted - version: "0.5.1+14" + version: "0.5.2+4" file_selector_ios: dependency: transitive description: name: file_selector_ios - sha256: "94b98ad950b8d40d96fee8fa88640c2e4bd8afcdd4817993bd04e20310f45420" + sha256: e2ecf2885c121691ce13b60db3508f53c01f869fb6e8dc5c1cfa771e4c46aeca url: "https://pub.dev" source: hosted - version: "0.5.3+1" + version: "0.5.3+5" file_selector_linux: dependency: transitive description: @@ -477,10 +485,10 @@ packages: dependency: transitive description: name: file_selector_windows - sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" url: "https://pub.dev" source: hosted - version: "0.9.3+4" + version: "0.9.3+5" fixnum: dependency: transitive description: @@ -588,10 +596,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e + sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1 url: "https://pub.dev" source: hosted - version: "2.0.28" + version: "2.0.33" flutter_rust_bridge: dependency: transitive description: @@ -823,6 +831,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.0" + hooks: + dependency: transitive + description: + name: hooks + sha256: "7a08a0d684cb3b8fb604b78455d5d352f502b68079f7b80b831c62220ab0a4f6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" html: dependency: "direct main" description: @@ -867,10 +883,10 @@ packages: dependency: "direct main" description: name: image - sha256: "492bd52f6c4fbb6ee41f781ff27765ce5f627910e1e0cbecfa3d9add5562604c" + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce url: "https://pub.dev" source: hosted - version: "4.7.2" + version: "4.8.0" image_picker: dependency: "direct main" description: @@ -883,26 +899,26 @@ packages: dependency: transitive description: name: image_picker_android - sha256: e83b2b05141469c5e19d77e1dfa11096b6b1567d09065b2265d7c6904560050c + sha256: "518a16108529fc18657a3e6dde4a043dc465d16596d20ab2abd49a4cac2e703d" url: "https://pub.dev" source: hosted - version: "0.8.13" + version: "0.8.13+13" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 url: "https://pub.dev" source: hosted - version: "0.8.13" + version: "0.8.13+6" image_picker_linux: dependency: transitive description: @@ -915,18 +931,18 @@ packages: dependency: transitive description: name: image_picker_macos - sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04 + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.2.2+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665" + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.11.1" image_picker_windows: dependency: transitive description: @@ -968,18 +984,18 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.2" json_annotation: dependency: transitive description: name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + sha256: "805fa86df56383000f640384b282ce0cb8431f1a7a2396de92fb66186d8c57df" url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.10.0" just_audio: dependency: "direct main" description: @@ -1016,10 +1032,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "11.0.1" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: @@ -1056,10 +1072,10 @@ packages: dependency: transitive description: name: lints - sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.1.0" lists: dependency: transitive description: @@ -1072,10 +1088,10 @@ packages: dependency: transitive description: name: logger - sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1 + sha256: a7967e31b703831a893bbc3c3dd11db08126fe5f369b5c648a36f821979f5be3 url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.6.2" logging: dependency: transitive description: @@ -1096,18 +1112,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.18" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" matrix: dependency: "direct main" description: @@ -1140,6 +1156,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "89e83885ba09da5fdf2cdacc8002a712ca238c28b7f717910b34bcd27b0d03ac" + url: "https://pub.dev" + source: hosted + version: "0.17.4" nested: dependency: transitive description: @@ -1156,6 +1180,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.2" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" opus_caf_converter_dart: dependency: "direct main" description: @@ -1192,10 +1224,10 @@ packages: dependency: transitive description: name: pana - sha256: eb816d35b80d3880335c3f2d139b376e81fd98a9ea273faf39f2c8914c4afba5 + sha256: d7bd85f18a14909f0baab69a13895dc4ff163be51c9884f73a506982adeac57d url: "https://pub.dev" source: hosted - version: "0.23.3" + version: "0.23.10" particles_network: dependency: "direct main" description: @@ -1224,18 +1256,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e url: "https://pub.dev" source: hosted - version: "2.2.17" + version: "2.2.22" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.6.0" path_provider_linux: dependency: transitive description: @@ -1312,10 +1344,10 @@ packages: dependency: transitive description: name: petitparser - sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.0.2" platform: dependency: transitive description: @@ -1336,10 +1368,10 @@ packages: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" url: "https://pub.dev" source: hosted - version: "1.5.1" + version: "1.5.2" posix: dependency: transitive description: @@ -1360,10 +1392,10 @@ packages: dependency: transitive description: name: process - sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d" + sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744 url: "https://pub.dev" source: hosted - version: "5.0.3" + version: "5.0.5" proj4dart: dependency: transitive description: @@ -1456,58 +1488,58 @@ packages: dependency: "direct main" description: name: record - sha256: "6bad72fb3ea6708d724cf8b6c97c4e236cf9f43a52259b654efeb6fd9b737f1f" + sha256: d5b6b334f3ab02460db6544e08583c942dbf23e3504bf1e14fd4cbe3d9409277 url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.2.0" record_android: dependency: transitive description: name: record_android - sha256: fb54ee4e28f6829b8c580252a9ef49d9c549cfd263b0660ad7eeac0908658e9f + sha256: "94783f08403aed33ffb68797bf0715b0812eb852f3c7985644c945faea462ba1" url: "https://pub.dev" source: hosted - version: "1.4.4" + version: "1.5.1" record_ios: dependency: transitive description: name: record_ios - sha256: "765b42ac1be019b1674ddd809b811fc721fe5a93f7bb1da7803f0d16772fd6d7" + sha256: "8df7c136131bd05efc19256af29b2ba6ccc000ccc2c80d4b6b6d7a8d21a3b5a9" url: "https://pub.dev" source: hosted - version: "1.1.4" + version: "1.2.0" record_linux: dependency: transitive description: name: record_linux - sha256: "235b1f1fb84e810f8149cc0c2c731d7d697f8d1c333b32cb820c449bf7bb72d8" + sha256: c31a35cc158cd666fc6395f7f56fc054f31685571684be6b97670a27649ce5c7 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" record_macos: dependency: transitive description: name: record_macos - sha256: "842ea4b7e95f4dd237aacffc686d1b0ff4277e3e5357865f8d28cd28bc18ed95" + sha256: "084902e63fc9c0c224c29203d6c75f0bdf9b6a40536c9d916393c8f4c4256488" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.1" record_platform_interface: dependency: transitive description: name: record_platform_interface - sha256: b0065fdf1ec28f5a634d676724d388a77e43ce7646fb049949f58c69f3fcb4ed + sha256: "8a81dbc4e14e1272a285bbfef6c9136d070a47d9b0d1f40aa6193516253ee2f6" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0" record_web: dependency: transitive description: name: record_web - sha256: "4f0adf20c9ccafcc02d71111fd91fba1ca7b17a7453902593e5a9b25b74a5c56" + sha256: "7e9846981c1f2d111d86f0ae3309071f5bba8b624d1c977316706f08fc31d16d" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" record_windows: dependency: transitive description: @@ -1624,18 +1656,18 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" + sha256: cbc40be9be1c5af4dab4d6e0de4d5d3729e6f3d65b89d21e1815d57705644a6f url: "https://pub.dev" source: hosted - version: "2.4.10" + version: "2.4.20" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.6" shared_preferences_linux: dependency: transitive description: @@ -1733,26 +1765,18 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" url: "https://pub.dev" source: hosted - version: "1.10.1" - sprintf: - dependency: transitive - description: - name: sprintf - sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.dev" - source: hosted - version: "7.0.0" + version: "1.10.2" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" + sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" url: "https://pub.dev" source: hosted - version: "2.5.5" + version: "2.5.6" sqflite_common_ffi: dependency: "direct main" description: @@ -1829,10 +1853,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" + sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 url: "https://pub.dev" source: hosted - version: "3.3.1" + version: "3.4.0" term_glyph: dependency: transitive description: @@ -1845,26 +1869,26 @@ packages: dependency: transitive description: name: test - sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" url: "https://pub.dev" source: hosted - version: "1.26.3" + version: "1.29.0" test_api: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.9" test_core: dependency: transitive description: name: test_core - sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" + sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" url: "https://pub.dev" source: hosted - version: "0.6.12" + version: "0.6.15" timezone: dependency: transitive description: @@ -1917,10 +1941,10 @@ packages: dependency: transitive description: name: unifiedpush_android - sha256: "556796c81e8151ee8e4275baea2f7191119e8b1412ec35523cc2ac1c44c348bf" + sha256: "2e6684e0a1a39ad8d6c7bc0d197954d50686acb1b1a7614b18ab0e0126f5492a" url: "https://pub.dev" source: hosted - version: "3.4.0" + version: "3.4.1" unifiedpush_linux: dependency: transitive description: @@ -1997,34 +2021,34 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" url: "https://pub.dev" source: hosted - version: "6.3.16" + version: "6.3.28" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" url: "https://pub.dev" source: hosted - version: "6.3.3" + version: "6.4.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" url: "https://pub.dev" source: hosted - version: "3.2.2" + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: @@ -2037,26 +2061,26 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" uuid: dependency: transitive description: name: uuid - sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 url: "https://pub.dev" source: hosted - version: "4.5.1" + version: "4.5.2" vector_math: dependency: transitive description: @@ -2077,50 +2101,50 @@ packages: dependency: "direct main" description: name: video_player - sha256: "096bc28ce10d131be80dfb00c223024eb0fba301315a406728ab43dd99c45bdf" + sha256: "08bfba72e311d48219acad4e191b1f9c27ff8cf928f2c7234874592d9c9d7341" url: "https://pub.dev" source: hosted - version: "2.10.1" + version: "2.11.0" video_player_android: dependency: transitive description: name: video_player_android - sha256: "28dcc4122079f40f93a0965b3679aff1a5f4251cf79611bd8011f937eb6b69de" + sha256: e726b33894526cf96a3eefe61af054b0c3e7d254443b3695b3c142dc277291be url: "https://pub.dev" source: hosted - version: "2.8.4" + version: "2.9.3" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: "9ee764e5cd2fc1e10911ae8ad588e1a19db3b6aa9a6eb53c127c42d3a3c3f22f" + sha256: f93b93a3baa12ca0ff7d00ca8bc60c1ecd96865568a01ff0c18a99853ee201a5 url: "https://pub.dev" source: hosted - version: "2.7.1" + version: "2.9.3" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - sha256: df534476c341ab2c6a835078066fc681b8265048addd853a1e3c78740316a844 + sha256: "57c5d73173f76d801129d0531c2774052c5a7c11ccb962f1830630decd9f24ec" url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.6.0" video_player_web: dependency: transitive description: name: video_player_web - sha256: e8bba2e5d1e159d5048c9a491bb2a7b29c535c612bb7d10c1e21107f5bd365ba + sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.4.0" vm_service: dependency: transitive description: name: vm_service - sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" url: "https://pub.dev" source: hosted - version: "15.0.0" + version: "15.0.2" vodozemac: dependency: transitive description: @@ -2149,10 +2173,10 @@ packages: dependency: transitive description: name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.1" web: dependency: transitive description: @@ -2181,10 +2205,10 @@ packages: dependency: transitive description: name: webcrypto - sha256: e393b3d0b01694a8f81efecf278ed7392877130e6e7b29f578863e4f2d0b2ebd + sha256: "6b43001c4110856ff7fa5e5e65e7b2d44bec1d8b54a4d84d5fa2c7622267c5c1" url: "https://pub.dev" source: hosted - version: "0.5.8" + version: "0.6.0" webdriver: dependency: transitive description: @@ -2205,10 +2229,10 @@ packages: dependency: transitive description: name: webpush_encryption - sha256: "63046b7d6909f4a72ce3c153fa574726e257aaf21b1995ba063dc241a1b1520b" + sha256: "5b83272b91acda6ae515fcd980c94f06bf413702282497c5a68f5dfc64fed27f" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.1" webrtc_interface: dependency: "direct main" description: @@ -2221,10 +2245,10 @@ packages: dependency: transitive description: name: win32 - sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e url: "https://pub.dev" source: hosted - version: "5.14.0" + version: "5.15.0" win32_registry: dependency: transitive description: @@ -2282,5 +2306,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.10.0 <4.0.0" - flutter: ">=3.35.0" + dart: ">=3.10.3 <4.0.0" + flutter: ">=3.38.4" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 532b026a..e826e70d 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -53,7 +53,7 @@ platforms: parts: flutter-git: source: https://github.com/flutter/flutter.git - source-tag: 3.38.4 + source-tag: 3.41.1 source-depth: 1 plugin: nil override-build: | From 9d007815df25100cdd0623dd8c48d2c4fd2ad6cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 19 Feb 2026 08:42:35 +0100 Subject: [PATCH 042/333] refactor: Enable rule avoid dynamic --- analysis_options.yaml | 6 +++++ lib/pages/chat/chat.dart | 10 ++++---- lib/pages/chat/events/audio_player.dart | 6 ++--- .../chat/events/message_download_content.dart | 2 +- lib/pages/chat/events/message_reactions.dart | 2 +- lib/pages/chat/start_poll_bottom_sheet.dart | 2 +- .../chat_encryption_settings.dart | 2 +- lib/pages/chat_members/chat_members.dart | 4 ++-- .../chat_search/chat_search_files_tab.dart | 2 +- lib/pages/dialer/pip/pip_view.dart | 4 ++-- lib/pages/image_viewer/video_player.dart | 2 +- lib/pages/new_group/new_group.dart | 2 +- lib/pages/settings/settings.dart | 2 +- .../event_extension.dart | 2 +- lib/widgets/app_lock.dart | 2 +- lib/widgets/theme_builder.dart | 2 +- pubspec.lock | 24 +++++++++---------- 17 files changed, 41 insertions(+), 35 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 835b6a61..ef627c7f 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -12,8 +12,14 @@ linter: - omit_local_variable_types analyzer: + plugins: + - dart_code_linter errors: todo: ignore use_build_context_synchronously: ignore exclude: - lib/l10n/*.dart + +dart_code_linter: + rules: + - avoid-dynamic \ No newline at end of file diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index bbd4b25a..f4c2a34d 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -117,9 +117,9 @@ class ChatController extends State bool currentlyTyping = false; bool dragging = false; - void onDragEntered(dynamic _) => setState(() => dragging = true); + void onDragEntered(_) => setState(() => dragging = true); - void onDragExited(dynamic _) => setState(() => dragging = false); + void onDragExited(_) => setState(() => dragging = false); void onDragDone(DropDoneDetails details) async { setState(() => dragging = false); @@ -213,7 +213,7 @@ class ChatController extends State context.go('/rooms'); } - void requestHistory([dynamic _]) async { + void requestHistory([_]) async { Logs().v('Requesting history...'); await timeline?.requestHistory(historyCount: _loadHistoryCount); } @@ -265,7 +265,7 @@ class ChatController extends State } } - void _shareItems([dynamic _]) { + void _shareItems([_]) { final shareItems = widget.shareItems; if (shareItems == null || shareItems.isEmpty) return; if (!room.otherPartyCanReceiveMessages) { @@ -1053,7 +1053,7 @@ class ChatController extends State scrollController.jumpTo(0); } - void onEmojiSelected(dynamic _, Emoji? emoji) { + void onEmojiSelected(_, Emoji? emoji) { typeEmoji(emoji); onInputBarChanged(sendController.text); } diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index 16b0af24..fd631cbc 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -151,7 +151,7 @@ class AudioPlayerState extends State { setState(() => status = AudioPlayerStatus.downloading); try { final fileSize = widget.event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('size'); matrixFile = await widget.event.downloadAndDecryptAttachment( onDownloadProgress: fileSize != null && fileSize > 0 @@ -242,7 +242,7 @@ class AudioPlayerState extends State { List? _getWaveform() { final eventWaveForm = widget.event.content - .tryGetMap('org.matrix.msc1767.audio') + .tryGetMap('org.matrix.msc1767.audio') ?.tryGetList('waveform'); if (eventWaveForm == null || eventWaveForm.isEmpty) { return null; @@ -275,7 +275,7 @@ class AudioPlayerState extends State { } final durationInt = widget.event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('duration'); if (durationInt != null) { final duration = Duration(milliseconds: durationInt); diff --git a/lib/pages/chat/events/message_download_content.dart b/lib/pages/chat/events/message_download_content.dart index 46d5167c..501c0243 100644 --- a/lib/pages/chat/events/message_download_content.dart +++ b/lib/pages/chat/events/message_download_content.dart @@ -27,7 +27,7 @@ class MessageDownloadContent extends StatelessWidget { final filetype = (filename.contains('.') ? filename.split('.').last.toUpperCase() : event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('mimetype') ?.toUpperCase() ?? 'UNKNOWN'); diff --git a/lib/pages/chat/events/message_reactions.dart b/lib/pages/chat/events/message_reactions.dart index 5f5b4aa2..86d8ade6 100644 --- a/lib/pages/chat/events/message_reactions.dart +++ b/lib/pages/chat/events/message_reactions.dart @@ -26,7 +26,7 @@ class MessageReactions extends StatelessWidget { for (final e in allReactionEvents) { final key = e.content - .tryGetMap('m.relates_to') + .tryGetMap('m.relates_to') ?.tryGet('key'); if (key != null) { if (!reactionMap.containsKey(key)) { diff --git a/lib/pages/chat/start_poll_bottom_sheet.dart b/lib/pages/chat/start_poll_bottom_sheet.dart index b90dc473..25e18ad4 100644 --- a/lib/pages/chat/start_poll_bottom_sheet.dart +++ b/lib/pages/chat/start_poll_bottom_sheet.dart @@ -56,7 +56,7 @@ class _StartPollBottomSheetState extends State { } } - void _updateCanCreate([dynamic _]) { + void _updateCanCreate([_]) { final newCanCreate = _bodyController.text.trim().isNotEmpty && !_answers.any((controller) => controller.text.trim().isEmpty); diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart index 6996d58d..704f3364 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart @@ -30,7 +30,7 @@ class ChatEncryptionSettingsController extends State { } } - void enableEncryption(dynamic _) async { + void enableEncryption(_) async { if (room.encrypted) { showOkAlertDialog( context: context, diff --git a/lib/pages/chat_members/chat_members.dart b/lib/pages/chat_members/chat_members.dart index 21cbc525..e4ce1a5a 100644 --- a/lib/pages/chat_members/chat_members.dart +++ b/lib/pages/chat_members/chat_members.dart @@ -29,7 +29,7 @@ class ChatMembersController extends State { setFilter(); } - void setFilter([dynamic _]) async { + void setFilter([_]) async { final filter = filterController.text.toLowerCase().trim(); final members = this.members @@ -56,7 +56,7 @@ class ChatMembersController extends State { }); } - void refreshMembers([dynamic _]) async { + void refreshMembers([_]) async { Logs().d('Load room members from', widget.roomId); try { setState(() { diff --git a/lib/pages/chat_search/chat_search_files_tab.dart b/lib/pages/chat_search/chat_search_files_tab.dart index 24d27cec..8c5bdc60 100644 --- a/lib/pages/chat_search/chat_search_files_tab.dart +++ b/lib/pages/chat_search/chat_search_files_tab.dart @@ -49,7 +49,7 @@ class ChatSearchFilesTab extends StatelessWidget { final filetype = (filename.contains('.') ? filename.split('.').last.toUpperCase() : event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('mimetype') ?.toUpperCase() ?? 'UNKNOWN'); diff --git a/lib/pages/dialer/pip/pip_view.dart b/lib/pages/dialer/pip/pip_view.dart index 1cf1e5ec..804ee837 100644 --- a/lib/pages/dialer/pip/pip_view.dart +++ b/lib/pages/dialer/pip/pip_view.dart @@ -105,7 +105,7 @@ class PIPViewState extends State with TickerProviderStateMixin { }); } - void _onPanEnd(dynamic _) { + void _onPanEnd(_) { if (!_isDragging) return; final nearestCorner = _calculateNearestCorner( @@ -122,7 +122,7 @@ class PIPViewState extends State with TickerProviderStateMixin { }); } - void _onPanStart(dynamic _) { + void _onPanStart(_) { if (_isAnimating()) return; setState(() { _dragOffset = _offsets[_corner]!; diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index fa18f93c..5ca9fcc2 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -43,7 +43,7 @@ class EventVideoPlayerState extends State { try { final fileSize = widget.event.content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('size'); final videoFile = await widget.event.downloadAndDecryptAttachment( onDownloadProgress: fileSize == null diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index c5737a32..4c2e711a 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -108,7 +108,7 @@ class NewGroupController extends State { context.pop(spaceId); } - void submitAction([dynamic _]) async { + void submitAction([_]) async { final client = Matrix.of(context).client; try { diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 13ca20a1..e3c1146f 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -182,7 +182,7 @@ class SettingsController extends State { bool? crossSigningCached; bool? showChatBackupBanner; - void firstRunBootstrapAction([dynamic _]) async { + void firstRunBootstrapAction([_]) async { if (showChatBackupBanner != true) { showOkAlertDialog( context: context, diff --git a/lib/utils/matrix_sdk_extensions/event_extension.dart b/lib/utils/matrix_sdk_extensions/event_extension.dart index 2da3a1f0..09cbe534 100644 --- a/lib/utils/matrix_sdk_extensions/event_extension.dart +++ b/lib/utils/matrix_sdk_extensions/event_extension.dart @@ -59,7 +59,7 @@ extension LocalizedBody on Event { (content['url'] is String)); String? get sizeString => content - .tryGetMap('info') + .tryGetMap('info') ?.tryGet('size') ?.sizeString; } diff --git a/lib/widgets/app_lock.dart b/lib/widgets/app_lock.dart index a8b93301..636b38df 100644 --- a/lib/widgets/app_lock.dart +++ b/lib/widgets/app_lock.dart @@ -41,7 +41,7 @@ class AppLock extends State with WidgetsBindingObserver { WidgetsBinding.instance.addPostFrameCallback(_checkLoggedIn); } - void _checkLoggedIn(dynamic _) async { + void _checkLoggedIn(_) async { if (widget.clients.any((client) => client.isLogged())) return; await changePincode(null); diff --git a/lib/widgets/theme_builder.dart b/lib/widgets/theme_builder.dart index 669c8891..0be03731 100644 --- a/lib/widgets/theme_builder.dart +++ b/lib/widgets/theme_builder.dart @@ -41,7 +41,7 @@ class ThemeController extends State { static ThemeController of(BuildContext context) => Provider.of(context, listen: false); - void _loadData(dynamic _) async { + void _loadData(_) async { final preferences = _sharedPreferences ??= await SharedPreferences.getInstance(); diff --git a/pubspec.lock b/pubspec.lock index f18e1f45..e78f876f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.0" charcode: dependency: transitive description: @@ -1112,18 +1112,18 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" matrix: dependency: "direct main" description: @@ -1869,26 +1869,26 @@ packages: dependency: transitive description: name: test - sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" url: "https://pub.dev" source: hosted - version: "1.29.0" + version: "1.26.3" test_api: dependency: transitive description: name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.9" + version: "0.7.7" test_core: dependency: transitive description: name: test_core - sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" url: "https://pub.dev" source: hosted - version: "0.6.15" + version: "0.6.12" timezone: dependency: transitive description: From d08364688ea8bec2de51a0da3cf780ebcaf13342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 19 Feb 2026 08:47:10 +0100 Subject: [PATCH 043/333] refactor: Avoid redundant async --- analysis_options.yaml | 3 +- integration_test/app_test.dart | 318 +++++++++--------- lib/pages/bootstrap/bootstrap_dialog.dart | 2 +- lib/pages/chat/chat.dart | 2 +- lib/pages/chat/events/poll.dart | 6 +- lib/pages/chat_list/chat_list.dart | 2 +- lib/pages/dialer/dialer.dart | 4 +- .../invitation_selection.dart | 2 +- lib/pages/login/login.dart | 2 +- lib/pages/settings_style/settings_style.dart | 2 +- .../sqlcipher_stub.dart | 3 +- lib/widgets/qr_code_viewer.dart | 2 +- test/archive_test.dart | 1 + test/homeserver_picker_test.dart | 1 + test/widget_test.dart | 1 + 15 files changed, 169 insertions(+), 182 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index ef627c7f..8bb726c0 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -22,4 +22,5 @@ analyzer: dart_code_linter: rules: - - avoid-dynamic \ No newline at end of file + - avoid-dynamic + - avoid-redundant-async \ No newline at end of file diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart index 3a013936..cb5db3cc 100644 --- a/integration_test/app_test.dart +++ b/integration_test/app_test.dart @@ -17,171 +17,157 @@ import 'users.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - group( - 'Integration Test', - () { - setUpAll( - () async { - // this random dialog popping up is super hard to cover in tests - SharedPreferences.setMockInitialValues({ - 'chat.fluffy.show_no_google': false, - }); - }, - ); - - testWidgets( - 'Start app, login and logout', - (WidgetTester tester) async { - app.main(); - await tester.ensureAppStartedHomescreen(); - await tester.ensureLoggedOut(); - }, - ); - - testWidgets( - 'Login again', - (WidgetTester tester) async { - app.main(); - await tester.ensureAppStartedHomescreen(); - }, - ); - - testWidgets( - 'Start chat and send message', - (WidgetTester tester) async { - app.main(); - await tester.ensureAppStartedHomescreen(); - await tester.waitFor(find.byType(TextField)); - await tester.enterText(find.byType(TextField), Users.user2.name); - await tester.pumpAndSettle(); - - await tester.scrollUntilVisible( - find.text('Chats').first, - 500, - scrollable: find - .descendant( - of: find.byType(ChatListViewBody), - matching: find.byType(Scrollable), - ) - .first, - ); - await tester.pumpAndSettle(); - await tester.tap(find.text('Chats')); - await tester.pumpAndSettle(); - await tester.waitFor(find.byType(SearchTitle)); - await tester.pumpAndSettle(); - - await tester.scrollUntilVisible( - find.text(Users.user2.name).first, - 500, - scrollable: find - .descendant( - of: find.byType(ChatListViewBody), - matching: find.byType(Scrollable), - ) - .first, - ); - await tester.pumpAndSettle(); - await tester.tap(find.text(Users.user2.name).first); - - try { - await tester.waitFor( - find.byType(ChatView), - timeout: const Duration(seconds: 5), - ); - } catch (_) { - // in case the homeserver sends the username as search result - if (find.byIcon(Icons.send_outlined).evaluate().isNotEmpty) { - await tester.tap(find.byIcon(Icons.send_outlined)); - await tester.pumpAndSettle(); - } - } - - await tester.waitFor(find.byType(ChatView)); - await tester.enterText(find.byType(TextField).last, 'Test'); - await tester.pumpAndSettle(); - try { - await tester.waitFor(find.byIcon(Icons.send_outlined)); - await tester.tap(find.byIcon(Icons.send_outlined)); - } catch (_) { - await tester.testTextInput.receiveAction(TextInputAction.done); - } - await tester.pumpAndSettle(); - await tester.waitFor(find.text('Test')); - await tester.pumpAndSettle(); - }, - ); - - testWidgets('Spaces', (tester) async { - app.main(); - await tester.ensureAppStartedHomescreen(); - - await tester.waitFor(find.byTooltip('Show menu')); - await tester.tap(find.byTooltip('Show menu')); - await tester.pumpAndSettle(); - - await tester.waitFor(find.byIcon(Icons.workspaces_outlined)); - await tester.tap(find.byIcon(Icons.workspaces_outlined)); - await tester.pumpAndSettle(); - - await tester.waitFor(find.byType(TextField)); - await tester.enterText(find.byType(TextField).last, 'Test Space'); - await tester.pumpAndSettle(); - - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); - - await tester.waitFor(find.text('Invite contact')); - - await tester.tap(find.text('Invite contact')); - await tester.pumpAndSettle(); - - await tester.waitFor( - find.descendant( - of: find.byType(InvitationSelectionView), - matching: find.byType(TextField), - ), - ); - await tester.enterText( - find.descendant( - of: find.byType(InvitationSelectionView), - matching: find.byType(TextField), - ), - Users.user2.name, - ); - - await Future.delayed(const Duration(milliseconds: 250)); - await tester.testTextInput.receiveAction(TextInputAction.done); - - await Future.delayed(const Duration(milliseconds: 1000)); - await tester.pumpAndSettle(); - - await tester.tap( - find - .descendant( - of: find.descendant( - of: find.byType(InvitationSelectionView), - matching: find.byType(ListTile), - ), - matching: find.text(Users.user2.name), - ) - .last, - ); - await tester.pumpAndSettle(); - - await tester.waitFor(find.maybeUppercaseText('Yes')); - await tester.tap(find.maybeUppercaseText('Yes')); - await tester.pumpAndSettle(); - - await tester.tap(find.byTooltip('Back')); - await tester.pumpAndSettle(); - - await tester.waitFor(find.text('Load 2 more participants')); - await tester.tap(find.text('Load 2 more participants')); - await tester.pumpAndSettle(); - - expect(find.text(Users.user2.name), findsOneWidget); + group('Integration Test', () { + setUpAll(() { + // this random dialog popping up is super hard to cover in tests + SharedPreferences.setMockInitialValues({ + 'chat.fluffy.show_no_google': false, }); - }, - ); + }); + + testWidgets('Start app, login and logout', (WidgetTester tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + await tester.ensureLoggedOut(); + }); + + testWidgets('Login again', (WidgetTester tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + }); + + testWidgets('Start chat and send message', (WidgetTester tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + await tester.waitFor(find.byType(TextField)); + await tester.enterText(find.byType(TextField), Users.user2.name); + await tester.pumpAndSettle(); + + await tester.scrollUntilVisible( + find.text('Chats').first, + 500, + scrollable: find + .descendant( + of: find.byType(ChatListViewBody), + matching: find.byType(Scrollable), + ) + .first, + ); + await tester.pumpAndSettle(); + await tester.tap(find.text('Chats')); + await tester.pumpAndSettle(); + await tester.waitFor(find.byType(SearchTitle)); + await tester.pumpAndSettle(); + + await tester.scrollUntilVisible( + find.text(Users.user2.name).first, + 500, + scrollable: find + .descendant( + of: find.byType(ChatListViewBody), + matching: find.byType(Scrollable), + ) + .first, + ); + await tester.pumpAndSettle(); + await tester.tap(find.text(Users.user2.name).first); + + try { + await tester.waitFor( + find.byType(ChatView), + timeout: const Duration(seconds: 5), + ); + } catch (_) { + // in case the homeserver sends the username as search result + if (find.byIcon(Icons.send_outlined).evaluate().isNotEmpty) { + await tester.tap(find.byIcon(Icons.send_outlined)); + await tester.pumpAndSettle(); + } + } + + await tester.waitFor(find.byType(ChatView)); + await tester.enterText(find.byType(TextField).last, 'Test'); + await tester.pumpAndSettle(); + try { + await tester.waitFor(find.byIcon(Icons.send_outlined)); + await tester.tap(find.byIcon(Icons.send_outlined)); + } catch (_) { + await tester.testTextInput.receiveAction(TextInputAction.done); + } + await tester.pumpAndSettle(); + await tester.waitFor(find.text('Test')); + await tester.pumpAndSettle(); + }); + + testWidgets('Spaces', (tester) async { + app.main(); + await tester.ensureAppStartedHomescreen(); + + await tester.waitFor(find.byTooltip('Show menu')); + await tester.tap(find.byTooltip('Show menu')); + await tester.pumpAndSettle(); + + await tester.waitFor(find.byIcon(Icons.workspaces_outlined)); + await tester.tap(find.byIcon(Icons.workspaces_outlined)); + await tester.pumpAndSettle(); + + await tester.waitFor(find.byType(TextField)); + await tester.enterText(find.byType(TextField).last, 'Test Space'); + await tester.pumpAndSettle(); + + await tester.testTextInput.receiveAction(TextInputAction.done); + await tester.pumpAndSettle(); + + await tester.waitFor(find.text('Invite contact')); + + await tester.tap(find.text('Invite contact')); + await tester.pumpAndSettle(); + + await tester.waitFor( + find.descendant( + of: find.byType(InvitationSelectionView), + matching: find.byType(TextField), + ), + ); + await tester.enterText( + find.descendant( + of: find.byType(InvitationSelectionView), + matching: find.byType(TextField), + ), + Users.user2.name, + ); + + await Future.delayed(const Duration(milliseconds: 250)); + await tester.testTextInput.receiveAction(TextInputAction.done); + + await Future.delayed(const Duration(milliseconds: 1000)); + await tester.pumpAndSettle(); + + await tester.tap( + find + .descendant( + of: find.descendant( + of: find.byType(InvitationSelectionView), + matching: find.byType(ListTile), + ), + matching: find.text(Users.user2.name), + ) + .last, + ); + await tester.pumpAndSettle(); + + await tester.waitFor(find.maybeUppercaseText('Yes')); + await tester.tap(find.maybeUppercaseText('Yes')); + await tester.pumpAndSettle(); + + await tester.tap(find.byTooltip('Back')); + await tester.pumpAndSettle(); + + await tester.waitFor(find.text('Load 2 more participants')); + await tester.tap(find.text('Load 2 more participants')); + await tester.pumpAndSettle(); + + expect(find.text(Users.user2.name), findsOneWidget); + }); + }); } diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index 9d2b5fab..592bb3e8 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -90,7 +90,7 @@ class BootstrapDialogState extends State { context.canPop() ? context.pop(success) : context.go('/rooms'); } - void _decryptLastEvents() async { + void _decryptLastEvents() { for (final room in client.rooms) { final event = room.lastEvent; if (event != null && diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index f4c2a34d..15b36b98 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -257,7 +257,7 @@ class ChatController extends State } } - void _loadDraft() async { + void _loadDraft() { final prefs = Matrix.of(context).store; final draft = prefs.getString('draft_$roomId'); if (draft != null && draft.isNotEmpty) { diff --git a/lib/pages/chat/events/poll.dart b/lib/pages/chat/events/poll.dart index e6baeb7c..7cc57dc7 100644 --- a/lib/pages/chat/events/poll.dart +++ b/lib/pages/chat/events/poll.dart @@ -27,11 +27,7 @@ class PollWidget extends StatelessWidget { void _endPoll(BuildContext context) => showFutureLoadingDialog(context: context, future: () => event.endPoll()); - void _toggleVote( - BuildContext context, - String answerId, - int maxSelection, - ) async { + void _toggleVote(BuildContext context, String answerId, int maxSelection) { final userId = event.room.client.userID!; final answerIds = event.getPollResponses(timeline)[userId] ?? {}; if (!answerIds.remove(answerId)) { diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 45e63851..aae3a10c 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -372,7 +372,7 @@ class ChatListController extends State scrollController.addListener(_onScroll); _waitForFirstSync(); _hackyWebRTCFixForWeb(); - WidgetsBinding.instance.addPostFrameCallback((_) async { + WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { searchServer = Matrix.of( context, diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index d3cca97c..85c10f7d 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -189,7 +189,7 @@ class MyCallingPage extends State { _playCallSound(); } - void initialize() async { + void initialize() { final call = this.call; call.onCallStateChanged.stream.listen(_handleCallState); call.onCallEventChanged.stream.listen((event) { @@ -282,7 +282,7 @@ class MyCallingPage extends State { }); } - void _screenSharing() async { + void _screenSharing() { if (PlatformInfos.isAndroid) { if (!call.screensharingEnabled) { FlutterForegroundTask.init( diff --git a/lib/pages/invitation_selection/invitation_selection.dart b/lib/pages/invitation_selection/invitation_selection.dart index 1701a1a0..50fcd266 100644 --- a/lib/pages/invitation_selection/invitation_selection.dart +++ b/lib/pages/invitation_selection/invitation_selection.dart @@ -66,7 +66,7 @@ class InvitationSelectionController extends State { } } - void searchUserWithCoolDown(String text) async { + void searchUserWithCoolDown(String text) { coolDown?.cancel(); coolDown = Timer( const Duration(milliseconds: 500), diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index c1620f91..cb2a45d6 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -94,7 +94,7 @@ class LoginController extends State { Timer? _coolDown; - void checkWellKnownWithCoolDown(String userId) async { + void checkWellKnownWithCoolDown(String userId) { _coolDown?.cancel(); _coolDown = Timer( const Duration(seconds: 1), diff --git a/lib/pages/settings_style/settings_style.dart b/lib/pages/settings_style/settings_style.dart index b22e98fb..c30492cf 100644 --- a/lib/pages/settings_style/settings_style.dart +++ b/lib/pages/settings_style/settings_style.dart @@ -19,7 +19,7 @@ class SettingsStyle extends StatefulWidget { } class SettingsStyleController extends State { - void setChatColor(Color? color) async { + void setChatColor(Color? color) { AppSettings.colorSchemeSeedInt.setItem( color?.toARGB32() ?? AppSettings.colorSchemeSeedInt.defaultValue, ); diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart index b0f8b43d..c5ec4feb 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/sqlcipher_stub.dart @@ -1 +1,2 @@ -Future applyWorkaroundToOpenSqlCipherOnOldAndroidVersions() async {} +Future applyWorkaroundToOpenSqlCipherOnOldAndroidVersions() => + Future.value(); diff --git a/lib/widgets/qr_code_viewer.dart b/lib/widgets/qr_code_viewer.dart index f8653a68..32024f11 100644 --- a/lib/widgets/qr_code_viewer.dart +++ b/lib/widgets/qr_code_viewer.dart @@ -27,7 +27,7 @@ class QrCodeViewer extends StatelessWidget { void _save(BuildContext context) async { final imageResult = await showFutureLoadingDialog( context: context, - future: () async { + future: () { final inviteLink = 'https://matrix.to/#/$content'; final image = QRImage(inviteLink, size: 256, radius: 1).generate(); return compute(encodePng, image); diff --git a/test/archive_test.dart b/test/archive_test.dart index 25bb090e..33ff38ab 100644 --- a/test/archive_test.dart +++ b/test/archive_test.dart @@ -6,5 +6,6 @@ void main() { testWidget: Archive(), testClient: await testClient(loggedIn: true), ));*/ + return; }); } diff --git a/test/homeserver_picker_test.dart b/test/homeserver_picker_test.dart index 054f49ca..3200fdd2 100644 --- a/test/homeserver_picker_test.dart +++ b/test/homeserver_picker_test.dart @@ -13,5 +13,6 @@ void main() { testWidget: HomeserverPicker(), ), );*/ + return; }); } diff --git a/test/widget_test.dart b/test/widget_test.dart index 7d1d98eb..beb6cd2a 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -16,5 +16,6 @@ void main() { /* await tester.pumpWidget(FluffyChatApp( client: await prepareTestClient(), ));*/ + return; }); } From 1cd3a9103790bbff0aef4cb29cb69038241fb7c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 19 Feb 2026 08:53:18 +0100 Subject: [PATCH 044/333] refactor: Avoid unnecessary bool comparison --- analysis_options.yaml | 6 +++++- lib/pages/bootstrap/bootstrap_dialog.dart | 3 +-- lib/pages/chat/chat.dart | 6 +++--- lib/pages/chat/chat_input_row.dart | 2 +- lib/pages/chat/chat_view.dart | 2 +- lib/pages/chat/events/audio_player.dart | 2 +- lib/pages/chat/recording_view_model.dart | 4 ++-- .../chat_access_settings_controller.dart | 2 +- lib/pages/chat_list/chat_list.dart | 12 +++++------- lib/pages/chat_list/status_msg_list.dart | 2 +- lib/pages/image_viewer/image_viewer.dart | 2 +- lib/pages/image_viewer/video_player.dart | 2 +- lib/pages/settings/settings.dart | 2 +- .../flutter_matrix_dart_sdk_database/cipher.dart | 2 +- lib/utils/voip_plugin.dart | 2 +- 15 files changed, 26 insertions(+), 25 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 8bb726c0..0e1a55c5 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -23,4 +23,8 @@ analyzer: dart_code_linter: rules: - avoid-dynamic - - avoid-redundant-async \ No newline at end of file + - avoid-redundant-async + - avoid-unnecessary-type-assertions + - avoid-unnecessary-type-casts + - avoid-unrelated-type-assertions + - no-boolean-literal-compare \ No newline at end of file diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index 592bb3e8..aa1d1dc6 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -161,8 +161,7 @@ class BootstrapDialogState extends State { Widget body = const Center(child: CircularProgressIndicator.adaptive()); titleText = L10n.of(context).loadingPleaseWait; - if (bootstrap.newSsssKey?.recoveryKey != null && - _recoveryKeyStored == false) { + if (bootstrap.newSsssKey?.recoveryKey != null && _recoveryKeyStored) { final key = bootstrap.newSsssKey!.recoveryKey; titleText = L10n.of(context).recoveryKey; return LoginScaffold( diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 15b36b98..88eed4d2 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -249,9 +249,9 @@ class ChatController extends State } if (!scrollController.hasClients) return; if (timeline?.allowNewEvent == false || - scrollController.position.pixels > 0 && _scrolledUp == false) { + scrollController.position.pixels > 0 && _scrolledUp) { setState(() => _scrolledUp = true); - } else if (scrollController.position.pixels <= 0 && _scrolledUp == true) { + } else if (scrollController.position.pixels <= 0 && _scrolledUp) { setState(() => _scrolledUp = false); setReadMarker(); } @@ -919,7 +919,7 @@ class ChatController extends State final clients = Matrix.of(context).currentBundle; for (final event in selectedEvents) { if (!event.status.isSent) return false; - if (event.canRedact == false && + if (event.canRedact && !(clients!.any((cl) => event.senderId == cl!.userID))) { return false; } diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 90173d23..848e51c8 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -317,7 +317,7 @@ class ChatInputRow extends StatelessWidget { autofocus: !PlatformInfos.isMobile, keyboardType: TextInputType.multiline, textInputAction: - AppSettings.sendOnEnter.value == true && + AppSettings.sendOnEnter.value && PlatformInfos.isMobile ? TextInputAction.send : null, diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index 23e0b8ad..c22d9e4d 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -364,7 +364,7 @@ class ChatView extends StatelessWidget { ? theme.colorScheme.tertiaryContainer : theme.colorScheme.surfaceContainerHigh, borderRadius: BorderRadius.circular(32), - child: controller.room.isAbandonedDMRoom == true + child: controller.room.isAbandonedDMRoom ? Row( mainAxisAlignment: .spaceEvenly, children: [ diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index fd631cbc..b6890b54 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -179,7 +179,7 @@ class AudioPlayerState extends State { matrixFile.mimeType.toLowerCase() == 'audio/ogg') { Logs().v('Convert ogg audio file for iOS...'); final convertedFile = File('${file.path}.caf'); - if (await convertedFile.exists() == false) { + if (await convertedFile.exists()) { OpusCaf().convertOpusToCaf(file.path, convertedFile.path); } file = convertedFile; diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index 65d7caa1..815d8b11 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -55,7 +55,7 @@ class RecordingViewModelState extends State { return; } } - if (await AudioRecorder().hasPermission() == false) return; + if (await AudioRecorder().hasPermission()) return; final audioRecorder = _audioRecorder ??= AudioRecorder(); setState(() {}); @@ -76,7 +76,7 @@ class RecordingViewModelState extends State { } final result = await audioRecorder.hasPermission(); - if (result != true) { + if (!result) { showOkAlertDialog( context: context, title: L10n.of(context).oopsSomethingWentWrong, diff --git a/lib/pages/chat_access_settings/chat_access_settings_controller.dart b/lib/pages/chat_access_settings/chat_access_settings_controller.dart index 4161099f..95e95e92 100644 --- a/lib/pages/chat_access_settings/chat_access_settings_controller.dart +++ b/lib/pages/chat_access_settings/chat_access_settings_controller.dart @@ -320,7 +320,7 @@ class ChatAccessSettingsController extends State { try { await room.client.setRoomVisibilityOnDirectory( room.id, - visibility: visibility == true ? Visibility.public : Visibility.private, + visibility: visibility ? Visibility.public : Visibility.private, ); setState(() {}); } catch (e, s) { diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index aae3a10c..9041daf2 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -168,9 +168,8 @@ class ChatListController extends State initialText: searchServer, keyboardType: TextInputType.url, autocorrect: false, - validator: (server) => server.contains('.') == true - ? null - : L10n.of(context).invalidServerName, + validator: (server) => + server.contains('.') ? null : L10n.of(context).invalidServerName, ); if (newServer == null) return; Matrix.of(context).store.setString(_serverStoreNamespace, newServer); @@ -203,10 +202,9 @@ class ChatListController extends State if (searchQuery.isValidMatrixId && searchQuery.sigil == '#' && - roomSearchResult.chunk.any( - (room) => room.canonicalAlias == searchQuery, - ) == - false) { + !roomSearchResult.chunk.any( + (room) => room.canonicalAlias == searchQuery, + )) { final response = await client.getRoomIdByAlias(searchQuery); final roomId = response.roomId; if (roomId != null) { diff --git a/lib/pages/chat_list/status_msg_list.dart b/lib/pages/chat_list/status_msg_list.dart index 7677e031..d89e75d4 100644 --- a/lib/pages/chat_list/status_msg_list.dart +++ b/lib/pages/chat_list/status_msg_list.dart @@ -314,7 +314,7 @@ extension on CachedPresence { ? DateTime.now() : DateTime.fromMillisecondsSinceEpoch(0)); - LinearGradient get gradient => presence.isOnline == true + LinearGradient get gradient => presence.isOnline ? LinearGradient( colors: [Colors.green, Colors.green.shade200, Colors.green.shade900], begin: Alignment.topLeft, diff --git a/lib/pages/image_viewer/image_viewer.dart b/lib/pages/image_viewer/image_viewer.dart index 1dba46b2..18b73324 100644 --- a/lib/pages/image_viewer/image_viewer.dart +++ b/lib/pages/image_viewer/image_viewer.dart @@ -110,7 +110,7 @@ class ImageViewerController extends State { /// Go back if user swiped it away void onInteractionEnds(ScaleEndDetails endDetails) { - if (PlatformInfos.usesTouchscreen == false) { + if (!PlatformInfos.usesTouchscreen) { if (endDetails.velocity.pixelsPerSecond.dy > MediaQuery.sizeOf(context).height * maxScaleFactor) { Navigator.of(context, rootNavigator: false).pop(); diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index 5ca9fcc2..3c8c5792 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -73,7 +73,7 @@ class EventVideoPlayerState extends State { widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last, ); final file = File('${tempDir.path}/${fileName}_${videoFile.name}'); - if (await file.exists() == false) { + if (!await file.exists()) { await file.writeAsBytes(videoFile.bytes); } videoPlayerController = VideoPlayerController.file(file); diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index e3c1146f..a54b4205 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -172,7 +172,7 @@ class SettingsController extends State { final needsBootstrap = await client.encryption?.keyManager.isCached() == false || client.encryption?.crossSigning.enabled == false || - crossSigning == false; + !crossSigning; final isUnknownSession = client.isUnknownSession; setState(() { showChatBackupBanner = needsBootstrap || isUnknownSession; diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart index a91c79f2..775c98dd 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart @@ -50,7 +50,7 @@ Future getDatabaseCipher() async { void _sendNoEncryptionWarning(Object exception) async { final isStored = AppSettings.noEncryptionWarningShown.value; - if (isStored == true) return; + if (isStored) return; final l10n = await lookupL10n(PlatformDispatcher.instance.locale); ClientManager.sendInitNotification( diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart index adef19dd..62e729ba 100644 --- a/lib/utils/voip_plugin.dart +++ b/lib/utils/voip_plugin.dart @@ -117,7 +117,7 @@ class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate { await matrix.store.setString( 'wasForeground', - wasForeground == true ? 'true' : 'false', + wasForeground ? 'true' : 'false', ); FlutterForegroundTask.setOnLockScreenVisibility(true); FlutterForegroundTask.wakeUpScreen(); From 7a1eded1bb51792b86091011049fcbbad60b80fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 19 Feb 2026 09:19:05 +0100 Subject: [PATCH 045/333] refactor: Add more linter rules --- analysis_options.yaml | 22 ++++++++++++++++++- lib/pages/chat/input_bar.dart | 9 +++----- lib/pages/dialer/dialer.dart | 4 ++-- .../key_verification_dialog.dart | 2 +- lib/utils/push_helper.dart | 2 +- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 0e1a55c5..0deff3a0 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -27,4 +27,24 @@ dart_code_linter: - avoid-unnecessary-type-assertions - avoid-unnecessary-type-casts - avoid-unrelated-type-assertions - - no-boolean-literal-compare \ No newline at end of file + - no-boolean-literal-compare + - no-equal-then-else + - prefer-first + - prefer-last + - prefer-immediate-return + - prefer-enums-by-name + - avoid-unnecessary-conditionals + # TODO: + # - member-ordering + # - avoid-late-keyword + # - avoid-non-null-assertion + # - avoid-global-state + # - prefer-match-file-name + # - avoid-banned-imports: + # entries: + # - paths: ['some/folder/.*\.dart', 'another/folder/.*\.dart'] + # deny: ['package:flutter/material.dart'] + # message: 'Do not import Flutter Material Design library, we should not depend on it!' + # - no-magic-number: + # allowed: [-1, 0, 1,2,4,6,8,12,16,32,40,56,64] + # allow-only-once: true \ No newline at end of file diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index a6e52549..de967b58 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -159,7 +159,7 @@ class InputBar extends StatelessWidget { slugify( user.displayName!.toLowerCase(), ).contains(userSearch))) || - user.id.split(':')[0].toLowerCase().contains(userSearch)) { + user.id.localpart!.toLowerCase().contains(userSearch)) { ret.add({ 'type': 'user', 'mxid': user.id, @@ -185,17 +185,14 @@ class InputBar extends StatelessWidget { ((state.content['alias'] is String && state.content .tryGet('alias')! - .split(':')[0] + .localpart! .toLowerCase() .contains(roomSearch)) || (state.content['alt_aliases'] is List && (state.content['alt_aliases'] as List).any( (l) => l is String && - l - .split(':')[0] - .toLowerCase() - .contains(roomSearch), + l.localpart!.toLowerCase().contains(roomSearch), )))) || (r.name.toLowerCase().contains(roomSearch))) { ret.add({ diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index 85c10f7d..2b021274 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -147,7 +147,7 @@ class MyCallingPage extends State { MediaStream? get remoteStream { if (call.getRemoteStreams.isNotEmpty) { - return call.getRemoteStreams[0].stream!; + return call.getRemoteStreams.first.stream!; } return null; } @@ -327,7 +327,7 @@ class MyCallingPage extends State { void _switchCamera() async { if (call.localUserMediaStream != null) { await Helper.switchCamera( - call.localUserMediaStream!.stream!.getVideoTracks()[0], + call.localUserMediaStream!.stream!.getVideoTracks().first, ); } setState(() {}); diff --git a/lib/pages/key_verification/key_verification_dialog.dart b/lib/pages/key_verification/key_verification_dialog.dart index 10121f9b..400b3e6c 100644 --- a/lib/pages/key_verification/key_verification_dialog.dart +++ b/lib/pages/key_verification/key_verification_dialog.dart @@ -248,7 +248,7 @@ class KeyVerificationPageState extends State { } else { title = Text(L10n.of(context).compareNumbersMatch); final numbers = widget.request.sasNumbers; - final numbstr = '${numbers[0]}-${numbers[1]}-${numbers[2]}'; + final numbstr = '${numbers.first}-${numbers[1]}-${numbers[2]}'; compareWidget = TextSpan( text: numbstr, style: const TextStyle(fontSize: 40), diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart index 0fdc9565..4b10623e 100644 --- a/lib/utils/push_helper.dart +++ b/lib/utils/push_helper.dart @@ -340,7 +340,7 @@ class FluffyChatPushPayload { if (parts.length != 3) { return FluffyChatPushPayload(null, null, null); } - return FluffyChatPushPayload(parts[0], parts[1], parts[2]); + return FluffyChatPushPayload(parts.first, parts[1], parts[2]); } @override From 2b2b96872d522533a59b069b06555c9a687a4c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 19 Feb 2026 11:41:57 +0100 Subject: [PATCH 046/333] refactor: Add Flutter lints --- analysis_options.yaml | 12 +++++++++++- lib/pages/chat_list/chat_list_body.dart | 5 +---- lib/pages/chat_members/chat_members_view.dart | 5 +---- lib/pages/dialer/dialer.dart | 2 +- .../key_verification/key_verification_dialog.dart | 2 +- lib/widgets/layouts/login_scaffold.dart | 2 +- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 0deff3a0..75a06f44 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -22,6 +22,7 @@ analyzer: dart_code_linter: rules: + # Dart specific: - avoid-dynamic - avoid-redundant-async - avoid-unnecessary-type-assertions @@ -47,4 +48,13 @@ dart_code_linter: # message: 'Do not import Flutter Material Design library, we should not depend on it!' # - no-magic-number: # allowed: [-1, 0, 1,2,4,6,8,12,16,32,40,56,64] - # allow-only-once: true \ No newline at end of file + # allow-only-once: true + # Flutter specific: + - prefer-media-query-direct-access + - avoid-wrapping-in-padding + - prefer-correct-edge-insets-constructor + # TODO: + # - avoid-returning-widgets + # - prefer-single-widget-per-file: + # ignore-private-widgets: true + # - prefer-extracting-callbacks \ No newline at end of file diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index b9cb167f..38253d05 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -132,10 +132,7 @@ class ChatListViewBody extends StatelessWidget { SizedBox( height: 64, child: ListView( - padding: const EdgeInsets.symmetric( - horizontal: 12.0, - vertical: 12.0, - ), + padding: const EdgeInsets.all(12.0), shrinkWrap: true, scrollDirection: Axis.horizontal, children: diff --git a/lib/pages/chat_members/chat_members_view.dart b/lib/pages/chat_members/chat_members_view.dart index 89707a10..81e15ea6 100644 --- a/lib/pages/chat_members/chat_members_view.dart +++ b/lib/pages/chat_members/chat_members_view.dart @@ -124,10 +124,7 @@ class ChatMembersView extends StatelessWidget { SizedBox( height: 64, child: ListView.builder( - padding: const EdgeInsets.symmetric( - horizontal: 12.0, - vertical: 12.0, - ), + padding: const EdgeInsets.all(12.0), scrollDirection: Axis.horizontal, itemCount: availableFilters.length, itemBuilder: (context, i) => Padding( diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index 2b021274..006ef3d5 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -552,7 +552,7 @@ class MyCallingPage extends State { if (secondaryStreamViews.isNotEmpty) { stackWidgets.add( Container( - padding: const EdgeInsets.fromLTRB(0, 20, 0, 120), + padding: const EdgeInsets.only(top: 20, bottom: 120), alignment: Alignment.bottomRight, child: Container( width: _localVideoWidth, diff --git a/lib/pages/key_verification/key_verification_dialog.dart b/lib/pages/key_verification/key_verification_dialog.dart index 400b3e6c..1b04b8dd 100644 --- a/lib/pages/key_verification/key_verification_dialog.dart +++ b/lib/pages/key_verification/key_verification_dialog.dart @@ -120,7 +120,7 @@ class KeyVerificationPageState extends State { final textEditingController = TextEditingController(); String input; body = Container( - margin: const EdgeInsets.only(left: 8.0, right: 8.0), + margin: const EdgeInsets.symmetric(horizontal: 8.0), child: Column( mainAxisSize: .min, children: [ diff --git a/lib/widgets/layouts/login_scaffold.dart b/lib/widgets/layouts/login_scaffold.dart index 8066f1e0..944ca391 100644 --- a/lib/widgets/layouts/login_scaffold.dart +++ b/lib/widgets/layouts/login_scaffold.dart @@ -52,7 +52,7 @@ class LoginScaffold extends StatelessWidget { ), child: Stack( children: [ - if (!MediaQuery.of(context).disableAnimations) + if (!MediaQuery.disableAnimationsOf(context)) ParticleNetwork( maxSpeed: 0.25, particleColor: theme.colorScheme.primary, From 5bcdd6d1b08c26c7529ac27da1e6b7d906658cb0 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Thu, 19 Feb 2026 17:39:58 +0100 Subject: [PATCH 047/333] build: Install lld in snapcraft --- snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index e826e70d..bc908c5c 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -72,6 +72,7 @@ parts: - unzip - xz-utils - zip + - lld override-prime: '' fluffychat: From 66566e6901eb588e0c23de13f8f82d43736117d7 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Thu, 19 Feb 2026 17:48:19 +0100 Subject: [PATCH 048/333] refactor: Use getCryptoIdentityState to check backup state --- lib/pages/chat/events/message_content.dart | 4 +++- .../device_settings/device_settings.dart | 16 +++++--------- lib/pages/settings/settings.dart | 20 ++++++----------- lib/pages/settings/settings_view.dart | 22 ++++++------------- 4 files changed, 22 insertions(+), 40 deletions(-) diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index ef28b964..ad406e55 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/setting_keys.dart'; @@ -57,7 +58,8 @@ class MessageContent extends StatelessWidget { return; } final client = Matrix.of(context).client; - if (client.isUnknownSession && client.encryption!.crossSigning.enabled) { + final state = await client.getCryptoIdentityState(); + if (!state.connected) { final success = await context.push('/backup'); if (success != true) return; } diff --git a/lib/pages/device_settings/device_settings.dart b/lib/pages/device_settings/device_settings.dart index dc655ab8..df7c5f5d 100644 --- a/lib/pages/device_settings/device_settings.dart +++ b/lib/pages/device_settings/device_settings.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:collection/collection.dart' show IterableExtension; -import 'package:matrix/encryption/utils/key_verification.dart'; +import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'package:url_launcher/url_launcher_string.dart'; @@ -40,16 +40,10 @@ class DevicesSettingsController extends State { void _checkChatBackup() async { final client = Matrix.of(context).client; - if (client.encryption?.keyManager.enabled == true) { - if (await client.encryption?.keyManager.isCached() == false || - await client.encryption?.crossSigning.isCached() == false || - client.isUnknownSession && !mounted) { - setState(() { - chatBackupEnabled = false; - }); - return; - } - } + final state = await client.getCryptoIdentityState(); + setState(() { + chatBackupEnabled = state.initialized && !state.connected; + }); } void removeDevicesAction(List devices) async { diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index a54b4205..3f6c7411 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -6,6 +6,7 @@ import 'package:collection/collection.dart'; import 'package:file_picker/file_picker.dart'; import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -61,13 +62,12 @@ class SettingsController extends State { } void logoutAction() async { - final noBackup = showChatBackupBanner == true; if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, title: L10n.of(context).areYouSureYouWantToLogout, message: L10n.of(context).noBackupWarning, - isDestructive: noBackup, + isDestructive: cryptoIdentityConnected == false, okLabel: L10n.of(context).logout, cancelLabel: L10n.of(context).cancel, ) == @@ -167,23 +167,17 @@ class SettingsController extends State { if (client.prevBatch == null) { await client.onSync.stream.first; } - final crossSigning = - await client.encryption?.crossSigning.isCached() ?? false; - final needsBootstrap = - await client.encryption?.keyManager.isCached() == false || - client.encryption?.crossSigning.enabled == false || - !crossSigning; - final isUnknownSession = client.isUnknownSession; + + final state = await client.getCryptoIdentityState(); setState(() { - showChatBackupBanner = needsBootstrap || isUnknownSession; + cryptoIdentityConnected = state.initialized && state.connected; }); } - bool? crossSigningCached; - bool? showChatBackupBanner; + bool? cryptoIdentityConnected; void firstRunBootstrapAction([_]) async { - if (showChatBackupBanner != true) { + if (cryptoIdentityConnected == true) { showOkAlertDialog( context: context, title: L10n.of(context).chatBackup, diff --git a/lib/pages/settings/settings_view.dart b/lib/pages/settings/settings_view.dart index 476c56d8..3b25f30b 100644 --- a/lib/pages/settings/settings_view.dart +++ b/lib/pages/settings/settings_view.dart @@ -22,7 +22,6 @@ class SettingsView extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); - final showChatBackupBanner = controller.showChatBackupBanner; final activeRoute = GoRouter.of( context, ).routeInformationProvider.value.uri.path; @@ -142,20 +141,13 @@ class SettingsView extends StatelessWidget { }, ), Divider(color: theme.dividerColor), - if (showChatBackupBanner == null) - ListTile( - leading: const Icon(Icons.backup_outlined), - title: Text(L10n.of(context).chatBackup), - trailing: const CircularProgressIndicator.adaptive(), - ) - else - SwitchListTile.adaptive( - controlAffinity: ListTileControlAffinity.trailing, - value: controller.showChatBackupBanner == false, - secondary: const Icon(Icons.backup_outlined), - title: Text(L10n.of(context).chatBackup), - onChanged: controller.firstRunBootstrapAction, - ), + SwitchListTile.adaptive( + controlAffinity: ListTileControlAffinity.trailing, + value: controller.cryptoIdentityConnected == true, + secondary: const Icon(Icons.backup_outlined), + title: Text(L10n.of(context).chatBackup), + onChanged: controller.firstRunBootstrapAction, + ), Divider(color: theme.dividerColor), ListTile( leading: const Icon(Icons.format_paint_outlined), From 4a9569156a6067550f0367c6860bfcdc00af5942 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Thu, 19 Feb 2026 17:48:56 +0100 Subject: [PATCH 049/333] build: Update transitive packages --- pubspec.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index e78f876f..f18e1f45 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" charcode: dependency: transitive description: @@ -1112,18 +1112,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.18" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" matrix: dependency: "direct main" description: @@ -1869,26 +1869,26 @@ packages: dependency: transitive description: name: test - sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" url: "https://pub.dev" source: hosted - version: "1.26.3" + version: "1.29.0" test_api: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.9" test_core: dependency: transitive description: name: test_core - sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" + sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" url: "https://pub.dev" source: hosted - version: "0.6.12" + version: "0.6.15" timezone: dependency: transitive description: From c59031c44c2748a79d34a2dfd413c9102901bf2f Mon Sep 17 00:00:00 2001 From: krille-chan Date: Thu, 19 Feb 2026 19:54:36 +0100 Subject: [PATCH 050/333] build: Add llvm-18 to packages for snap --- snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index bc908c5c..0f2a7ad7 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -73,6 +73,7 @@ parts: - xz-utils - zip - lld + - llvm-18 override-prime: '' fluffychat: From d421f7ec768b2a2486a925e2f24dc3a576735778 Mon Sep 17 00:00:00 2001 From: Stephen Date: Fri, 20 Feb 2026 06:08:02 +0200 Subject: [PATCH 051/333] Add lld to install custom dependency for Linux in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c45db560..b118f085 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ flutter build web --release #### Install custom dependencies (Linux) ```bash -sudo apt install libjsoncpp1 libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.0-dev +sudo apt install libjsoncpp1 libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.0-dev lld ``` * Build with one of these: From 5283d0fcc857880756d84937fa28b7f1d1c744cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 20 Feb 2026 14:03:46 +0100 Subject: [PATCH 052/333] refactor: Add more stricter lints --- analysis_options.yaml | 9 ++++- lib/config/isrg_x1.dart | 4 +- lib/pages/chat/command_hints.dart | 38 +++++++++---------- lib/pages/chat/events/html_message.dart | 5 +-- lib/pages/chat_list/chat_list_item.dart | 6 +-- .../chat_search/chat_search_files_tab.dart | 6 +-- lib/pages/login/login.dart | 2 +- .../settings_emotes/settings_emotes.dart | 6 +-- .../push_rule_extensions.dart | 2 +- .../sign_in/view_model/flows/sso_login.dart | 2 +- lib/utils/background_push.dart | 8 ++-- lib/utils/error_reporter.dart | 10 ++--- lib/utils/voip_plugin.dart | 2 +- .../local_notifications_extension.dart | 2 +- pubspec.lock | 24 ++++++------ 15 files changed, 66 insertions(+), 60 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 75a06f44..36171e35 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,7 +2,6 @@ include: package:flutter_lints/flutter.yaml linter: rules: - - camel_case_types - avoid_print - constant_identifier_names - prefer_final_locals @@ -10,6 +9,14 @@ linter: - sort_pub_dependencies - require_trailing_commas - omit_local_variable_types + - cancel_subscriptions + - always_declare_return_types + - no_adjacent_strings_in_list + - test_types_in_equals + - throw_in_finally + - unnecessary_statements + - avoid_bool_literals_in_conditional_expressions + - prefer_single_quotes analyzer: plugins: diff --git a/lib/config/isrg_x1.dart b/lib/config/isrg_x1.dart index 6a6d0ac2..c7b50323 100644 --- a/lib/config/isrg_x1.dart +++ b/lib/config/isrg_x1.dart @@ -1,5 +1,5 @@ // ignore: constant_identifier_names -const String ISRG_X1 = """-----BEGIN CERTIFICATE----- +const String ISRG_X1 = '''-----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 @@ -29,4 +29,4 @@ oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE-----"""; +-----END CERTIFICATE-----'''; diff --git a/lib/pages/chat/command_hints.dart b/lib/pages/chat/command_hints.dart index 212bdf4d..75bc1400 100644 --- a/lib/pages/chat/command_hints.dart +++ b/lib/pages/chat/command_hints.dart @@ -26,41 +26,41 @@ String commandExample(String command) { String commandHint(L10n l10n, String command) { switch (command) { - case "ban": + case 'ban': return l10n.commandHint_ban; - case "clearcache": + case 'clearcache': return l10n.commandHint_clearcache; - case "create": + case 'create': return l10n.commandHint_create; - case "discardsession": + case 'discardsession': return l10n.commandHint_discardsession; - case "dm": + case 'dm': return l10n.commandHint_dm; - case "html": + case 'html': return l10n.commandHint_html; - case "invite": + case 'invite': return l10n.commandHint_invite; - case "join": + case 'join': return l10n.commandHint_join; - case "kick": + case 'kick': return l10n.commandHint_kick; - case "leave": + case 'leave': return l10n.commandHint_leave; - case "me": + case 'me': return l10n.commandHint_me; - case "myroomavatar": + case 'myroomavatar': return l10n.commandHint_myroomavatar; - case "myroomnick": + case 'myroomnick': return l10n.commandHint_myroomnick; - case "op": + case 'op': return l10n.commandHint_op; - case "plain": + case 'plain': return l10n.commandHint_plain; - case "react": + case 'react': return l10n.commandHint_react; - case "send": + case 'send': return l10n.commandHint_send; - case "unban": + case 'unban': return l10n.commandHint_unban; case 'markasdm': return l10n.commandHint_markasdm; @@ -85,6 +85,6 @@ String commandHint(L10n l10n, String command) { case 'logoutall': return l10n.commandHint_logoutall; default: - return ""; + return ''; } } diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart index 668a16ae..906c6c24 100644 --- a/lib/pages/chat/events/html_message.dart +++ b/lib/pages/chat/events/html_message.dart @@ -253,9 +253,8 @@ class HtmlMessage extends StatelessWidget { : checkboxCheckedEvents?.firstWhereOrNull( (event) => event.checkedCheckboxId == checkboxIndex, ); - final staticallyChecked = !isCheckbox - ? false - : node.children.first.attributes['checked'] == 'true'; + final staticallyChecked = + isCheckbox && node.children.first.attributes['checked'] == 'true'; return WidgetSpan( child: Padding( diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index 10f07a80..b3082812 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -56,9 +56,9 @@ class ChatListItem extends StatelessWidget { return const SizedBox.shrink(); } - final needLastEventSender = lastEvent == null - ? false - : room.getState(EventTypes.RoomMember, lastEvent.senderId) == null; + final needLastEventSender = + lastEvent != null && + room.getState(EventTypes.RoomMember, lastEvent.senderId) == null; final space = this.space; return Padding( diff --git a/lib/pages/chat_search/chat_search_files_tab.dart b/lib/pages/chat_search/chat_search_files_tab.dart index 8c5bdc60..4aa95225 100644 --- a/lib/pages/chat_search/chat_search_files_tab.dart +++ b/lib/pages/chat_search/chat_search_files_tab.dart @@ -55,9 +55,9 @@ class ChatSearchFilesTab extends StatelessWidget { 'UNKNOWN'); final sizeString = event.sizeString; final prevEvent = i > 0 ? events[i - 1] : null; - final sameEnvironment = prevEvent == null - ? false - : prevEvent.originServerTs.sameEnvironment(event.originServerTs); + final sameEnvironment = + prevEvent != null && + prevEvent.originServerTs.sameEnvironment(event.originServerTs); return Padding( padding: const EdgeInsets.all(8.0), child: Column( diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index cb2a45d6..fdc2f7ca 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -207,7 +207,7 @@ class LoginController extends State { final data = { 'new_password': password, 'logout_devices': false, - "auth": AuthenticationThreePidCreds( + 'auth': AuthenticationThreePidCreds( type: AuthenticationTypes.emailIdentity, threepidCreds: ThreepidCreds( sid: response.result!.sid, diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart index 0672f163..c2f68a15 100644 --- a/lib/pages/settings_emotes/settings_emotes.dart +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -234,9 +234,9 @@ class EmotesSettingsController extends State { ?.tryGetMap(stateKey ?? '') != null; - bool get readonly => room == null - ? false - : room?.canChangeStateEvent('im.ponies.room_emotes') == false; + bool get readonly => + room != null && + room?.canChangeStateEvent('im.ponies.room_emotes') == false; void resetAction() { setState(() { diff --git a/lib/pages/settings_notifications/push_rule_extensions.dart b/lib/pages/settings_notifications/push_rule_extensions.dart index 4cf53a92..103fbc10 100644 --- a/lib/pages/settings_notifications/push_rule_extensions.dart +++ b/lib/pages/settings_notifications/push_rule_extensions.dart @@ -117,6 +117,6 @@ extension PushRuleKindLocal on PushRuleKind { extension on String { String capitalize() { - return "${this[0].toUpperCase()}${substring(1).toLowerCase()}"; + return '${this[0].toUpperCase()}${substring(1).toLowerCase()}'; } } diff --git a/lib/pages/sign_in/view_model/flows/sso_login.dart b/lib/pages/sign_in/view_model/flows/sso_login.dart index 830693ef..5eb5c3cc 100644 --- a/lib/pages/sign_in/view_model/flows/sso_login.dart +++ b/lib/pages/sign_in/view_model/flows/sso_login.dart @@ -32,7 +32,7 @@ Future ssoLoginFlow( final urlScheme = (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) ? Uri.parse(redirectUrl).scheme - : "http://localhost:3001"; + : 'http://localhost:3001'; final result = await FlutterWebAuth2.authenticate( url: url.toString(), callbackUrlScheme: urlScheme, diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 776af782..bec7d5ef 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -231,7 +231,7 @@ class BackgroundPush { currentPushers.first.data.format == AppSettings.pushNotificationsPusherFormat.value && mapEquals(currentPushers.single.data.additionalProperties, { - "data_message": pusherDataMessageFormat, + 'data_message': pusherDataMessageFormat, })) { Logs().i('[Push] Pusher already set'); } else { @@ -269,7 +269,7 @@ class BackgroundPush { data: PusherData( url: Uri.parse(gatewayUrl!), format: AppSettings.pushNotificationsPusherFormat.value, - additionalProperties: {"data_message": pusherDataMessageFormat}, + additionalProperties: {'data_message': pusherDataMessageFormat}, ), kind: 'http', ), @@ -290,7 +290,7 @@ class BackgroundPush { static bool _wentToRoomOnStartup = false; Future setupPush() async { - Logs().d("SetupPush"); + Logs().d('SetupPush'); if (client.onLoginStateChanged.value != LoginState.loggedIn || !PlatformInfos.isMobile || matrix == null) { @@ -371,7 +371,7 @@ class BackgroundPush { Future setupUp() async { await UnifiedPushUi( context: matrix!.context, - instances: ["default"], + instances: ['default'], unifiedPushFunctions: UPFunctions(), showNoDistribDialog: false, onNoDistribDialogDismissed: () {}, // TODO: Implement me diff --git a/lib/utils/error_reporter.dart b/lib/utils/error_reporter.dart index c0ed2a3e..514d8162 100644 --- a/lib/utils/error_reporter.dart +++ b/lib/utils/error_reporter.dart @@ -15,11 +15,11 @@ class ErrorReporter { const ErrorReporter(this.context, [this.message]); static const Set ingoredTypes = { - "IOException", - "ClientException", - "SocketException", - "TlsException", - "HandshakeException", + 'IOException', + 'ClientException', + 'SocketException', + 'TlsException', + 'HandshakeException', }; void onErrorCallback(Object error, [StackTrace? stackTrace]) { diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart index 62e729ba..27c5d103 100644 --- a/lib/utils/voip_plugin.dart +++ b/lib/utils/voip_plugin.dart @@ -141,7 +141,7 @@ class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate { FlutterForegroundTask.setOnLockScreenVisibility(false); FlutterForegroundTask.stopService(); final wasForeground = matrix.store.getString('wasForeground'); - wasForeground == 'false' ? FlutterForegroundTask.minimizeApp() : null; + if (wasForeground == 'false') FlutterForegroundTask.minimizeApp(); } } } diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index f650d95c..c2dcb7bc 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -135,7 +135,7 @@ extension LocalNotificationsExtension on MatrixState { var action = DesktopNotificationActions.values.singleWhereOrNull( (a) => a.name == actionStr, ); - if (action == null && actionStr == "default") { + if (action == null && actionStr == 'default') { action = DesktopNotificationActions.openChat; } switch (action!) { diff --git a/pubspec.lock b/pubspec.lock index f18e1f45..e78f876f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.0" charcode: dependency: transitive description: @@ -1112,18 +1112,18 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.17" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" matrix: dependency: "direct main" description: @@ -1869,26 +1869,26 @@ packages: dependency: transitive description: name: test - sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" url: "https://pub.dev" source: hosted - version: "1.29.0" + version: "1.26.3" test_api: dependency: transitive description: name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.9" + version: "0.7.7" test_core: dependency: transitive description: name: test_core - sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" url: "https://pub.dev" source: hosted - version: "0.6.15" + version: "0.6.12" timezone: dependency: transitive description: From a0a03941c2c4bbd740584c5cd8907f1e6f2104c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 20 Feb 2026 14:19:03 +0100 Subject: [PATCH 053/333] chore: Avoid unnecessary lambdas --- analysis_options.yaml | 2 ++ lib/pages/chat/chat_event_list.dart | 5 ++--- lib/pages/chat/events/message_content.dart | 2 +- lib/pages/chat/events/message_reactions.dart | 2 +- lib/pages/chat/events/poll.dart | 2 +- lib/pages/chat/recording_view_model.dart | 4 +--- .../chat_access_settings_page.dart | 4 +--- lib/pages/chat_list/chat_list_body.dart | 4 ++-- lib/pages/dialer/dialer.dart | 4 +--- .../matrix_sdk_extensions/device_extension.dart | 14 ++++---------- lib/utils/stream_extension.dart | 2 +- lib/utils/uia_request_manager.dart | 4 +--- lib/utils/url_launcher.dart | 2 +- 13 files changed, 19 insertions(+), 32 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 36171e35..98832a78 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -17,6 +17,8 @@ linter: - unnecessary_statements - avoid_bool_literals_in_conditional_expressions - prefer_single_quotes + - prefer_const_declarations + - unnecessary_lambdas analyzer: plugins: diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index a1e3e953..c0523043 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -155,8 +155,7 @@ class ChatEventList extends StatelessWidget { highlightMarker: controller.scrollToEventIdMarker == event.eventId, onSelect: controller.onSelectMessage, - scrollToEventId: (String eventId) => - controller.scrollToEventId(eventId), + scrollToEventId: controller.scrollToEventId, longPressSelect: controller.selectedEvents.isNotEmpty, selected: controller.selectedEvents.any( (e) => e.eventId == event.eventId, @@ -164,7 +163,7 @@ class ChatEventList extends StatelessWidget { singleSelected: controller.selectedEvents.singleOrNull?.eventId == event.eventId, - onEdit: () => controller.editSelectedEventAction(), + onEdit: controller.editSelectedEventAction, timeline: timeline, displayReadMarker: i > 0 && controller.readMarkerEventId == event.eventId, diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index ad406e55..cf1f07f4 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -207,7 +207,7 @@ class MessageContent extends StatelessWidget { .split(';') .first .split(',') - .map((s) => double.tryParse(s)) + .map(double.tryParse) .toList(); if (latlong.length == 2 && latlong.first != null && diff --git a/lib/pages/chat/events/message_reactions.dart b/lib/pages/chat/events/message_reactions.dart index 86d8ade6..4bafaa6f 100644 --- a/lib/pages/chat/events/message_reactions.dart +++ b/lib/pages/chat/events/message_reactions.dart @@ -66,7 +66,7 @@ class MessageReactions extends StatelessWidget { if (evt != null) { showFutureLoadingDialog( context: context, - future: () => evt.redactEvent(), + future: evt.redactEvent, ); } } else { diff --git a/lib/pages/chat/events/poll.dart b/lib/pages/chat/events/poll.dart index 7cc57dc7..d4506602 100644 --- a/lib/pages/chat/events/poll.dart +++ b/lib/pages/chat/events/poll.dart @@ -25,7 +25,7 @@ class PollWidget extends StatelessWidget { }); void _endPoll(BuildContext context) => - showFutureLoadingDialog(context: context, future: () => event.endPoll()); + showFutureLoadingDialog(context: context, future: event.endPoll); void _toggleVote(BuildContext context, String answerId, int maxSelection) { final userId = event.room.client.userID!; diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index 815d8b11..40a4320f 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -145,9 +145,7 @@ class RecordingViewModelState extends State { } void cancel() { - setState(() { - _reset(); - }); + setState(_reset); } void pause() { diff --git a/lib/pages/chat_access_settings/chat_access_settings_page.dart b/lib/pages/chat_access_settings/chat_access_settings_page.dart index a2f04079..5c1c55c6 100644 --- a/lib/pages/chat_access_settings/chat_access_settings_page.dart +++ b/lib/pages/chat_access_settings/chat_access_settings_page.dart @@ -181,9 +181,7 @@ class ChatAccessSettingsPageView extends StatelessWidget { return const SizedBox.shrink(); } localAddresses.remove(room.canonicalAlias); - localAddresses.removeWhere( - (alias) => altAliases.contains(alias), - ); + localAddresses.removeWhere(altAliases.contains); return Column( mainAxisSize: .min, children: localAddresses diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index 38253d05..ba1fee31 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -35,7 +35,7 @@ class ChatListViewBody extends StatelessWidget { key: ValueKey(activeSpace), spaceId: activeSpace, onBack: controller.clearActiveSpace, - onChatTab: (room) => controller.onChatTap(room), + onChatTab: controller.onChatTap, activeChat: controller.activeChat, ); } @@ -123,7 +123,7 @@ class ChatListViewBody extends StatelessWidget { if (!controller.isSearchMode && AppSettings.showPresences.value) GestureDetector( - onLongPress: () => controller.dismissStatusList(), + onLongPress: controller.dismissStatusList, child: StatusMessageList( onStatusEdit: controller.setStatus, ), diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index 006ef3d5..ae2d5655 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -194,9 +194,7 @@ class MyCallingPage extends State { call.onCallStateChanged.stream.listen(_handleCallState); call.onCallEventChanged.stream.listen((event) { if (event == CallStateChange.kFeedsChanged) { - setState(() { - call.tryRemoveStopedStreams(); - }); + setState(call.tryRemoveStopedStreams); } else if (event == CallStateChange.kLocalHoldUnhold || event == CallStateChange.kRemoteHoldUnhold) { setState(() {}); diff --git a/lib/utils/matrix_sdk_extensions/device_extension.dart b/lib/utils/matrix_sdk_extensions/device_extension.dart index 3872309c..6f8ec4ed 100644 --- a/lib/utils/matrix_sdk_extensions/device_extension.dart +++ b/lib/utils/matrix_sdk_extensions/device_extension.dart @@ -4,10 +4,10 @@ import 'package:matrix/matrix.dart'; IconData _getIconFromName(String displayname) { final name = displayname.toLowerCase(); - if ({'android'}.any((s) => name.contains(s))) { + if ({'android'}.any(name.contains)) { return Icons.phone_android_outlined; } - if ({'ios', 'ipad', 'iphone', 'ipod'}.any((s) => name.contains(s))) { + if ({'ios', 'ipad', 'iphone', 'ipod'}.any(name.contains)) { return Icons.phone_iphone_outlined; } if ({ @@ -19,16 +19,10 @@ IconData _getIconFromName(String displayname) { '/_matrix', 'safari', 'opera', - }.any((s) => name.contains(s))) { + }.any(name.contains)) { return Icons.web_outlined; } - if ({ - 'desktop', - 'windows', - 'macos', - 'linux', - 'ubuntu', - }.any((s) => name.contains(s))) { + if ({'desktop', 'windows', 'macos', 'linux', 'ubuntu'}.any(name.contains)) { return Icons.desktop_mac_outlined; } return Icons.device_unknown_outlined; diff --git a/lib/utils/stream_extension.dart b/lib/utils/stream_extension.dart index 66e840fc..80983b50 100644 --- a/lib/utils/stream_extension.dart +++ b/lib/utils/stream_extension.dart @@ -35,7 +35,7 @@ extension StreamExtension on Stream { }; final subscription = listen( (_) => onMessage?.call(), - onDone: () => controller.close(), + onDone: controller.close, onError: (e, s) => controller.addError(e, s), ); // add proper cleanup to the subscription and the controller, to not memory leak diff --git a/lib/utils/uia_request_manager.dart b/lib/utils/uia_request_manager.dart index 34a51b1c..e422f966 100644 --- a/lib/utils/uia_request_manager.dart +++ b/lib/utils/uia_request_manager.dart @@ -105,9 +105,7 @@ extension UiaRequestManager on MatrixState { launchUrl(url, mode: LaunchMode.inAppBrowserView); final completer = Completer(); - final listener = AppLifecycleListener( - onResume: () => completer.complete(), - ); + final listener = AppLifecycleListener(onResume: completer.complete); await completer.future; listener.dispose(); diff --git a/lib/utils/url_launcher.dart b/lib/utils/url_launcher.dart index 47613e5d..994d40c4 100644 --- a/lib/utils/url_launcher.dart +++ b/lib/utils/url_launcher.dart @@ -66,7 +66,7 @@ class UrlLauncher { .split(';') .first .split(',') - .map((s) => double.tryParse(s)) + .map(double.tryParse) .toList(); if (latlong.length == 2 && latlong.first != null && From a9a8b3946535bef90be76845292963b66ed6261e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 20 Feb 2026 17:12:53 +0100 Subject: [PATCH 054/333] Revert "refactor: Avoid unnecessary bool comparison" This reverts commit 1cd3a9103790bbff0aef4cb29cb69038241fb7c4. --- analysis_options.yaml | 3 +-- lib/pages/bootstrap/bootstrap_dialog.dart | 3 ++- lib/pages/chat/chat.dart | 6 +++--- lib/pages/chat/chat_input_row.dart | 2 +- lib/pages/chat/chat_view.dart | 2 +- lib/pages/chat/events/audio_player.dart | 2 +- lib/pages/chat/recording_view_model.dart | 4 ++-- .../chat_access_settings_controller.dart | 2 +- lib/pages/chat_list/chat_list.dart | 12 +++++++----- lib/pages/chat_list/status_msg_list.dart | 2 +- lib/pages/image_viewer/image_viewer.dart | 2 +- lib/pages/image_viewer/video_player.dart | 2 +- .../flutter_matrix_dart_sdk_database/cipher.dart | 2 +- lib/utils/voip_plugin.dart | 2 +- 14 files changed, 24 insertions(+), 22 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 98832a78..6d17e303 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -37,7 +37,6 @@ dart_code_linter: - avoid-unnecessary-type-assertions - avoid-unnecessary-type-casts - avoid-unrelated-type-assertions - - no-boolean-literal-compare - no-equal-then-else - prefer-first - prefer-last @@ -66,4 +65,4 @@ dart_code_linter: # - avoid-returning-widgets # - prefer-single-widget-per-file: # ignore-private-widgets: true - # - prefer-extracting-callbacks \ No newline at end of file + # - prefer-extracting-callbacks diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index aa1d1dc6..592bb3e8 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -161,7 +161,8 @@ class BootstrapDialogState extends State { Widget body = const Center(child: CircularProgressIndicator.adaptive()); titleText = L10n.of(context).loadingPleaseWait; - if (bootstrap.newSsssKey?.recoveryKey != null && _recoveryKeyStored) { + if (bootstrap.newSsssKey?.recoveryKey != null && + _recoveryKeyStored == false) { final key = bootstrap.newSsssKey!.recoveryKey; titleText = L10n.of(context).recoveryKey; return LoginScaffold( diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 88eed4d2..15b36b98 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -249,9 +249,9 @@ class ChatController extends State } if (!scrollController.hasClients) return; if (timeline?.allowNewEvent == false || - scrollController.position.pixels > 0 && _scrolledUp) { + scrollController.position.pixels > 0 && _scrolledUp == false) { setState(() => _scrolledUp = true); - } else if (scrollController.position.pixels <= 0 && _scrolledUp) { + } else if (scrollController.position.pixels <= 0 && _scrolledUp == true) { setState(() => _scrolledUp = false); setReadMarker(); } @@ -919,7 +919,7 @@ class ChatController extends State final clients = Matrix.of(context).currentBundle; for (final event in selectedEvents) { if (!event.status.isSent) return false; - if (event.canRedact && + if (event.canRedact == false && !(clients!.any((cl) => event.senderId == cl!.userID))) { return false; } diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 848e51c8..90173d23 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -317,7 +317,7 @@ class ChatInputRow extends StatelessWidget { autofocus: !PlatformInfos.isMobile, keyboardType: TextInputType.multiline, textInputAction: - AppSettings.sendOnEnter.value && + AppSettings.sendOnEnter.value == true && PlatformInfos.isMobile ? TextInputAction.send : null, diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index c22d9e4d..23e0b8ad 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -364,7 +364,7 @@ class ChatView extends StatelessWidget { ? theme.colorScheme.tertiaryContainer : theme.colorScheme.surfaceContainerHigh, borderRadius: BorderRadius.circular(32), - child: controller.room.isAbandonedDMRoom + child: controller.room.isAbandonedDMRoom == true ? Row( mainAxisAlignment: .spaceEvenly, children: [ diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index b6890b54..fd631cbc 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -179,7 +179,7 @@ class AudioPlayerState extends State { matrixFile.mimeType.toLowerCase() == 'audio/ogg') { Logs().v('Convert ogg audio file for iOS...'); final convertedFile = File('${file.path}.caf'); - if (await convertedFile.exists()) { + if (await convertedFile.exists() == false) { OpusCaf().convertOpusToCaf(file.path, convertedFile.path); } file = convertedFile; diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index 40a4320f..0c75182c 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -55,7 +55,7 @@ class RecordingViewModelState extends State { return; } } - if (await AudioRecorder().hasPermission()) return; + if (await AudioRecorder().hasPermission() == false) return; final audioRecorder = _audioRecorder ??= AudioRecorder(); setState(() {}); @@ -76,7 +76,7 @@ class RecordingViewModelState extends State { } final result = await audioRecorder.hasPermission(); - if (!result) { + if (result != true) { showOkAlertDialog( context: context, title: L10n.of(context).oopsSomethingWentWrong, diff --git a/lib/pages/chat_access_settings/chat_access_settings_controller.dart b/lib/pages/chat_access_settings/chat_access_settings_controller.dart index 95e95e92..4161099f 100644 --- a/lib/pages/chat_access_settings/chat_access_settings_controller.dart +++ b/lib/pages/chat_access_settings/chat_access_settings_controller.dart @@ -320,7 +320,7 @@ class ChatAccessSettingsController extends State { try { await room.client.setRoomVisibilityOnDirectory( room.id, - visibility: visibility ? Visibility.public : Visibility.private, + visibility: visibility == true ? Visibility.public : Visibility.private, ); setState(() {}); } catch (e, s) { diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 9041daf2..aae3a10c 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -168,8 +168,9 @@ class ChatListController extends State initialText: searchServer, keyboardType: TextInputType.url, autocorrect: false, - validator: (server) => - server.contains('.') ? null : L10n.of(context).invalidServerName, + validator: (server) => server.contains('.') == true + ? null + : L10n.of(context).invalidServerName, ); if (newServer == null) return; Matrix.of(context).store.setString(_serverStoreNamespace, newServer); @@ -202,9 +203,10 @@ class ChatListController extends State if (searchQuery.isValidMatrixId && searchQuery.sigil == '#' && - !roomSearchResult.chunk.any( - (room) => room.canonicalAlias == searchQuery, - )) { + roomSearchResult.chunk.any( + (room) => room.canonicalAlias == searchQuery, + ) == + false) { final response = await client.getRoomIdByAlias(searchQuery); final roomId = response.roomId; if (roomId != null) { diff --git a/lib/pages/chat_list/status_msg_list.dart b/lib/pages/chat_list/status_msg_list.dart index d89e75d4..7677e031 100644 --- a/lib/pages/chat_list/status_msg_list.dart +++ b/lib/pages/chat_list/status_msg_list.dart @@ -314,7 +314,7 @@ extension on CachedPresence { ? DateTime.now() : DateTime.fromMillisecondsSinceEpoch(0)); - LinearGradient get gradient => presence.isOnline + LinearGradient get gradient => presence.isOnline == true ? LinearGradient( colors: [Colors.green, Colors.green.shade200, Colors.green.shade900], begin: Alignment.topLeft, diff --git a/lib/pages/image_viewer/image_viewer.dart b/lib/pages/image_viewer/image_viewer.dart index 18b73324..1dba46b2 100644 --- a/lib/pages/image_viewer/image_viewer.dart +++ b/lib/pages/image_viewer/image_viewer.dart @@ -110,7 +110,7 @@ class ImageViewerController extends State { /// Go back if user swiped it away void onInteractionEnds(ScaleEndDetails endDetails) { - if (!PlatformInfos.usesTouchscreen) { + if (PlatformInfos.usesTouchscreen == false) { if (endDetails.velocity.pixelsPerSecond.dy > MediaQuery.sizeOf(context).height * maxScaleFactor) { Navigator.of(context, rootNavigator: false).pop(); diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index 3c8c5792..5ca9fcc2 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -73,7 +73,7 @@ class EventVideoPlayerState extends State { widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last, ); final file = File('${tempDir.path}/${fileName}_${videoFile.name}'); - if (!await file.exists()) { + if (await file.exists() == false) { await file.writeAsBytes(videoFile.bytes); } videoPlayerController = VideoPlayerController.file(file); diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart index 775c98dd..a91c79f2 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart @@ -50,7 +50,7 @@ Future getDatabaseCipher() async { void _sendNoEncryptionWarning(Object exception) async { final isStored = AppSettings.noEncryptionWarningShown.value; - if (isStored) return; + if (isStored == true) return; final l10n = await lookupL10n(PlatformDispatcher.instance.locale); ClientManager.sendInitNotification( diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart index 27c5d103..fb5c5714 100644 --- a/lib/utils/voip_plugin.dart +++ b/lib/utils/voip_plugin.dart @@ -117,7 +117,7 @@ class VoipPlugin with WidgetsBindingObserver implements WebRTCDelegate { await matrix.store.setString( 'wasForeground', - wasForeground ? 'true' : 'false', + wasForeground == true ? 'true' : 'false', ); FlutterForegroundTask.setOnLockScreenVisibility(true); FlutterForegroundTask.wakeUpScreen(); From 162a594d8005a227b0f5ec23f610d81fd5866887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 20 Feb 2026 17:28:19 +0100 Subject: [PATCH 055/333] feat: Reenable native imaging for all platforms --- lib/utils/client_manager.dart | 2 + lib/utils/custom_image_resizer.dart | 101 ++++++++++++++++++++++++++++ pubspec.lock | 12 +++- pubspec.yaml | 1 + scripts/prepare-web.sh | 13 +++- 5 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 lib/utils/custom_image_resizer.dart diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 31ef6397..713461ce 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:fluffychat/utils/custom_image_resizer.dart'; import 'package:flutter/foundation.dart'; import 'package:collection/collection.dart'; @@ -122,6 +123,7 @@ abstract class ClientManager { // To make room emotes work 'im.ponies.room_emotes', }, + customImageResizer: customImageResizer, logLevel: kReleaseMode ? Level.warning : Level.verbose, database: await flutterMatrixSdkDatabaseBuilder(clientName), supportedLoginTypes: { diff --git a/lib/utils/custom_image_resizer.dart b/lib/utils/custom_image_resizer.dart new file mode 100644 index 00000000..9be5f206 --- /dev/null +++ b/lib/utils/custom_image_resizer.dart @@ -0,0 +1,101 @@ +import 'dart:ui'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/painting.dart'; + +import 'package:matrix/matrix.dart'; +import 'package:native_imaging/native_imaging.dart' as native; + +(int, int) _scaleToBox(int width, int height, {required int boxSize}) { + final fit = applyBoxFit( + BoxFit.scaleDown, + Size(width.toDouble(), height.toDouble()), + Size(boxSize.toDouble(), boxSize.toDouble()), + ).destination; + return (fit.width.round(), fit.height.round()); +} + +Future customImageResizer( + MatrixImageFileResizeArguments arguments, +) async { + await native.init(); + + var imageBytes = arguments.bytes; + String? blurhash; + + var originalWidth = 0; + var originalHeight = 0; + var width = 0; + var height = 0; + + try { + // for the other platforms + final dartCodec = await instantiateImageCodec(arguments.bytes); + final frameCount = dartCodec.frameCount; + final dartFrame = await dartCodec.getNextFrame(); + final rgbaData = await dartFrame.image.toByteData(); + if (rgbaData == null) { + return null; + } + final rgba = Uint8List.view( + rgbaData.buffer, + rgbaData.offsetInBytes, + rgbaData.lengthInBytes, + ); + + width = originalWidth = dartFrame.image.width; + height = originalHeight = dartFrame.image.height; + + var nativeImg = native.Image.fromRGBA(width, height, rgba); + + dartFrame.image.dispose(); + dartCodec.dispose(); + + if (arguments.calcBlurhash) { + // scale down image for blurhashing to speed it up + final (blurW, blurH) = _scaleToBox(width, height, boxSize: 100); + final blurhashImg = nativeImg.resample( + blurW, + blurH, + // nearest is unsupported... + native.Transform.bilinear, + ); + + blurhash = blurhashImg.toBlurhash(3, 3); + + blurhashImg.free(); + } + + if (frameCount > 1) { + // Don't scale down animated images, since those would lose frames. + nativeImg.free(); + } else { + final max = arguments.maxDimension; + if (width > max || height > max) { + (width, height) = _scaleToBox(width, height, boxSize: max); + + final scaledImg = nativeImg.resample( + width, + height, + native.Transform.lanczos, + ); + nativeImg.free(); + nativeImg = scaledImg; + } + + imageBytes = await nativeImg.toJpeg(75); + nativeImg.free(); + } + } catch (e, s) { + Logs().e('Could not generate preview', e, s); + } + + return MatrixImageFileResizedResponse( + bytes: imageBytes, + width: width, + height: height, + originalWidth: originalWidth, + originalHeight: originalHeight, + blurhash: blurhash, + ); +} diff --git a/pubspec.lock b/pubspec.lock index e78f876f..7a779236 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -984,10 +984,10 @@ packages: dependency: transitive description: name: js - sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.6.7" json_annotation: dependency: transitive description: @@ -1156,6 +1156,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + native_imaging: + dependency: "direct main" + description: + name: native_imaging + sha256: b910bd7c4fae77d9f91fb59840995e4fb91505b20a46ee1be88db3e4c4e219c4 + url: "https://pub.dev" + source: hosted + version: "0.3.0" native_toolchain_c: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9fd3fc71..5fd6fa5a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -55,6 +55,7 @@ dependencies: linkify: ^5.0.0 matrix: ^6.1.1 mime: ^2.0.0 + native_imaging: ^0.3.0 opus_caf_converter_dart: ^1.0.1 package_info_plus: ^9.0.0 particles_network: ^1.9.3 diff --git a/scripts/prepare-web.sh b/scripts/prepare-web.sh index 08527420..b4ec1889 100755 --- a/scripts/prepare-web.sh +++ b/scripts/prepare-web.sh @@ -1,5 +1,6 @@ #!/bin/sh -ve +# Compile Vodozemac for web version=$(yq ".dependencies.flutter_vodozemac" < pubspec.yaml) version=$(expr "$version" : '\^*\(.*\)') git clone https://github.com/famedly/dart-vodozemac.git -b ${version} .vodozemac @@ -10,6 +11,14 @@ cd .. rm -f ./assets/vodozemac/vodozemac_bindings_dart* mv .vodozemac/dart/web/pkg/vodozemac_bindings_dart* ./assets/vodozemac/ rm -rf .vodozemac - flutter pub get -dart compile js ./web/native_executor.dart -o ./web/native_executor.js -m \ No newline at end of file +dart compile js ./web/native_executor.dart -o ./web/native_executor.js -m + +# Download native_imaging for web: +version=$(yq ".dependencies.native_imaging" < pubspec.yaml) +version=$(expr "$version" : '\^*\(.*\)') +curl -L "https://github.com/famedly/dart_native_imaging/releases/download/v${version}/native_imaging.zip" > native_imaging.zip +unzip native_imaging.zip +mv js/* web/ +rmdir js +rm native_imaging.zip \ No newline at end of file From 74cfee334e88d43d697c3e57edd71ca157f6f965 Mon Sep 17 00:00:00 2001 From: Dimitri Tabatadze Date: Mon, 2 Feb 2026 12:50:30 +0100 Subject: [PATCH 056/333] chore(translations): Translated using Weblate (Georgian) Currently translated at 17.9% (150 of 835 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ka/ --- lib/l10n/intl_ka.arb | 42 +++++++++++++++--------------------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/lib/l10n/intl_ka.arb b/lib/l10n/intl_ka.arb index c8778128..0275d6c6 100644 --- a/lib/l10n/intl_ka.arb +++ b/lib/l10n/intl_ka.arb @@ -5,9 +5,7 @@ "placeholders": {} }, "appLockDescription": "პინკოდის გამოყენების გარეშე აპლიკაციის ბლოკირება", - "@appLockDescription": {}, "commandHint_hug": "მეგობრული ჩახუტვის გაგზავნა", - "@commandHint_hug": {}, "areYouSure": "დარწმუნებული ხართ?", "@areYouSure": { "type": "String", @@ -60,7 +58,6 @@ } }, "sendOnEnter": "გაგზავნა enter-ის დაჭერისას", - "@sendOnEnter": {}, "bannedUser": "{username} დაბლოკა {targetName}", "@bannedUser": { "type": "String", @@ -134,7 +131,6 @@ "placeholders": {} }, "yourChatBackupHasBeenSetUp": "თქვენი ჩატის სარეზერვო საშუალება კონფიგურირებული იქნა.", - "@yourChatBackupHasBeenSetUp": {}, "channelCorruptedDecryptError": "დაშიფვრა დაზიანდა", "@channelCorruptedDecryptError": { "type": "String", @@ -195,7 +191,6 @@ } }, "createGroup": "ჯგუფის შექმნა", - "@createGroup": {}, "deactivateAccountWarning": "ეს გააუქმებს თქვენს ანგარიშს. ამის გაუქმება შეუძლებელია. დარწმუნებული ხართ?", "@deactivateAccountWarning": { "type": "String", @@ -212,7 +207,6 @@ "placeholders": {} }, "chatPermissions": "ჩატის უფლებები", - "@chatPermissions": {}, "dateAndTimeOfDay": "{date}, {timeOfDay}", "@dateAndTimeOfDay": { "type": "String", @@ -240,22 +234,17 @@ "type": "String", "placeholders": {} }, - "importNow": "იმპორტი", - "@importNow": {}, - "importEmojis": "ემოჯის იმპორტი", - "@importEmojis": {}, + "importNow": "დაიმპორტება", + "importEmojis": "ემოჯის დაიმპორტება", "importFromZipFile": "იმპორტი .zip ფაილიდან", - "@importFromZipFile": {}, "exportEmotePack": "ემოციების .zip ფაილში ექსპორტი", - "@exportEmotePack": {}, "replace": "ჩანაცვლება", - "@replace": {}, "accept": "თანხმობა", "@accept": { "type": "String", "placeholders": {} }, - "acceptedTheInvitation": "👍 {username} მიიღო მოწვევა", + "acceptedTheInvitation": "👍 {username}-მ(ა) მიიღო მოწვევა", "@acceptedTheInvitation": { "type": "String", "placeholders": { @@ -275,11 +264,8 @@ "placeholders": {} }, "confirmMatrixId": "გთხოვთ, დაადასტუროთ თქვენი Matrix ID ანგარიშის წაშლისათვის.", - "@confirmMatrixId": {}, "addChatDescription": "ჩატის აღწერილობის დამატება...", - "@addChatDescription": {}, "addToSpace": "სივრცეში დამატება", - "@addToSpace": {}, "admin": "ადმინი", "@admin": { "type": "String", @@ -296,7 +282,6 @@ "placeholders": {} }, "commandHint_cuddle": "ჩახუტების გაგზავნა", - "@commandHint_cuddle": {}, "answeredTheCall": "{senderName} უპასუხა ზარს", "@answeredTheCall": { "type": "String", @@ -322,7 +307,6 @@ "placeholders": {} }, "commandHint_googly": "გამოშტერილი თვალების გაგზავნა", - "@commandHint_googly": {}, "googlyEyesContent": "{senderName} გამოშტერილ თვალებს გიგზავნის", "@googlyEyesContent": { "type": "String", @@ -356,7 +340,6 @@ } }, "sendTypingNotifications": "წერის შეტყობინების გაგზავნა", - "@sendTypingNotifications": {}, "cantOpenUri": "ვერ იხსნება ბმული {uri}", "@cantOpenUri": { "type": "String", @@ -504,7 +487,6 @@ "placeholders": {} }, "chatHasBeenAddedToThisSpace": "ჩატი დაემატა ამ სივრცეს", - "@chatHasBeenAddedToThisSpace": {}, "chats": "ჩატები", "@chats": { "type": "String", @@ -516,14 +498,12 @@ "placeholders": {} }, "clearArchive": "არქივის გაწმენდა", - "@clearArchive": {}, "close": "დახურვა", "@close": { "type": "String", "placeholders": {} }, "commandHint_markasgroup": "აღნიშვნა, როგორც ჯგუფის", - "@commandHint_markasgroup": {}, "commandHint_ban": "მოცემული მომხმარებლის ბლოკირება ამ ოთახში", "@commandHint_ban": { "type": "String", @@ -724,17 +704,14 @@ "placeholders": {} }, "globalChatId": "გლობალური ჩატის ID", - "@globalChatId": {}, "repeatPassword": "გაიმეორეთ პაროლი", - "@repeatPassword": {}, "notAnImage": "ფაილი არაა სურათი.", - "@notAnImage": {}, "remove": "წაშლა", "@remove": { "type": "String", "placeholders": {} }, - "activatedEndToEndEncryption": "🔐 {username} გააქტიურა end to end დაშიფვრა", + "activatedEndToEndEncryption": "🔐 {username}-მ(ა) გააქტიურა end to end დაშიფვრა", "@activatedEndToEndEncryption": { "type": "String", "placeholders": { @@ -828,5 +805,16 @@ "@editDisplayname": { "type": "String", "placeholders": {} + }, + "ignoreUser": "დაიგნორება", + "normalUser": "ჩვეულებრვი მომხმარებელი", + "aboutHomeserver": "{homeserver}-ის შესახებ", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } } } From dbcc4b594f67214682a1d9d3eedf14e925b8b5f7 Mon Sep 17 00:00:00 2001 From: saok91 Date: Mon, 2 Feb 2026 13:23:07 +0100 Subject: [PATCH 057/333] chore(translations): Translated using Weblate (Persian) Currently translated at 93.6% (782 of 835 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/fa/ --- lib/l10n/intl_fa.arb | 6406 ++++++++++++++++++++---------------------- 1 file changed, 3023 insertions(+), 3383 deletions(-) diff --git a/lib/l10n/intl_fa.arb b/lib/l10n/intl_fa.arb index ea9b6928..6c2937e0 100644 --- a/lib/l10n/intl_fa.arb +++ b/lib/l10n/intl_fa.arb @@ -1,3386 +1,3026 @@ { - "@@last_modified": "2021-08-14 12:41:10.061080", - "repeatPassword": "تکرار گذرواژه", - "@repeatPassword": {}, - "about": "درباره", - "@about": { - "type": "String", - "placeholders": {} - }, - "accept": "پذیرش", - "@accept": { - "type": "String", - "placeholders": {} - }, - "acceptedTheInvitation": "👍 {username} دعوت را پذیرفت", - "@acceptedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "account": "حساب", - "@account": { - "type": "String", - "placeholders": {} - }, - "addToSpace": "به فضا افزودن", - "@addToSpace": {}, - "appLock": "قفل برنامه", - "@appLock": { - "type": "String", - "placeholders": {} - }, - "all": "همه", - "@all": { - "type": "String", - "placeholders": {} - }, - "allChats": "همه گپ‌ها", - "@allChats": { - "type": "String", - "placeholders": {} - }, - "addEmail": "افزودن رایانامه", - "@addEmail": { - "type": "String", - "placeholders": {} - }, - "answeredTheCall": "{senderName} به تماس پاسخ داد", - "@answeredTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "anyoneCanJoin": "هرکسی می‌تواند بپیوندد", - "@anyoneCanJoin": { - "type": "String", - "placeholders": {} - }, - "archive": "بایگانی", - "@archive": { - "type": "String", - "placeholders": {} - }, - "areYouSure": "مطمئن هستید؟", - "@areYouSure": { - "type": "String", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "مطمئن هستید می‌خواهید خارج شوید؟", - "@areYouSureYouWantToLogout": { - "type": "String", - "placeholders": {} - }, - "activatedEndToEndEncryption": "🔐 {username} رمزنگاری سراسری را فعال کرد", - "@activatedEndToEndEncryption": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "admin": "مدیر", - "@admin": { - "type": "String", - "placeholders": {} - }, - "supposedMxid": "گمان میرود {mxid} باشد", - "@supposedMxid": { - "type": "String", - "placeholders": { - "mxid": { - "type": "String" - } - } - }, - "botMessages": "پیام‌های ربات", - "@botMessages": { - "type": "String", - "placeholders": {} - }, - "changedTheDisplaynameTo": "{username} نام نمایشی را به '{displayname}' تغییر داد", - "@changedTheDisplaynameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "displayname": { - "type": "String" - } - } - }, - "confirmMatrixId": "برای پاک کردن حساب، لطفاً هویت ماتریکس خود را بپذیرید.", - "@confirmMatrixId": {}, - "changeDeviceName": "تغییر نام دستگاه", - "@changeDeviceName": { - "type": "String", - "placeholders": {} - }, - "alias": "نام مستعار", - "@alias": { - "type": "String", - "placeholders": {} - }, - "banFromChat": "محروم کردن از گپ", - "@banFromChat": { - "type": "String", - "placeholders": {} - }, - "askVerificationRequest": "آیا درخواست بازبینی {username} را می‌پذیرید؟", - "@askVerificationRequest": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "areGuestsAllowedToJoin": "آیا مهمانان اجازه پیوستن دارند", - "@areGuestsAllowedToJoin": { - "type": "String", - "placeholders": {} - }, - "autoplayImages": "پخش خودکار شکلک‌ها و برچسب‌های متحرک", - "@autoplayImages": { - "type": "String", - "placeholder": {} - }, - "sendOnEnter": "فرستادن با کلید Enter", - "@sendOnEnter": {}, - "cancel": "رد کردن", - "@cancel": { - "type": "String", - "placeholders": {} - }, - "changedTheChatDescriptionTo": "{username} توضیح گپ را به '{description}' تغییر داد", - "@changedTheChatDescriptionTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "description": { - "type": "String" - } - } - }, - "changedTheChatPermissions": "{username} دسترسی‌های گپ را تغییر داد", - "@changedTheChatPermissions": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheChatNameTo": "{username} نام گپ را به '{chatname}' تغییر داد", - "@changedTheChatNameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "chatname": { - "type": "String" - } - } - }, - "cantOpenUri": "نمی‌توان پیوند {uri} را باز کرد", - "@cantOpenUri": { - "type": "String", - "placeholders": { - "uri": { - "type": "String" - } - } - }, - "banned": "محروم‌شده", - "@banned": { - "type": "String", - "placeholders": {} - }, - "bannedUser": "{username} کاربر {targetName} را محروم کرد", - "@bannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "blockDevice": "مسدود کردن دستگاه", - "@blockDevice": { - "type": "String", - "placeholders": {} - }, - "blocked": "مسدود‌شده", - "@blocked": { - "type": "String", - "placeholders": {} - }, - "badServerLoginTypesException": "سرور از این نوع ورود پشتیبانی می‌کند:\n{serverVersions}\nاما برنامه تنها از این‌ها پشتیبانی می‌کند:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "badServerVersionsException": "سرور از این نسخه‌های مشخصات پشتیبانی می‌کند:\n{serverVersions}\nاما برنامه تنها از این‌ها پشتیبانی می‌کند:\n{supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "changedTheChatAvatar": "{username} نماد گپ را تغییر داد", - "@changedTheChatAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheGuestAccessRules": "{username} قوانین دسترسی مهمان را تغییر داد", - "@changedTheGuestAccessRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheProfileAvatar": "{username} نماد نمایه را تغییر داد", - "@changedTheProfileAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "chats": "گپ‌ها", - "@chats": { - "type": "String", - "placeholders": {} - }, - "messages": "پیام‌ها", - "@messages": { - "type": "String", - "placeholders": {} - }, - "send": "فرستادن", - "@send": { - "type": "String", - "placeholders": {} - }, - "sendAudio": "فرستادن صدا", - "@sendAudio": { - "type": "String", - "placeholders": {} - }, - "sendOriginal": "فرستادن نسخه اصلی", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "changedTheRoomAliases": "{username} نام‌های مستعار اتاق را تغییر داد", - "@changedTheRoomAliases": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheRoomInvitationLink": "{username} پیوند دعوت را تغییر داد", - "@changedTheRoomInvitationLink": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "close": "بستن", - "@close": { - "type": "String", - "placeholders": {} - }, - "sendImage": "فرستادن تصویر", - "@sendImage": { - "type": "String", - "placeholders": {} - }, - "sendMessages": "فرستادن پیام‌ها", - "@sendMessages": { - "type": "String", - "placeholders": {} - }, - "changedTheHistoryVisibility": "{username} ویژگی دیدن تاریخچه را تغییر داد", - "@changedTheHistoryVisibility": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheGuestAccessRulesTo": "{username} قوانین دسترسی مهمان را به {rules} تغییر داد", - "@changedTheGuestAccessRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheJoinRulesTo": "{username} قوانین پیوستن را به {joinRules} تغییر داد", - "@changedTheJoinRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "joinRules": { - "type": "String" - } - } - }, - "changedTheHistoryVisibilityTo": "{username} ویژگی دیدن تاریخچه را به {rules} تغییر داد", - "@changedTheHistoryVisibilityTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "chooseAStrongPassword": "یک گذرواژه قوی انتخاب کنید", - "@chooseAStrongPassword": { - "type": "String", - "placeholders": {} - }, - "yourChatBackupHasBeenSetUp": "پشتیبان گپ شما تنظیم شد.", - "@yourChatBackupHasBeenSetUp": {}, - "changeTheme": "تغییر پوسته", - "@changeTheme": { - "type": "String", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "تغییر نام گروه", - "@changeTheNameOfTheGroup": { - "type": "String", - "placeholders": {} - }, - "changeYourAvatar": "تغییر نماد نمایه", - "@changeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "channelCorruptedDecryptError": "رمزنگاری مخدوش شده است", - "@channelCorruptedDecryptError": { - "type": "String", - "placeholders": {} - }, - "clearArchive": "پاک کردن بایگانی", - "@clearArchive": {}, - "commandHint_create": "ساختن یک گپ گروهی خالی\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", - "@commandHint_create": { - "type": "String", - "description": "Usage hint for the command /create" - }, - "commandHint_dm": "شروع یک گپ مستقیم\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", - "@commandHint_dm": { - "type": "String", - "description": "Usage hint for the command /dm" - }, - "sendSticker": "فرستادن برچسب", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "sendVideo": "فرستادن ویدئو", - "@sendVideo": { - "type": "String", - "placeholders": {} - }, - "sender": "فرستنده", - "@sender": {}, - "changedTheJoinRules": "{username} قوانین پیوستن را تغییر داد", - "@changedTheJoinRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "chatDetails": "جزئیات گپ", - "@chatDetails": { - "type": "String", - "placeholders": {} - }, - "commandHint_markasdm": "علامت‌گذاری به‌عنوان اتاق پیام مستقیم با شناسه ماتریکس", - "@commandHint_markasdm": {}, - "commandHint_markasgroup": "علامت‌گذاری به‌عنوان گروه", - "@commandHint_markasgroup": {}, - "commandHint_clearcache": "پاک کردن حافظه نهان", - "@commandHint_clearcache": { - "type": "String", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_discardsession": "رد کردن نشست", - "@commandHint_discardsession": { - "type": "String", - "description": "Usage hint for the command /discardsession" - }, - "groups": "گروه‌ها", - "@groups": { - "type": "String", - "placeholders": {} - }, - "openAppToReadMessages": "برای خواندن پیام‌ها، برنامه را باز کنید", - "@openAppToReadMessages": { - "type": "String", - "placeholders": {} - }, - "sendAMessage": "فرستادن پیام", - "@sendAMessage": { - "type": "String", - "placeholders": {} - }, - "sentCallInformations": "{senderName} اطلاعات تماس را فرستاد", - "@sentCallInformations": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "sendAsText": "فرستادن به‌عنوان متن", - "@sendAsText": { - "type": "String" - }, - "sendFile": "فرستادن پرونده", - "@sendFile": { - "type": "String", - "placeholders": {} - }, - "startedACall": "{senderName} تماس را آغاز کرد", - "@startedACall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "tryToSendAgain": "تلاش دوباره برای فرستادن", - "@tryToSendAgain": { - "type": "String", - "placeholders": {} - }, - "reactedWith": "{sender} با {reaction} واکنش نشان داد", - "@reactedWith": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - }, - "reaction": { - "type": "String" - } - } - }, - "askSSSSSign": "لطفاً عبارت عبور یا کلید بازیابی حافظه امن را وارد کنید تا شخص دیگری را امضا کنید.", - "@askSSSSSign": { - "type": "String", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "گپ به این فضا افزوده شد", - "@chatHasBeenAddedToThisSpace": {}, - "chat": "گپ", - "@chat": { - "type": "String", - "placeholders": {} - }, - "chatBackup": "پشتیبان گپ", - "@chatBackup": { - "type": "String", - "placeholders": {} - }, - "changePassword": "تغییر گذرواژه", - "@changePassword": { - "type": "String", - "placeholders": {} - }, - "changeTheHomeserver": "تغییر سرور خانگی", - "@changeTheHomeserver": { - "type": "String", - "placeholders": {} - }, - "separateChatTypes": "جداسازی گپ‌های مستقیم از گروه‌ها", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "sentAPicture": "🖼️ {username} یک تصویر فرستاد", - "@sentAPicture": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAVideo": "🎥 {username} یک ویدئو فرستاد", - "@sentAVideo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "commandInvalid": "دستور نامعتبر", - "@commandInvalid": { - "type": "String" - }, - "commandMissing": "{command} یک دستور نیست.", - "@commandMissing": { - "type": "String", - "placeholders": { - "command": { - "type": "String" - } + "@@last_modified": "2021-08-14 12:41:10.061080", + "repeatPassword": "تکرار گذرواژه", + "about": "درباره", + "@about": { + "type": "String", + "placeholders": {} }, - "description": "State that {command} is not a valid /command." - }, - "contactHasBeenInvitedToTheGroup": "مخاطب به گروه دعوت شد", - "@contactHasBeenInvitedToTheGroup": { - "type": "String", - "placeholders": {} - }, - "sentAFile": "📁 {username} یک پرونده فرستاد", - "@sentAFile": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAnAudio": "🎤 {username} یک صدا فرستاد", - "@sentAnAudio": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "userSentUnknownEvent": "{username} یک رویداد {type} فرستاد", - "@userSentUnknownEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "type": { - "type": "String" - } - } - }, - "weSentYouAnEmail": "یک رایانامه برای شما فرستادیم", - "@weSentYouAnEmail": { - "type": "String", - "placeholders": {} - }, - "loadCountMoreParticipants": "بارگیری {count} شرکت‌کننده دیگر", - "@loadCountMoreParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "sentASticker": "😊 {username} یک برچسب فرستاد", - "@sentASticker": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "connect": "اتصال", - "@connect": { - "type": "String", - "placeholders": {} - }, - "confirm": "پذیرفتن", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "allSpaces": "همه فضاها", - "@allSpaces": {}, - "commandHint_ban": "محروم کردن کاربر مشخص‌شده از این اتاق", - "@commandHint_ban": { - "type": "String", - "description": "Usage hint for the command /ban" - }, - "commandHint_kick": "بیرون کردن کاربر مشخص‌شده از این اتاق", - "@commandHint_kick": { - "type": "String", - "description": "Usage hint for the command /kick" - }, - "commandHint_plain": "فرستادن متن بدون قالب", - "@commandHint_plain": { - "type": "String", - "description": "Usage hint for the command /plain" - }, - "commandHint_unban": "رد محرومیت کاربر مشخص‌شده از این اتاق", - "@commandHint_unban": { - "type": "String", - "description": "Usage hint for the command /unban" - }, - "containsDisplayName": "دارای نام نمایشی", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "دارای نام کاربری", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "device": "دستگاه", - "@device": { - "type": "String", - "placeholders": {} - }, - "copy": "رونوشت", - "@copy": { - "type": "String", - "placeholders": {} - }, - "defaultPermissionLevel": "سطح دسترسی پیش‌فرض", - "@defaultPermissionLevel": { - "type": "String", - "placeholders": {} - }, - "delete": "پاک کردن", - "@delete": { - "type": "String", - "placeholders": {} - }, - "deleteAccount": "پاک کردن حساب", - "@deleteAccount": { - "type": "String", - "placeholders": {} - }, - "deleteMessage": "پاک کردن پیام", - "@deleteMessage": { - "type": "String", - "placeholders": {} - }, - "commandHint_html": "فرستادن متن با قالب HTML", - "@commandHint_html": { - "type": "String", - "description": "Usage hint for the command /html" - }, - "commandHint_join": "پیوستن به اتاق مشخص‌شده", - "@commandHint_join": { - "type": "String", - "description": "Usage hint for the command /join" - }, - "commandHint_leave": "ترک این اتاق", - "@commandHint_leave": { - "type": "String", - "description": "Usage hint for the command /leave" - }, - "commandHint_myroomnick": "تنظیم نام نمایشی برای این اتاق", - "@commandHint_myroomnick": { - "type": "String", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_myroomavatar": "تنظیم نماد نمایه برای این اتاق (با mxc-uri)", - "@commandHint_myroomavatar": { - "type": "String", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_op": "تنظیم سطح دسترسی کاربر مشخص‌شده (پیش‌فرض: ۵۰)", - "@commandHint_op": { - "type": "String", - "description": "Usage hint for the command /op" - }, - "commandHint_react": "فرستادن پاسخ به‌عنوان واکنش", - "@commandHint_react": { - "type": "String", - "description": "Usage hint for the command /react" - }, - "compareEmojiMatch": "لطفاً شکلک‌ها را مقایسه کنید", - "@compareEmojiMatch": { - "type": "String", - "placeholders": {} - }, - "copyToClipboard": "رونوشت به بریده‌دان", - "@copyToClipboard": { - "type": "String", - "placeholders": {} - }, - "countParticipants": "{count} شرکت‌کننده", - "@countParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "create": "ساختن", - "@create": { - "type": "String", - "placeholders": {} - }, - "createNewSpace": "فضای جدید", - "@createNewSpace": { - "type": "String", - "placeholders": {} - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "deviceId": "شناسه دستگاه", - "@deviceId": { - "type": "String", - "placeholders": {} - }, - "devices": "دستگاه‌ها", - "@devices": { - "type": "String", - "placeholders": {} - }, - "displaynameHasBeenChanged": "نام نمایشی تغییر کرد", - "@displaynameHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "downloadFile": "بارگیری پرونده", - "@downloadFile": { - "type": "String", - "placeholders": {} - }, - "edit": "ویرایش", - "@edit": { - "type": "String", - "placeholders": {} - }, - "editBlockedServers": "ویرایش سرورهای مسدود", - "@editBlockedServers": { - "type": "String", - "placeholders": {} - }, - "editRoomAliases": "ویرایش نام‌های مستعار اتاق", - "@editRoomAliases": { - "type": "String", - "placeholders": {} - }, - "editRoomAvatar": "ویرایش نماد اتاق", - "@editRoomAvatar": { - "type": "String", - "placeholders": {} - }, - "emoteExists": "شکلک از پیش وجود دارد!", - "@emoteExists": { - "type": "String", - "placeholders": {} - }, - "emoteWarnNeedToPick": "باید یک کد کوتاه شکلک و یک تصویر انتخاب کنید!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, - "emoteInvalid": "کد کوتاه شکلک نامعتبر است!", - "@emoteInvalid": { - "type": "String", - "placeholders": {} - }, - "emptyChat": "گپ خالی", - "@emptyChat": { - "type": "String", - "placeholders": {} - }, - "copiedToClipboard": "به بریده‌دان رونوشت شد", - "@copiedToClipboard": { - "type": "String", - "placeholders": {} - }, - "createdTheChat": "💬 {username} گپ را ساخت", - "@createdTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "darkTheme": "تیره", - "@darkTheme": { - "type": "String", - "placeholders": {} - }, - "directChats": "گپ‌های مستقیم", - "@directChats": { - "type": "String", - "placeholders": {} - }, - "emotePacks": "بسته‌های شکلک برای اتاق", - "@emotePacks": { - "type": "String", - "placeholders": {} - }, - "emoteSettings": "تنظیمات شکلک", - "@emoteSettings": { - "type": "String", - "placeholders": {} - }, - "emoteShortcode": "کد کوتاه شکلک", - "@emoteShortcode": { - "type": "String", - "placeholders": {} - }, - "commandHint_me": "توصیف خود", - "@commandHint_me": { - "type": "String", - "description": "Usage hint for the command /me" - }, - "commandHint_send": "فرستادن متن", - "@commandHint_send": { - "type": "String", - "description": "Usage hint for the command /send" - }, - "couldNotDecryptMessage": "نمی‌توان پیام را رمزگشایی کرد: {error}", - "@couldNotDecryptMessage": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "chatBackupDescription": "پیام‌های قدیمی شما با یک کلید بازیابی امن می‌شوند. لطفاً مطمئن شوید آن را گم نمی‌کنید.", - "@chatBackupDescription": { - "type": "String", - "placeholders": {} - }, - "deactivateAccountWarning": "این کار حساب شما را غیرفعال می‌کند. این کنش برگشت‌ناپذیر است! آیا مطمئن هستید؟", - "@deactivateAccountWarning": { - "type": "String", - "placeholders": {} - }, - "commandHint_invite": "دعوت از کاربر مشخص‌شده به این اتاق", - "@commandHint_invite": { - "type": "String", - "description": "Usage hint for the command /invite" - }, - "compareNumbersMatch": "لطفاً اعداد را مقایسه کنید", - "@compareNumbersMatch": { - "type": "String", - "placeholders": {} - }, - "configureChat": "پیکربندی گپ", - "@configureChat": { - "type": "String", - "placeholders": {} - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "currentlyActive": "اکنون فعال", - "@currentlyActive": { - "type": "String", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}، {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "String", - "placeholders": { - "date": { - "type": "String" - }, - "timeOfDay": { - "type": "String" - } - } - }, - "editDisplayname": "ویرایش نام نمایشی", - "@editDisplayname": { - "type": "String", - "placeholders": {} - }, - "id": "شناسه", - "@id": { - "type": "String", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} دعوت {targetName} را پس گرفت", - "@hasWithdrawnTheInvitationFor": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "guestsAreForbidden": "مهمان‌ها ممنوع هستند", - "@guestsAreForbidden": { - "type": "String", - "placeholders": {} - }, - "hideRedactedEvents": "پنهان کردن رویدادهای ویرایش‌شده", - "@hideRedactedEvents": { - "type": "String", - "placeholders": {} - }, - "hideUnknownEvents": "پنهان کردن رویدادهای ناشناخته", - "@hideUnknownEvents": { - "type": "String", - "placeholders": {} - }, - "contentHasBeenReported": "محتوا به مدیران سرور گزارش شد", - "@contentHasBeenReported": { - "type": "String", - "placeholders": {} - }, - "fromJoining": "از پیوستن", - "@fromJoining": { - "type": "String", - "placeholders": {} - }, - "fromTheInvitation": "از دعوت", - "@fromTheInvitation": { - "type": "String", - "placeholders": {} - }, - "goToTheNewRoom": "رفتن به اتاق جدید", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, - "group": "گروه", - "@group": { - "type": "String", - "placeholders": {} - }, - "groupIsPublic": "گروه عمومی است", - "@groupIsPublic": { - "type": "String", - "placeholders": {} - }, - "groupWith": "گروه با {displayname}", - "@groupWith": { - "type": "String", - "placeholders": { - "displayname": { - "type": "String" - } - } - }, - "howOffensiveIsThisContent": "این محتوا چقدر توهین‌آمیز است؟", - "@howOffensiveIsThisContent": { - "type": "String", - "placeholders": {} - }, - "enableEmotesGlobally": "فعال کردن بسته شکلک به‌صورت سراسری", - "@enableEmotesGlobally": { - "type": "String", - "placeholders": {} - }, - "enableEncryption": "فعال کردن رمزنگاری", - "@enableEncryption": { - "type": "String", - "placeholders": {} - }, - "enableEncryptionWarning": "نمی‌توانید رمزنگاری را غیرفعال کنید. آیا مطمئن هستید؟", - "@enableEncryptionWarning": { - "type": "String", - "placeholders": {} - }, - "encrypted": "رمزنگاری‌شده", - "@encrypted": { - "type": "String", - "placeholders": {} - }, - "encryption": "رمزنگاری", - "@encryption": { - "type": "String", - "placeholders": {} - }, - "encryptionNotEnabled": "رمزنگاری فعال نیست", - "@encryptionNotEnabled": { - "type": "String", - "placeholders": {} - }, - "enterAnEmailAddress": "یک نشانی رایانامه وارد کنید", - "@enterAnEmailAddress": { - "type": "String", - "placeholders": {} - }, - "endedTheCall": "{senderName} به تماس پایان داد", - "@endedTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "homeserver": "سرور خانگی", - "@homeserver": {}, - "enterYourHomeserver": "سرور خانگی خود را وارد کنید", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, - "errorObtainingLocation": "خطا در به‌دست آوردن مکان: {error}", - "@errorObtainingLocation": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "everythingReady": "همه‌چیز آماده است!", - "@everythingReady": { - "type": "String", - "placeholders": {} - }, - "extremeOffensive": "بسیار توهین‌آمیز", - "@extremeOffensive": { - "type": "String", - "placeholders": {} - }, - "fileName": "نام پرونده", - "@fileName": { - "type": "String", - "placeholders": {} - }, - "fluffychat": "فلافی‌چت", - "@fluffychat": { - "type": "String", - "placeholders": {} - }, - "fontSize": "اندازه قلم", - "@fontSize": { - "type": "String", - "placeholders": {} - }, - "forward": "هدایت", - "@forward": { - "type": "String", - "placeholders": {} - }, - "help": "کمک", - "@help": { - "type": "String", - "placeholders": {} - }, - "guestsCanJoin": "مهمان‌ها می‌توانند بپیوندند", - "@guestsCanJoin": { - "type": "String", - "placeholders": {} - }, - "ignoredUsers": "کاربران نادیده‌گرفته شده", - "@ignoredUsers": { - "type": "String", - "placeholders": {} - }, - "commandHint_googly": "فرستادن چند چشم گوگولی", - "@commandHint_googly": {}, - "googlyEyesContent": "{senderName} برای شما چشم‌های گوگولی می‌فرستد", - "@googlyEyesContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "ignore": "نادیده‌گرفتن", - "@ignore": { - "type": "String", - "placeholders": {} - }, - "cuddleContent": "{senderName} شما را در آغوش می‌گیرد", - "@cuddleContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "identity": "هویت", - "@identity": { - "type": "String", - "placeholders": {} - }, - "hugContent": "{senderName} شما را بغل می‌کند", - "@hugContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "commandHint_cuddle": "فرستادن آغوش", - "@commandHint_cuddle": {}, - "commandHint_hug": "فرستادن بغل", - "@commandHint_hug": {}, - "editBundlesForAccount": "ویرایش بسته‌های این حساب", - "@editBundlesForAccount": {}, - "logout": "خروج", - "@logout": { - "type": "String", - "placeholders": {} - }, - "mention": "نام‌بردن", - "@mention": { - "type": "String", - "placeholders": {} - }, - "muteChat": "بی‌صدا کردن گپ", - "@muteChat": { - "type": "String", - "placeholders": {} - }, - "newChat": "گپ جدید", - "@newChat": { - "type": "String", - "placeholders": {} - }, - "newMessageInFluffyChat": "💬 پیام جدید در فلافی‌چت", - "@newMessageInFluffyChat": { - "type": "String", - "placeholders": {} - }, - "noConnectionToTheServer": "بدون اتصال به سرور", - "@noConnectionToTheServer": { - "type": "String", - "placeholders": {} - }, - "no": "خیر", - "@no": { - "type": "String", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "هنوز روشی برای بازیابی گذرواژه خود اضافه نکرده‌اید.", - "@noPasswordRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "آگاه‌سازها برای این حساب فعال شدند", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, - "or": "یا", - "@or": { - "type": "String", - "placeholders": {} - }, - "participant": "شرکت‌کننده", - "@participant": { - "type": "String", - "placeholders": {} - }, - "passphraseOrKey": "عبارت عبور یا کلید بازیابی", - "@passphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "password": "گذرواژه", - "@password": { - "type": "String", - "placeholders": {} - }, - "passwordHasBeenChanged": "گذرواژه تغییر کرد", - "@passwordHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "passwordRecovery": "بازیابی گذرواژه", - "@passwordRecovery": { - "type": "String", - "placeholders": {} - }, - "pin": "سنجاق کردن", - "@pin": { - "type": "String", - "placeholders": {} - }, - "play": "پخش {fileName}", - "@play": { - "type": "String", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "pleaseEnter4Digits": "لطفاً ۴ رقم وارد کنید یا خالی بگذارید تا قفل برنامه غیرفعال شود.", - "@pleaseEnter4Digits": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourPin": "لطفاً رمز کوتاه خود را وارد کنید", - "@pleaseEnterYourPin": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourPassword": "لطفاً گذرواژه خود را وارد کنید", - "@pleaseEnterYourPassword": { - "type": "String", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "لطفاً دستورالعمل‌های وبگاه را دنبال کنید و روی بعدی بزنید.", - "@pleaseFollowInstructionsOnWeb": { - "type": "String", - "placeholders": {} - }, - "publicRooms": "اتاق‌های عمومی", - "@publicRooms": { - "type": "String", - "placeholders": {} - }, - "obtainingLocation": "در حال به‌دست آوردن مکان…", - "@obtainingLocation": { - "type": "String", - "placeholders": {} - }, - "oopsSomethingWentWrong": "اوه، مشکلی پیش آمد…", - "@oopsSomethingWentWrong": { - "type": "String", - "placeholders": {} - }, - "addToBundle": "افزودن به بسته", - "@addToBundle": {}, - "passwordForgotten": "فراموشی گذرواژه", - "@passwordForgotten": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterRecoveryKey": "لطفاً کلید بازیابی خود را وارد کنید:", - "@pleaseEnterRecoveryKey": {}, - "link": "پیوند", - "@link": {}, - "iHaveClickedOnLink": "روی پیوند کلیک کردم", - "@iHaveClickedOnLink": { - "type": "String", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "عبارت عبور یا کلید بازیابی نادرست است", - "@incorrectPassphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "inoffensive": "بی‌ضرر", - "@inoffensive": { - "type": "String", - "placeholders": {} - }, - "inviteContactToGroup": "دعوت مخاطب به {groupName}", - "@inviteContactToGroup": { - "type": "String", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "invitedUsersOnly": "فقط کاربران دعوت‌شده", - "@invitedUsersOnly": { - "type": "String", - "placeholders": {} - }, - "inviteForMe": "دعوت برای من", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, - "isTyping": "در حال نوشتن…", - "@isTyping": { - "type": "String", - "placeholders": {} - }, - "joinRoom": "پیوستن به اتاق", - "@joinRoom": { - "type": "String", - "placeholders": {} - }, - "kicked": "👞 {username} کاربر {targetName} را بیرون کرد", - "@kicked": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "kickFromChat": "بیرون کردن از گپ", - "@kickFromChat": { - "type": "String", - "placeholders": {} - }, - "leftTheChat": "گپ را ترک کرد", - "@leftTheChat": { - "type": "String", - "placeholders": {} - }, - "dehydrate": "صدور نشست و پاک کردن دستگاه", - "@dehydrate": {}, - "hydrateTorLong": "آیا آخرین بار نشست خود را با تور صادر کردید؟ آن را وارد کنید و گپ را ادامه دهید.", - "@hydrateTorLong": {}, - "loadingPleaseWait": "در حال بارگذاری… لطفاً صبر کنید.", - "@loadingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "loadMore": "بارگذاری بیشتر…", - "@loadMore": { - "type": "String", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "دسترسی به مکان رد شد. برای هم‌رسانی مکان، لطفاً دسترسی بدهید.", - "@locationPermissionDeniedNotice": { - "type": "String", - "placeholders": {} - }, - "logInTo": "ورود به {homeserver}", - "@logInTo": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "memberChanges": "تغییرات اعضا", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, - "moderator": "ناظر", - "@moderator": { - "type": "String", - "placeholders": {} - }, - "newVerificationRequest": "درخواست بازبینی جدید!", - "@newVerificationRequest": { - "type": "String", - "placeholders": {} - }, - "noPermission": "بدون دسترسی", - "@noPermission": { - "type": "String", - "placeholders": {} - }, - "noRoomsFound": "اتاقی پیدا نشد…", - "@noRoomsFound": { - "type": "String", - "placeholders": {} - }, - "offline": "آفلاین", - "@offline": { - "type": "String", - "placeholders": {} - }, - "online": "آنلاین", - "@online": { - "type": "String", - "placeholders": {} - }, - "oopsPushError": "اوه! خطایی در تنظیم آگاه‌سازها رخ داد.", - "@oopsPushError": { - "type": "String", - "placeholders": {} - }, - "openCamera": "باز کردن دوربین", - "@openCamera": { - "type": "String", - "placeholders": {} - }, - "addAccount": "افزودن حساب", - "@addAccount": {}, - "people": "افراد", - "@people": { - "type": "String", - "placeholders": {} - }, - "pickImage": "انتخاب تصویر", - "@pickImage": { - "type": "String", - "placeholders": {} - }, - "pleaseChoose": "لطفاً انتخاب کنید", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, - "pleaseChooseAPasscode": "لطفاً یک رمز کوتاه انتخاب کنید", - "@pleaseChooseAPasscode": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourUsername": "لطفاً نام کاربری خود را وارد کنید", - "@pleaseEnterYourUsername": { - "type": "String", - "placeholders": {} - }, - "privacy": "حریم خصوصی", - "@privacy": { - "type": "String", - "placeholders": {} - }, - "license": "گواهینامه", - "@license": { - "type": "String", - "placeholders": {} - }, - "numUsersTyping": "{count} کاربر در حال نوشتن…", - "@numUsersTyping": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "invited": "دعوت‌شده", - "@invited": { - "type": "String", - "placeholders": {} - }, - "invitedUser": "📩 {username} از {targetName} دعوت کرد", - "@invitedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "joinedTheChat": "👋 {username} به گپ پیوست", - "@joinedTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "kickedAndBanned": "🙅 {username} کاربر {targetName} را بیرون و محروم کرد", - "@kickedAndBanned": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "dehydrateWarning": "این کنش برگشت‌ناپذیر است. مطمئن شوید پرونده پشتیبان را به‌صورت امن ذخیره می‌کنید.", - "@dehydrateWarning": {}, - "locationDisabledNotice": "مکان‌یاب غیرفعال است. لطفاً آن را فعال کنید تا بتوانید مکان خود را هم‌رسانی کنید.", - "@locationDisabledNotice": { - "type": "String", - "placeholders": {} - }, - "dehydrateTorLong": "برای کاربران تور، پیشنهاد می‌شود پیش از بستن پنجره، نشست را صادر کنند.", - "@dehydrateTorLong": {}, - "needPantalaimonWarning": "لطفاً توجه کنید که برای رمزنگاری سرتاسر به Pantalaimon نیاز دارید.", - "@needPantalaimonWarning": { - "type": "String", - "placeholders": {} - }, - "next": "بعدی", - "@next": { - "type": "String", - "placeholders": {} - }, - "noEmotesFound": "شکلکی پیدا نشد. 😕", - "@noEmotesFound": { - "type": "String", - "placeholders": {} - }, - "noGoogleServicesWarning": "به نظر می‌رسد دستگاه شما سرویس‌های گوگل ندارد. این انتخاب خوبی برای حریم خصوصی است! برای دریافت آگاه‌سازها در فلافی‌چت، پیشنهاد می‌کنیم از https://ntfy.sh استفاده کنید. با ntfy یا یک فراهم‌کننده UnifiedPush می‌توانید آگاه‌سازهای امن دریافت کنید. می‌توانید ntfy را از Play Store یا F-Droid بارگیری کنید.", - "@noGoogleServicesWarning": { - "type": "String", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "رمزنگاری را تنها زمانی می‌توانید فعال کنید که اتاق عمومی نباشد.", - "@noEncryptionForPublicRooms": { - "type": "String", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "پشتیبان‌گیری آنلاین کلید فعال است", - "@onlineKeyBackupEnabled": { - "type": "String", - "placeholders": {} - }, - "enableMultiAccounts": "(آزمایشی) فعال کردن چند حساب در این دستگاه", - "@enableMultiAccounts": {}, - "pleaseClickOnLink": "لطفاً روی پیوند در رایانامه کلیک کنید و ادامه دهید.", - "@pleaseClickOnLink": { - "type": "String", - "placeholders": {} - }, - "hydrateTor": "کاربران تور: وارد کردن نشست صادر شده", - "@hydrateTor": {}, - "hydrate": "بازیابی از پرونده پشتیبان", - "@hydrate": {}, - "inviteContact": "دعوت از مخاطب", - "@inviteContact": { - "type": "String", - "placeholders": {} - }, - "noMatrixServer": "{server1} سرور ماتریکس نیست، از {server2} استفاده شود؟", - "@noMatrixServer": { - "type": "String", - "placeholders": { - "server1": { - "type": "String" - }, - "server2": { - "type": "String" - } - } - }, - "openVideoCamera": "باز کردن دوربین برای فیلم‌برداری", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "oneClientLoggedOut": "یکی از برنامه‌های شما از سیستم خارج شد", - "@oneClientLoggedOut": {}, - "removeFromBundle": "برداشتن از بسته", - "@removeFromBundle": {}, - "bundleName": "نام بسته", - "@bundleName": {}, - "openInMaps": "باز کردن در نقشه", - "@openInMaps": { - "type": "String", - "placeholders": {} - }, - "serverRequiresEmail": "برای ثبت‌نام، این سرور باید نشانی رایانامه شما را تأیید کند.", - "@serverRequiresEmail": {}, - "inviteText": "{username} شما را به فلافی‌چت دعوت کرد.\n۱. به fluffychat.im بروید و برنامه را نصب کنید\n۲. ثبت‌نام کنید یا وارد شوید\n۳. پیوند دعوت را باز کنید:\n {link}", - "@inviteText": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "leave": "ترک کردن", - "@leave": { - "type": "String", - "placeholders": {} - }, - "none": "هیچ", - "@none": { - "type": "String", - "placeholders": {} - }, - "offensive": "توهین‌آمیز", - "@offensive": { - "type": "String", - "placeholders": {} - }, - "scanQrCode": "پویش کد QR", - "@scanQrCode": {}, - "lastActiveAgo": "آخرین فعالیت: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "String", - "placeholders": { - "localizedTimeShort": { - "type": "String" - } - } - }, - "lightTheme": "روشن", - "@lightTheme": { - "type": "String", - "placeholders": {} - }, - "dehydrateTor": "کاربران تور: صدور نشست", - "@dehydrateTor": {}, - "login": "ورود", - "@login": { - "type": "String", - "placeholders": {} - }, - "notifications": "آگاه‌سازها", - "@notifications": { - "type": "String", - "placeholders": {} - }, - "ok": "خوب", - "@ok": { - "type": "String", - "placeholders": {} - }, - "roomHasBeenUpgraded": "اتاق ارتقا یافت", - "@roomHasBeenUpgraded": { - "type": "String", - "placeholders": {} - }, - "register": "ثبت‌نام", - "@register": { - "type": "String", - "placeholders": {} - }, - "reject": "رد کردن", - "@reject": { - "type": "String", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} دعوت را رد کرد", - "@rejectedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "rejoin": "پیوستن دوباره", - "@rejoin": { - "type": "String", - "placeholders": {} - }, - "unbanFromChat": "لغو محرومیت از گپ", - "@unbanFromChat": { - "type": "String", - "placeholders": {} - }, - "reply": "پاسخ", - "@reply": { - "type": "String", - "placeholders": {} - }, - "requestPermission": "درخواست دسترسی", - "@requestPermission": { - "type": "String", - "placeholders": {} - }, - "roomVersion": "نگارش اتاق", - "@roomVersion": { - "type": "String", - "placeholders": {} - }, - "search": "جستجو", - "@search": { - "type": "String", - "placeholders": {} - }, - "security": "امنیت", - "@security": { - "type": "String", - "placeholders": {} - }, - "seenByUser": "دیده‌شده توسط {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "setAsCanonicalAlias": "تنظیم به‌عنوان نام مستعار اصلی", - "@setAsCanonicalAlias": { - "type": "String", - "placeholders": {} - }, - "removeYourAvatar": "برداشتن نماد نمایه", - "@removeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "recording": "در حال ضبط", - "@recording": { - "type": "String", - "placeholders": {} - }, - "redactedAnEvent": "{username} یک رویداد را ویرایش کرد", - "@redactedAnEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "remove": "برداشتن", - "@remove": { - "type": "String", - "placeholders": {} - }, - "removeAllOtherDevices": "پاک کردن همه دستگاه‌های دیگر", - "@removeAllOtherDevices": { - "type": "String", - "placeholders": {} - }, - "removedBy": "پاک‌شده توسط {username}", - "@removedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "removeDevice": "پاک کردن دستگاه", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, - "reportMessage": "گزارش پیام", - "@reportMessage": { - "type": "String", - "placeholders": {} - }, - "saveFile": "ذخیره پرونده", - "@saveFile": { - "type": "String", - "placeholders": {} - }, - "recoveryKey": "کلید بازیابی", - "@recoveryKey": {}, - "setInvitationLink": "تنظیم پیوند دعوت", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "pushRules": "قوانین آگاه‌ساز", - "@pushRules": { - "type": "String", - "placeholders": {} - }, - "reason": "دلیل", - "@reason": { - "type": "String", - "placeholders": {} - }, - "setCustomEmotes": "تنظیم شکلک‌های سفارشی", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "redactMessage": "ویرایش پیام", - "@redactMessage": { - "type": "String", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "جایگزینی اتاق با نگارش جدیدتر", - "@replaceRoomWithNewerVersion": { - "type": "String", - "placeholders": {} - }, - "recoveryKeyLost": "کلید بازیابی گم شد؟", - "@recoveryKeyLost": {}, - "fileHasBeenSavedAt": "پرونده در {path} ذخیره شد", - "@fileHasBeenSavedAt": { - "type": "String", - "placeholders": { - "path": { - "type": "String" - } - } - }, - "enterSpace": "ورود به فضا", - "@enterSpace": {}, - "wasDirectChatDisplayName": "گپ خالی (پیش‌تر {oldDisplayName} بود)", - "@wasDirectChatDisplayName": { - "type": "String", - "placeholders": { - "oldDisplayName": { - "type": "String" - } - } - }, - "newSpaceDescription": "فضاها امکان یکپارچه‌سازی گپ‌ها و ساخت جوامع خصوصی یا عمومی را فراهم می‌کنند.", - "@newSpaceDescription": {}, - "encryptThisChat": "رمزنگاری این گپ", - "@encryptThisChat": {}, - "sorryThatsNotPossible": "متأسفیم... این ممکن نیست", - "@sorryThatsNotPossible": {}, - "deviceKeys": "کلیدهای دستگاه:", - "@deviceKeys": {}, - "fileIsTooBigForServer": "نمیتوان فرستاد! سرور تنها از پیوست های تا {max} پشتیبانی میکند.", - "@fileIsTooBigForServer": {}, - "jumpToLastReadMessage": "پرش به آخرین پیام خوانده‌شده", - "@jumpToLastReadMessage": {}, - "hideUnimportantStateEvents": "پنهان کردن رویدادهای غیرمهم وضعیت", - "@hideUnimportantStateEvents": {}, - "doNotShowAgain": "دوباره نمایش نده", - "@doNotShowAgain": {}, - "readUpToHere": "خوانده‌شده تا اینجا", - "@readUpToHere": {}, - "noBackupWarning": "هشدار! بدون فعال کردن پشتیبان گپ، دسترسی به پیام‌های رمزنگاری‌شده خود را از دست خواهید داد. پیشنهاد می‌شود پیش از خروج، پشتیبان گپ را فعال کنید.", - "@noBackupWarning": {}, - "noOtherDevicesFound": "دستگاه دیگری پیدا نشد", - "@noOtherDevicesFound": {}, - "countFiles": "{count} پرونده", - "@countFiles": { - "placeholders": { - "count": { - "type": "int" - } - } - }, - "callingAccountDetails": "اجازه به فلافی‌چت برای استفاده از شماره‌گیر بومی اندروید.", - "@callingAccountDetails": {}, - "noKeyForThisMessage": "اگر پیام پیش از ورود به حساب در این دستگاه فرستاده شده باشد، این مشکل ممکن است رخ دهد.\n\nهمچنین ممکن است فرستنده دستگاه شما را مسدود کرده باشد یا مشکلی در اتصال اینترنت وجود داشته باشد.\n\nآیا می‌توانید پیام را در نشست دیگری بخوانید؟ در این صورت، می‌توانید آن را منتقل کنید! به تنظیمات > دستگاه‌ها بروید و مطمئن شوید دستگاه‌هایتان یکدیگر را بازبینی کرده‌اند. هنگام باز کردن دوباره اتاق و فعال بودن هر دو نشست، کلیدها به‌صورت خودکار منتقل می‌شوند.\n\nآیا نمی‌خواهید هنگام خروج یا تغییر دستگاه کلیدها را گم کنید؟ مطمئن شوید پشتیبان گپ را در تنظیمات فعال کرده‌اید.", - "@noKeyForThisMessage": {}, - "numChats": "{number} گپ", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "disableEncryptionWarning": "به دلایل امنیتی نمی‌توانید رمزنگاری را در گپی که فعال شده غیرفعال کنید.", - "@disableEncryptionWarning": {}, - "enterRoom": "ورود به اتاق", - "@enterRoom": {}, - "newGroup": "گروه جدید", - "@newGroup": {}, - "foregroundServiceRunning": "این آگاه‌ساز زمانی ظاهر می‌شود که خدمت پیش‌زمینه فعال است.", - "@foregroundServiceRunning": {}, - "appearOnTopDetails": "اجازه به برنامه برای نمایش در بالا (اگر فلافی‌چت را به‌عنوان حساب تماس تنظیم کرده‌اید، لازم نیست)", - "@appearOnTopDetails": {}, - "storeSecurlyOnThisDevice": "ذخیره امن در این دستگاه", - "@storeSecurlyOnThisDevice": {}, - "screenSharingDetail": "شما در حال هم‌رسانی صفحه‌نمایش خود در فلافی‌چت هستید", - "@screenSharingDetail": {}, - "newSpace": "فضای جدید", - "@newSpace": {}, - "saveKeyManuallyDescription": "این کلید را با استفاده از هم‌رسانی یا بریده‌دان به‌طور دستی ذخیره کنید.", - "@saveKeyManuallyDescription": {}, - "storeInAndroidKeystore": "ذخیره در Android KeyStore", - "@storeInAndroidKeystore": {}, - "storeInAppleKeyChain": "ذخیره در Apple KeyChain", - "@storeInAppleKeyChain": {}, - "user": "کاربر", - "@user": {}, - "custom": "سفارشی", - "@custom": {}, - "screenSharingTitle": "هم‌رسانی صفحه‌نمایش", - "@screenSharingTitle": {}, - "callingPermissions": "دسترسی‌های تماس", - "@callingPermissions": {}, - "callingAccount": "حساب تماس", - "@callingAccount": {}, - "appearOnTop": "نمایش در بالا", - "@appearOnTop": {}, - "otherCallingPermissions": "میکروفون، دوربین و دیگر دسترسی‌های فلافی‌چت", - "@otherCallingPermissions": {}, - "whyIsThisMessageEncrypted": "چرا این پیام خوانا نیست؟", - "@whyIsThisMessageEncrypted": {}, - "reopenChat": "باز کردن دوباره گپ", - "@reopenChat": {}, - "unmuteChat": "فعال کردن صدای گپ", - "@unmuteChat": { - "type": "String", - "placeholders": {} - }, - "nextAccount": "حساب بعدی", - "@nextAccount": {}, - "unlockOldMessages": "گشودن پیام‌های قدیمی", - "@unlockOldMessages": {}, - "share": "هم‌رسانی", - "@share": { - "type": "String", - "placeholders": {} - }, - "skip": "رد کردن", - "@skip": { - "type": "String", - "placeholders": {} - }, - "systemTheme": "سامانه", - "@systemTheme": { - "type": "String", - "placeholders": {} - }, - "theyDontMatch": "هم‌خوانی ندارند", - "@theyDontMatch": { - "type": "String", - "placeholders": {} - }, - "toggleFavorite": "تغییر وضعیت برگزیده", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "تغییر وضعیت بی‌صدا", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "تغییر وضعیت خوانده‌شده/خوانده‌نشده", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "unavailable": "در دسترس نیست", - "@unavailable": { - "type": "String", - "placeholders": {} - }, - "unblockDevice": "باز کردن دستگاه", - "@unblockDevice": { - "type": "String", - "placeholders": {} - }, - "verifyStart": "آغاز بازبینی", - "@verifyStart": { - "type": "String", - "placeholders": {} - }, - "verifySuccess": "بازبینی با موفقیت انجام شد!", - "@verifySuccess": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerEmoji": "در انتظار پذیرش شکلک توسط دیگری…", - "@waitingPartnerEmoji": { - "type": "String", - "placeholders": {} - }, - "wallpaper": "کاغذدیواری:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, - "whoCanPerformWhichAction": "چه کسی می‌تواند چه کاری انجام دهد", - "@whoCanPerformWhichAction": { - "type": "String", - "placeholders": {} - }, - "writeAMessage": "نوشتن پیام…", - "@writeAMessage": { - "type": "String", - "placeholders": {} - }, - "widgetVideo": "ویدئو", - "@widgetVideo": {}, - "youHaveBeenBannedFromThisChat": "شما از این گپ محروم شده‌اید", - "@youHaveBeenBannedFromThisChat": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "تنظیم سطح دسترسی", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "setStatus": "تنظیم وضعیت", - "@setStatus": { - "type": "String", - "placeholders": {} - }, - "settings": "تنظیمات", - "@settings": { - "type": "String", - "placeholders": {} - }, - "showPassword": "نمایش گذرواژه", - "@showPassword": { - "type": "String", - "placeholders": {} - }, - "singlesignon": "ورود یکپارچه", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "spaceName": "نام فضا", - "@spaceName": { - "type": "String", - "placeholders": {} - }, - "startFirstChat": "شروع اولین گپ", - "@startFirstChat": {}, - "theyMatch": "هم‌خوانی دارند", - "@theyMatch": { - "type": "String", - "placeholders": {} - }, - "title": "فلافی‌چت", - "@title": { - "description": "Title for the application", - "type": "String", - "placeholders": {} - }, - "tooManyRequestsWarning": "درخواست‌های بیش از حد. لطفاً بعداً دوباره تلاش کنید!", - "@tooManyRequestsWarning": { - "type": "String", - "placeholders": {} - }, - "unbannedUser": "{username} محرومیت {targetName} را برداشت", - "@unbannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "unknownEncryptionAlgorithm": "الگوریتم رمزنگاری ناشناخته", - "@unknownEncryptionAlgorithm": { - "type": "String", - "placeholders": {} - }, - "unpin": "برداشتن سنجاق", - "@unpin": { - "type": "String", - "placeholders": {} - }, - "userAndUserAreTyping": "{username} و {username2} در حال نوشتن…", - "@userAndUserAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "username2": { - "type": "String" - } - } - }, - "videoCall": "تماس تصویری", - "@videoCall": { - "type": "String", - "placeholders": {} - }, - "visibleForAllParticipants": "قابل‌دید برای همه شرکت‌کنندگان", - "@visibleForAllParticipants": { - "type": "String", - "placeholders": {} - }, - "visibleForEveryone": "قابل‌دید برای همه", - "@visibleForEveryone": { - "type": "String", - "placeholders": {} - }, - "voiceMessage": "پیام صوتی", - "@voiceMessage": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "در انتظار پذیرش درخواست توسط دیگری…", - "@waitingPartnerAcceptRequest": { - "type": "String", - "placeholders": {} - }, - "warning": "هشدار!", - "@warning": { - "type": "String", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "شما دیگر در این گپ شرکت نمی‌کنید", - "@youAreNoLongerParticipatingInThisChat": { - "type": "String", - "placeholders": {} - }, - "messageInfo": "اطلاعات پیام", - "@messageInfo": {}, - "time": "زمان", - "@time": {}, - "messageType": "نوع پیام", - "@messageType": {}, - "addToSpaceDescription": "فضایی را برای افزودن این گپ انتخاب کنید.", - "@addToSpaceDescription": {}, - "start": "آغاز", - "@start": {}, - "videoWithSize": "ویدئو ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "userIsTyping": "{username} در حال نوشتن…", - "@userIsTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "username": "نام کاربری", - "@username": { - "type": "String", - "placeholders": {} - }, - "yes": "بله", - "@yes": { - "type": "String", - "placeholders": {} - }, - "yourPublicKey": "کلید عمومی شما", - "@yourPublicKey": { - "type": "String", - "placeholders": {} - }, - "publish": "انتشار", - "@publish": {}, - "shareLocation": "هم‌رسانی مکان", - "@shareLocation": { - "type": "String", - "placeholders": {} - }, - "youInvitedUser": "📩 شما {user} را دعوت کردید", - "@youInvitedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "unverified": "تأییدنشده", - "@unverified": {}, - "verify": "بازبینی", - "@verify": { - "type": "String", - "placeholders": {} - }, - "openChat": "باز کردن گپ", - "@openChat": {}, - "dismiss": "رد کردن", - "@dismiss": {}, - "unsupportedAndroidVersion": "نسخه اندروید پشتیبانی‌نشده", - "@unsupportedAndroidVersion": {}, - "youUnbannedUser": "شما محرومیت {user} را برداشتید", - "@youUnbannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "verified": "تاییدشده", - "@verified": { - "type": "String", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "چرا می‌خواهید گزارش دهید؟", - "@whyDoYouWantToReportThis": { - "type": "String", - "placeholders": {} - }, - "you": "شما", - "@you": { - "type": "String", - "placeholders": {} - }, - "widgetJitsi": "جیتسی‌میت(Jitsi Meet)", - "@widgetJitsi": {}, - "sourceCode": "کد منبع", - "@sourceCode": { - "type": "String", - "placeholders": {} - }, - "spaceIsPublic": "فضا عمومی است", - "@spaceIsPublic": { - "type": "String", - "placeholders": {} - }, - "synchronizingPleaseWait": "در حال همگام‌سازی... لطفا صبر کنید.", - "@synchronizingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "unknownEvent": "رویداد ناشناخته '{type}'", - "@unknownEvent": { - "type": "String", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "userAndOthersAreTyping": "{username} و {count} نفر دیگر در حال تایپ کردن…", - "@userAndOthersAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "userLeftTheChat": "👋 {username} گپ را ترک کرد", - "@userLeftTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "verifyTitle": "در حال تایید حساب دیگر", - "@verifyTitle": { - "type": "String", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "قابلیت دیدن تاریخچه گپ", - "@visibilityOfTheChatHistory": { - "type": "String", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "چه کسی اجازه پیوستن به این گروه را دارد", - "@whoIsAllowedToJoinThisGroup": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerNumbers": "در انتظار پذیرش اعداد توسط دیگری…", - "@waitingPartnerNumbers": { - "type": "String", - "placeholders": {} - }, - "wipeChatBackup": "برای ایجاد کلید بازیابی جدید، پشتیبان گپ خود را پاک می‌کنید؟", - "@wipeChatBackup": { - "type": "String", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "با این آدرس‌ها می‌توانید رمز خود را بازیابی کنید.", - "@withTheseAddressesRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "openGallery": "بازکردن گالری", - "@openGallery": {}, - "removeFromSpace": "حذف از فضا", - "@removeFromSpace": {}, - "pleaseEnterRecoveryKeyDescription": "برای گشودن قفل پیام‌های قدیمیتان، لطفا کلید بازیابی‌ای که در یک نشست پیشین تولید شده را وارد کنید. کلید بازیابی شما، رمز عبور شما نیست.", - "@pleaseEnterRecoveryKeyDescription": {}, - "confirmEventUnpin": "آیا از برداشتن سنجاق رویداد به صورت دائمی مطمئن هستید؟", - "@confirmEventUnpin": {}, - "indexedDbErrorLong": "متاسفانه فضای ذخیره‌سازی پیام‌ها، به صورت پیش‌فرض در حالت خصوصی فعال نیست.\nلطفا آدرس زیر را باز کنید:\nabout:config\nمقدار «dom.indexedDB.privateBrowsing.enabled» را به «true» تغییر دهید\nدر غیر این صورت، امکان اجرای فلافی‌چت وجود ندارد.", - "@indexedDbErrorLong": {}, - "widgetEtherpad": "یادداشت متنی", - "@widgetEtherpad": {}, - "youKickedAndBanned": "🙅 شما {user} را بیرون و محروم کردید", - "@youKickedAndBanned": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "statusExampleMessage": "امروز حالتان چطور است؟", - "@statusExampleMessage": { - "type": "String", - "placeholders": {} - }, - "submit": "ارسال", - "@submit": { - "type": "String", - "placeholders": {} - }, - "youRejectedTheInvitation": "شما دعوت را رد کردید", - "@youRejectedTheInvitation": {}, - "youAcceptedTheInvitation": "👍 شما دعوت را پذیرفتید", - "@youAcceptedTheInvitation": {}, - "emailOrUsername": "رایانامه(ایمیل) یا نام کاربری", - "@emailOrUsername": {}, - "transferFromAnotherDevice": "انتقال از دستگاهی دیگر", - "@transferFromAnotherDevice": { - "type": "String", - "placeholders": {} - }, - "videoCallsBetaWarning": "لطفا توجه داشته باشید که تماس‌های تصویری در حال حاضر آزمایشی هستند. ممکن است طبق انتظار کار نکنند یا روی همه پلتفرم‌ها اصلا کار نکنند.", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "تماس‌های تصویری آزمایشی", - "@experimentalVideoCalls": {}, - "placeCall": "برقراری تماس", - "@placeCall": {}, - "unsupportedAndroidVersionLong": "این ویژگی به نسخه تازه‌تری از اندروید نیاز دارد. لطفا به‌روزرسانی یا پشتیبانی لینیج‌اواس(LineageOS) را بررسی کنید.", - "@unsupportedAndroidVersionLong": {}, - "sharedTheLocation": "{username} وضعیت مکانی خود را به اشتراک گذاشت", - "@sharedTheLocation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} گپ خوانده نشده}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, - "status": "وضعیت", - "@status": { - "type": "String", - "placeholders": {} - }, - "unknownDevice": "دستگاه ناشناس", - "@unknownDevice": { - "type": "String", - "placeholders": {} - }, - "markAsRead": "علامت‌گذاشتن به عنوان خوانده شده", - "@markAsRead": {}, - "reportUser": "گزارش دادن کاربر", - "@reportUser": {}, - "pinMessage": "سنجاق کردن به اتاق", - "@pinMessage": {}, - "emojis": "شکلک‌ها", - "@emojis": {}, - "voiceCall": "تماس صوتی", - "@voiceCall": {}, - "indexedDbErrorTitle": "اشکالات حالت خصوصی", - "@indexedDbErrorTitle": {}, - "switchToAccount": "تغییر به حساب {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "previousAccount": "حساب قبلی", - "@previousAccount": {}, - "addWidget": "افزودن ویجت", - "@addWidget": {}, - "widgetCustom": "سفارشی", - "@widgetCustom": {}, - "widgetName": "نام", - "@widgetName": {}, - "widgetUrlError": "این آدرس وب معتبر نیست.", - "@widgetUrlError": {}, - "widgetNameError": "لطفا یک نام نمایشی مشخص کنید.", - "@widgetNameError": {}, - "errorAddingWidget": "بروز خطا هنگام افزودن ویجت.", - "@errorAddingWidget": {}, - "youJoinedTheChat": "شما به گپ پیوستید", - "@youJoinedTheChat": {}, - "youBannedUser": "شما {user} را محروم کردید", - "@youBannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youHaveWithdrawnTheInvitationFor": "شما دعوت {user} را پس‌گرفتید", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youInvitedBy": "📩 شما توسط {user} دعوت شده‌اید", - "@youInvitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youKicked": "👞 شما {user} را بیرون کردید", - "@youKicked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "users": "کاربرها", - "@users": {}, - "storeInSecureStorageDescription": "کلید بازیابی را در محل ذخیره‌سازی امن این دستگاه ذخیره کنید.", - "@storeInSecureStorageDescription": {}, - "jump": "پرش", - "@jump": {}, - "allRooms": "تمام چت‌های گروهی", - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "report": "گزارش", - "@report": {}, - "openLinkInBrowser": "بازکردن پیوند در مرورگر", - "@openLinkInBrowser": {}, - "reportErrorDescription": "اوه نه. اشتباهی رخ داد. اگر تمایل دارید، می‌توانید این اشکال را با توسعه‌دهندگان گزارش دهید.", - "@reportErrorDescription": {}, - "signInWithPassword": "ورود با رمزعبور", - "@signInWithPassword": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "لطفا بعدا تلاش کنید یا سرور دیگری انتخاب کنید.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "notAnImage": "یک فایل تصویری نیست.", - "@notAnImage": {}, - "alwaysUse24HourFormat": "false", - "@alwaysUse24HourFormat": { - "description": "Set to true to always display time of day in 24 hour format." - }, - "setCustomPermissionLevel": "تنظیم سطح دسترسی سفارشی", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "لطفاً نقش از پیش تعریف‌شده‌ای را انتخاب کنید یا سطح دسترسی سفارشی بین ۰ تا ۱۰۰ وارد کنید.", - "@setPermissionsLevelDescription": {}, - "ignoreUser": "چشم‌پوشی از کاربر", - "@ignoreUser": {}, - "normalUser": "کاربر عادی", - "@normalUser": {}, - "importNow": "اکنون وارد کنید", - "@importNow": {}, - "importEmojis": "وارد کردن شکلک‌ها", - "@importEmojis": {}, - "importFromZipFile": "وارد کردن از پرونده زیپ", - "@importFromZipFile": {}, - "exportEmotePack": "صادر کردن بسته شکلک به‌صورت زیپ", - "@exportEmotePack": {}, - "replace": "جایگزین کردن", - "@replace": {}, - "aboutHomeserver": "درباره {homeserver}", - "@aboutHomeserver": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "addChatDescription": "افزودن توضیح گپ...", - "@addChatDescription": {}, - "commandHint_roomupgrade": "ارتقای این اتاق به نگارش مشخص‌شده", - "@commandHint_roomupgrade": {}, - "appLockDescription": "قفل کردن برنامه با رمز کوتاه هنگام عدم استفاده", - "@appLockDescription": {}, - "sendTypingNotifications": "فرستادن آگاه‌سازهای نوشتن", - "@sendTypingNotifications": {}, - "swipeRightToLeftToReply": "کشیدن از راست به چپ برای پاسخ", - "@swipeRightToLeftToReply": {}, - "countChatsAndCountParticipants": "{chats} گپ و {participants} شرکت‌کننده", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, - "noMoreChatsFound": "گپ دیگری پیدا نشد...", - "@noMoreChatsFound": {}, - "noChatsFoundHere": "اینجا هنوز گپی پیدا نشد. با استفاده از دکمه زیر گپ جدیدی با کسی شروع کنید. ⤵️", - "@noChatsFoundHere": {}, - "joinedChats": "گپ‌های پیوسته", - "@joinedChats": {}, - "unread": "خوانده‌نشده", - "@unread": {}, - "space": "فضا", - "@space": {}, - "spaces": "فضاها", - "@spaces": {}, - "checkList": "فهرست بررسی", - "@checkList": {}, - "countInvited": "{count} دعوت‌شده", - "@countInvited": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "createGroup": "ساختن گروه", - "@createGroup": {}, - "chatPermissions": "دسترسی‌های گپ", - "@chatPermissions": {}, - "emoteKeyboardNoRecents": "شکلک‌هایی که به تازگی استفاده‌شده اینجا نمایش داده میشوند...", - "@emoteKeyboardNoRecents": { - "type": "String", - "placeholders": {} - }, - "globalChatId": "شناسه گپ سراسری", - "@globalChatId": {}, - "accessAndVisibility": "دسترسی و قابلیت دید", - "@accessAndVisibility": {}, - "accessAndVisibilityDescription": "چه کسی اجازه پیوستن به این گپ را دارد و گپ چگونه قابل کشف است.", - "@accessAndVisibilityDescription": {}, - "calls": "تماس‌ها", - "@calls": {}, - "customEmojisAndStickers": "شکلک‌ها و برچسب‌های سفارشی", - "@customEmojisAndStickers": {}, - "customEmojisAndStickersBody": "افزودن یا هم‌رسانی شکلک‌ها یا برچسب‌های سفارشی که در هر گپ قابل استفاده‌اند.", - "@customEmojisAndStickersBody": {}, - "chatDescription": "توضیح گپ", - "@chatDescription": {}, - "chatDescriptionHasBeenChanged": "توضیح گپ تغییر کرد", - "@chatDescriptionHasBeenChanged": {}, - "hideRedactedMessages": "پنهان کردن پیام‌های ویرایش‌شده", - "@hideRedactedMessages": {}, - "hideRedactedMessagesBody": "اگر کسی پیامی را ویرایش کند، دیگر نمیتوان آن پیام را در گپ دید.", - "@hideRedactedMessagesBody": {}, - "hideInvalidOrUnknownMessageFormats": "پنهان کردن قالب‌های پیام نامعتبر یا ناشناخته", - "@hideInvalidOrUnknownMessageFormats": {}, - "block": "مسدود کردن", - "@block": {}, - "blockedUsers": "کاربران مسدود‌شده", - "@blockedUsers": {}, - "blockListDescription": "میتوانید کاربرانی که مزاحم شما هستند را مسدود کنید. از کاربران موجود در فهرست مسدود شخصی، پیام یا دعوت به اتاق دریافت نخواهید کرد.", - "@blockListDescription": {}, - "blockUsername": "چشم‌پوشی از نام کاربری", - "@blockUsername": {}, - "inviteContactToGroupQuestion": "آیا میخواهید {contact} را به گپ «{groupName}» دعوت کنید؟", - "@inviteContactToGroupQuestion": {}, - "noChatDescriptionYet": "هنوز توضیح گپی ساخته نشده است.", - "@noChatDescriptionYet": {}, - "tryAgain": "تلاش دوباره", - "@tryAgain": {}, - "invalidServerName": "نام سرور نامعتبر", - "@invalidServerName": {}, - "redactMessageDescription": "پیام برای همه شرکت‌کنندگان در این گفتگو ویرایش خواهد شد. این کار برگشت‌ناپذیر است.", - "@redactMessageDescription": {}, - "optionalRedactReason": "(اختیاری) دلیل ویرایش این پیام...", - "@optionalRedactReason": {}, - "messagesStyle": "پیام‌ها:", - "@messagesStyle": {}, - "shareInviteLink": "هم‌رسانی پیوند دعوت", - "@shareInviteLink": {}, - "hideMemberChangesInPublicChats": "پنهان کردن تغییرات اعضا در گپ‌های عمومی", - "@hideMemberChangesInPublicChats": {}, - "hideMemberChangesInPublicChatsBody": "برای بهبود خوانایی، اینکه کسی به گپ عمومی پیوست یا آن را ترک کرد در خط زمانی گپ نمایش داده نشود.", - "@hideMemberChangesInPublicChatsBody": {}, - "overview": "دید کلی", - "@overview": {}, - "notifyMeFor": "برایم آگاه‌ساز بفرست برای", - "@notifyMeFor": {}, - "passwordRecoverySettings": "تنظیمات بازیابی گذرواژه", - "@passwordRecoverySettings": {}, - "redactedBy": "ویرایش‌شده به‌دست {username}", - "@redactedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "directChat": "گپ مستقیم", - "@directChat": {}, - "redactedByBecause": "ویرایش‌شده به‌دست {username} زیرا: «{reason}»", - "@redactedByBecause": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "reason": { - "type": "String" - } - } - }, - "sendImages": "فرستادن {count} تصویر", - "@sendImages": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "setChatDescription": "تنظیم توضیح گپ", - "@setChatDescription": {}, - "presenceStyle": "حضور:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, - "presencesToggle": "نمایش پیام‌های وضعیت از دیگر کاربران", - "@presencesToggle": { - "type": "String", - "placeholders": {} - }, - "synchronizingPleaseWaitCounter": " در حال همگام‌سازی... ({percentage}%)", - "@synchronizingPleaseWaitCounter": { - "type": "String", - "placeholders": { - "percentage": { - "type": "String" - } - } - }, - "youInvitedToBy": "📩 شما با پیوند دعوت شده‌اید به:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "invitedBy": "📩 دعوت‌شده توسط {user}", - "@invitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "hasKnocked": "🚪 {user} در زده است", - "@hasKnocked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "usersMustKnock": "کاربران باید در بزنند", - "@usersMustKnock": {}, - "noOneCanJoin": "هیچ‌کس نمیتواند بپیوندد", - "@noOneCanJoin": {}, - "userWouldLikeToChangeTheChat": "{user} مایل به پیوستن به گپ است.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "هنوز پیوند عمومی ساخته نشده است", - "@noPublicLinkHasBeenCreatedYet": {}, - "knock": "در زدن", - "@knock": {}, - "hidePresences": "پنهان کردن فهرست وضعیت؟", - "@hidePresences": {}, - "signInWith": "ورود با {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "profileNotFound": "کاربر در سرور پیدا نشد. شاید مشکل اتصال وجود دارد یا کاربر وجود ندارد.", - "@profileNotFound": {}, - "setTheme": "تنظیم پوسته:", - "@setTheme": {}, - "setColorTheme": "تنظیم پوسته رنگی:", - "@setColorTheme": {}, - "invite": "دعوت", - "@invite": {}, - "inviteGroupChat": "📨 دعوت به گپ گروهی", - "@inviteGroupChat": {}, - "invitePrivateChat": "📨 دعوت به گپ خصوصی", - "@invitePrivateChat": {}, - "invalidInput": "ورودی نامعتبر!", - "@invalidInput": {}, - "wrongPinEntered": "رمز کوتاه نادرست وارد شد! {seconds} ثانیه دیگر دوباره تلاش کنید...", - "@wrongPinEntered": { - "type": "String", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "pleaseEnterANumber": "لطفاً عددی بزرگ‌تر از ۰ وارد کنید", - "@pleaseEnterANumber": {}, - "archiveRoomDescription": "گپ به بایگانی خواهد رفت. کاربران دیگر میتوانند ببینند که شما گپ را ترک کرده‌اید.", - "@archiveRoomDescription": {}, - "roomUpgradeDescription": "گپ با نگارش جدید اتاق بازسازی خواهد شد. به همه شرکت‌کنندگان آگاهی‌رسانی میشود که باید به گپ جدید بروند. داده‌های بیشتر درباره نگارش‌های اتاق در https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, - "removeDevicesDescription": "از این دستگاه خارج خواهید شد و دیگر نمیتوانید پیام دریافت کنید.", - "@removeDevicesDescription": {}, - "banUserDescription": "کاربر از گپ محروم خواهد شد و تا زمانی که محرومیت برداشته نشود، نمیتواند دوباره وارد گپ شود.", - "@banUserDescription": {}, - "unbanUserDescription": "کاربر در صورت تلاش دوباره میتواند وارد گپ شود.", - "@unbanUserDescription": {}, - "kickUserDescription": "کاربر از گپ بیرون میشود اما محروم نمیشود. در گپ‌های عمومی، کاربر میتواند هر زمان دوباره بپیوندد.", - "@kickUserDescription": {}, - "makeAdminDescription": "پس از مدیر کردن این کاربر، ممکن است نتوانید این کار را لغو کنید، زیرا آن‌ها همان دسترسی‌های شما را خواهند داشت.", - "@makeAdminDescription": {}, - "pushNotificationsNotAvailable": "آگاه‌سازهای فشاری در دسترس نیستند", - "@pushNotificationsNotAvailable": {}, - "learnMore": "بیشتر بدانید", - "@learnMore": {}, - "yourGlobalUserIdIs": "شناسه کاربری سراسری شما: ", - "@yourGlobalUserIdIs": {}, - "noUsersFoundWithQuery": "متأسفانه کاربری با «{query}» پیدا نشد. لطفاً بررسی کنید که آیا اشتباه نوشتاری دارید.", - "@noUsersFoundWithQuery": { - "type": "String", - "placeholders": { - "query": { - "type": "String" - } - } - }, - "knocking": "در زدن", - "@knocking": {}, - "chatCanBeDiscoveredViaSearchOnServer": "گپ با جستجو در {server} قابل کشف است", - "@chatCanBeDiscoveredViaSearchOnServer": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "searchChatsRooms": "جستجو برای #گپ‌ها، @کاربران...", - "@searchChatsRooms": {}, - "nothingFound": "چیزی پیدا نشد...", - "@nothingFound": {}, - "groupName": "نام گروه", - "@groupName": {}, - "createGroupAndInviteUsers": "ساختن گروه و دعوت کاربران", - "@createGroupAndInviteUsers": {}, - "groupCanBeFoundViaSearch": "گروه با جستجو قابل یافتن است", - "@groupCanBeFoundViaSearch": {}, - "wrongRecoveryKey": "متأسفیم... به نظر میرسد این کلید بازیابی درست نباشد.", - "@wrongRecoveryKey": {}, - "startConversation": "آغاز گفتگو", - "@startConversation": {}, - "commandHint_sendraw": "فرستادن JSON خام", - "@commandHint_sendraw": {}, - "databaseMigrationTitle": "پایگاه داده بهینه‌سازی شد", - "@databaseMigrationTitle": {}, - "databaseMigrationBody": "لطفاً صبر کنید. این ممکن است لحظه‌ای طول بکشد.", - "@databaseMigrationBody": {}, - "leaveEmptyToClearStatus": "برای پاک کردن وضعیت، خالی بگذارید.", - "@leaveEmptyToClearStatus": {}, - "select": "انتخاب", - "@select": {}, - "searchForUsers": "جستجو برای @کاربران...", - "@searchForUsers": {}, - "pleaseEnterYourCurrentPassword": "لطفاً گذرواژه کنونی خود را وارد کنید", - "@pleaseEnterYourCurrentPassword": {}, - "newPassword": "گذرواژه جدید", - "@newPassword": {}, - "pleaseChooseAStrongPassword": "لطفاً یک گذرواژه قوی انتخاب کنید", - "@pleaseChooseAStrongPassword": {}, - "passwordsDoNotMatch": "گذرواژه‌ها هم‌خوانی ندارند", - "@passwordsDoNotMatch": {}, - "passwordIsWrong": "گذرواژه واردشده نادرست است", - "@passwordIsWrong": {}, - "publicLink": "پیوند عمومی", - "@publicLink": {}, - "publicChatAddresses": "نشانی‌های گپ عمومی", - "@publicChatAddresses": {}, - "createNewAddress": "ساختن نشانی جدید", - "@createNewAddress": {}, - "joinSpace": "پیوستن به فضا", - "@joinSpace": {}, - "publicSpaces": "فضاهای عمومی", - "@publicSpaces": {}, - "addChatOrSubSpace": "افزودن گپ یا زیرفضا", - "@addChatOrSubSpace": {}, - "subspace": "زیرفضا", - "@subspace": {}, - "decline": "نپذیرفتن", - "@decline": {}, - "thisDevice": "این دستگاه:", - "@thisDevice": {}, - "userRole": "نقش کاربر", - "@userRole": {}, - "minimumPowerLevel": "{level} کمینه سطح دسترسی است.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, - "searchIn": "جستجو در گپ «{chat}»...", - "@searchIn": { - "type": "String", - "placeholders": { - "chat": { - "type": "String" - } - } - }, - "searchMore": "جستجوی بیشتر...", - "@searchMore": {}, - "gallery": "نگارخانه", - "@gallery": {}, - "files": "پرونده‌ها", - "@files": {}, - "databaseBuildErrorBody": "ناتوانی در ساخت پایگاه داده SQLite. برنامه اکنون سعی میکند از پایگاه داده قدیمی استفاده کند. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "sessionLostBody": "نشست شما گم شده است. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", - "@sessionLostBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "restoreSessionBody": "برنامه اکنون سعی میکند نشست شما را از پشتیبان بازیابی کند. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", - "@restoreSessionBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "forwardMessageTo": "هدایت پیام به {roomName}؟", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, - "sendReadReceipts": "فرستادن رسیدهای خواندن", - "@sendReadReceipts": {}, - "sendTypingNotificationsDescription": "دیگر شرکت‌کنندگان در گپ میتوانند ببینند که شما در حال تایپ پیام جدید هستید.", - "@sendTypingNotificationsDescription": {}, - "sendReadReceiptsDescription": "دیگر شرکت‌کنندگان در گپ میتوانند ببینند که شما پیام را خوانده‌اید.", - "@sendReadReceiptsDescription": {}, - "formattedMessages": "پیام‌های قالب‌بندی‌شده", - "@formattedMessages": {}, - "formattedMessagesDescription": "نمایش محتوای پیام غنی مانند متن پررنگ با استفاده از مارک‌داون.", - "@formattedMessagesDescription": {}, - "verifyOtherUser": "🔐 بازبینی کاربر دیگر", - "@verifyOtherUser": {}, - "verifyOtherUserDescription": "اگر کاربر دیگری را بازبینی کنید، میتوانید مطمئن شوید که واقعاً با چه کسی در حال نوشتن هستید. 💪\n\nهنگام شروع بازبینی، شما و کاربر دیگر پنجره‌ای در برنامه خواهید دید. در آنجا مجموعه‌ای از شکلک‌ها یا اعداد را مشاهده میکنید که باید با یکدیگر مقایسه کنید.\n\nبهترین راه برای این کار دیدار حضوری یا شروع تماس تصویری است. 👭", - "@verifyOtherUserDescription": {}, - "verifyOtherDevice": "🔐 بازبینی دستگاه دیگر", - "@verifyOtherDevice": {}, - "verifyOtherDeviceDescription": "هنگام بازبینی دستگاه دیگر، آن دستگاه‌ها میتوانند کلیدها را تبادل کنند و امنیت کلی شما را افزایش دهند. 💪 هنگام شروع بازبینی، پنجره‌ای در برنامه روی هر دو دستگاه ظاهر میشود. در آنجا مجموعه‌ای از شکلک‌ها یا اعداد را مشاهده میکنید که باید با یکدیگر مقایسه کنید. بهتر است پیش از شروع بازبینی، هر دو دستگاه در دسترس باشند. 🤳", - "@verifyOtherDeviceDescription": {}, - "acceptedKeyVerification": "{sender} بازبینی کلید را پذیرفت", - "@acceptedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "canceledKeyVerification": "{sender} بازبینی کلید را رد کرد", - "@canceledKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "completedKeyVerification": "{sender} بازبینی کلید را کامل کرد", - "@completedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "isReadyForKeyVerification": "{sender} برای بازبینی کلید آماده است", - "@isReadyForKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "requestedKeyVerification": "{sender} درخواست بازبینی کلید کرد", - "@requestedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "startedKeyVerification": "{sender} بازبینی کلید را آغاز کرد", - "@startedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "transparent": "شفاف", - "@transparent": {}, - "incomingMessages": "پیام‌های دریافتی", - "@incomingMessages": {}, - "stickers": "برچسب‌ها", - "@stickers": {}, - "discover": "کشف", - "@discover": {}, - "commandHint_ignore": "چشم‌پوشی از شناسه ماتریکس داده‌شده", - "@commandHint_ignore": {}, - "commandHint_unignore": "لغو چشم‌پوشی از شناسه ماتریکس داده‌شده", - "@commandHint_unignore": {}, - "unreadChatsInApp": "{appname}: {unread} گپ خوانده‌نشده", - "@unreadChatsInApp": { - "type": "String", - "placeholders": { - "appname": { - "type": "String" - }, - "unread": { - "type": "String" - } - } - }, - "noDatabaseEncryption": "رمزنگاری پایگاه داده در این سکو پشتیبانی نمیشود", - "@noDatabaseEncryption": {}, - "thereAreCountUsersBlocked": "اکنون {count} کاربر مسدود شده‌اند.", - "@thereAreCountUsersBlocked": { - "type": "String", - "count": {} - }, - "restricted": "محدودشده", - "@restricted": {}, - "knockRestricted": "در زدن محدود", - "@knockRestricted": {}, - "goToSpace": "رفتن به فضا: {space}", - "@goToSpace": { - "type": "String", - "space": {} - }, - "markAsUnread": "علامت‌گذاری به‌عنوان خوانده‌نشده", - "@markAsUnread": {}, - "userLevel": "{level} - کاربر", - "@userLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "moderatorLevel": "{level} - ناظر", - "@moderatorLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "adminLevel": "{level} - مدیر", - "@adminLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "changeGeneralChatSettings": "تغییر تنظیمات عمومی گپ", - "@changeGeneralChatSettings": {}, - "inviteOtherUsers": "دعوت کاربران دیگر به این گپ", - "@inviteOtherUsers": {}, - "changeTheChatPermissions": "تغییر دسترسی‌های گپ", - "@changeTheChatPermissions": {}, - "changeTheVisibilityOfChatHistory": "تغییر قابلیت دید تاریخچه گپ", - "@changeTheVisibilityOfChatHistory": {}, - "changeTheCanonicalRoomAlias": "تغییر نشانی اصلی گپ عمومی", - "@changeTheCanonicalRoomAlias": {}, - "sendRoomNotifications": "فرستادن آگاه‌سازهای @room", - "@sendRoomNotifications": {}, - "changeTheDescriptionOfTheGroup": "تغییر توضیح گپ", - "@changeTheDescriptionOfTheGroup": {}, - "chatPermissionsDescription": "مشخص کنید کدام سطح دسترسی برای اقدامات خاصی در این گپ لازم است. سطح‌های دسترسی ۰، ۵۰ و ۱۰۰ معمولاً نشان‌دهنده کاربران، ناظران و مدیران هستند، اما هر درجه‌بندی ممکن است.", - "@chatPermissionsDescription": {}, - "updateInstalled": "🎉 به‌روزرسانی {version} نصب شد!", - "@updateInstalled": { - "type": "String", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "changelog": "فهرست تغییرات", - "@changelog": {}, - "sendCanceled": "فرستادن رد شد", - "@sendCanceled": {}, - "loginWithMatrixId": "ورود با شناسه ماتریکس", - "@loginWithMatrixId": {}, - "discoverHomeservers": "کشف سرورهای خانگی", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "سرور خانگی چیست؟", - "@whatIsAHomeserver": {}, - "homeserverDescription": "همه داده‌های شما روی سرور خانگی نگه‌داری میشوند، مانند یک فراهم‌کننده رایانامه. میتوانید سرور خانگی مورد نظر خود را انتخاب کنید، در حالی که همچنان میتوانید با هر کسی گفتگو کنید. اطلاعات بیشتر در https://matrix.org.", - "@homeserverDescription": {}, - "doesNotSeemToBeAValidHomeserver": "به نظر نمیرسد سرور خانگی سازگاری داشته باشد. نشانی اشتباه است؟", - "@doesNotSeemToBeAValidHomeserver": {}, - "calculatingFileSize": "در حال محاسبه اندازه پرونده...", - "@calculatingFileSize": {}, - "prepareSendingAttachment": "آماده‌سازی برای فرستادن پیوست...", - "@prepareSendingAttachment": {}, - "sendingAttachment": "در حال فرستادن پیوست...", - "@sendingAttachment": {}, - "generatingVideoThumbnail": "در حال تولید تصویر کوچک ویدئو...", - "@generatingVideoThumbnail": {}, - "compressVideo": "در حال فشرده‌سازی ویدئو...", - "@compressVideo": {}, - "sendingAttachmentCountOfCount": "در حال فرستادن پیوست {index} از {length}...", - "@sendingAttachmentCountOfCount": { - "type": "integer", - "placeholders": { - "index": { - "type": "int" - }, - "length": { - "type": "int" - } - } - }, - "serverLimitReached": "محدودیت سرور رسیده است! {seconds} ثانیه صبر کنید...", - "@serverLimitReached": { - "type": "integer", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "oneOfYourDevicesIsNotVerified": "یکی از دستگاه‌های شما بازبینی نشده است", - "@oneOfYourDevicesIsNotVerified": {}, - "noticeChatBackupDeviceVerification": "توجه: وقتی همه دستگاه‌های خود را به پشتیبان گپ متصل کنید، به‌صورت خودکار بازبینی میشوند.", - "@noticeChatBackupDeviceVerification": {}, - "continueText": "ادامه", - "@continueText": {}, - "welcomeText": "درود درود 👋 این فلافی‌چت است. میتوانید به هر سرور خانگی سازگار با https://matrix.org وارد شوید و با هر کسی گپ بزنید. این یک شبکه پیام‌رسانی غیرمتمرکز بزرگ است!", - "@welcomeText": {}, - "blur": "محو کردن:", - "@blur": {}, - "opacity": "شفافیت:", - "@opacity": {}, - "setWallpaper": "تنظیم کاغذدیواری", - "@setWallpaper": {}, - "manageAccount": "مدیریت حساب", - "@manageAccount": {}, - "noContactInformationProvided": "سرور هیچ اطلاعات تماس معتبری نمیدهد", - "@noContactInformationProvided": {}, - "contactServerAdmin": "تماس با مدیر سرور", - "@contactServerAdmin": {}, - "contactServerSecurity": "تماس با امنیت سرور", - "@contactServerSecurity": {}, - "supportPage": "صفحه پشتیبانی", - "@supportPage": {}, - "serverInformation": "درباره سرور:", - "@serverInformation": {}, - "name": "نام", - "@name": {}, - "version": "نگارش", - "@version": {}, - "website": "وبگاه", - "@website": {}, - "compress": "فشرده‌سازی", - "@compress": {}, - "boldText": "متن درشت", - "@boldText": {}, - "italicText": "متن کج", - "@italicText": {}, - "strikeThrough": "خط‌خورده", - "@strikeThrough": {}, - "pleaseFillOut": "لطفاً پر کنید", - "@pleaseFillOut": {}, - "invalidUrl": "نشانی نامعتبر", - "@invalidUrl": {}, - "addLink": "افزودن پیوند", - "@addLink": {}, - "unableToJoinChat": "ناتوانی در پیوستن به گپ. شاید طرف مقابل گفتگو را بسته است.", - "@unableToJoinChat": {}, - "previous": "پیشین", - "@previous": {}, - "otherPartyNotLoggedIn": "طرف مقابل اکنون وارد نشده است و بنابراین نمیتواند پیام دریافت کند!", - "@otherPartyNotLoggedIn": {}, - "appWantsToUseForLogin": "برای ورود از '{server}' استفاده کنید", - "@appWantsToUseForLogin": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "appWantsToUseForLoginDescription": "شما بدین‌وسیله به برنامه و وبگاه اجازه میدهید اطلاعات شما را هم‌رسانی کنند.", - "@appWantsToUseForLoginDescription": {}, - "open": "باز کردن", - "@open": {}, - "waitingForServer": "در انتظار سرور...", - "@waitingForServer": {}, - "appIntroduction": "فلافی‌چت به شما امکان گپ با دوستانتان در پیام‌رسان‌های مختلف را میدهد. اطلاعات بیشتر در https://matrix.org یا فقط روی *ادامه* بزنید.", - "@appIntroduction": {}, - "newChatRequest": "📩 درخواست گپ جدید", - "@newChatRequest": {}, - "contentNotificationSettings": "تنظیمات آگاه‌ساز محتوا", - "@contentNotificationSettings": {}, - "generalNotificationSettings": "تنظیمات آگاه‌ساز عمومی", - "@generalNotificationSettings": {}, - "roomNotificationSettings": "تنظیمات آگاه‌ساز اتاق", - "@roomNotificationSettings": {}, - "userSpecificNotificationSettings": "تنظیمات آگاه‌ساز خاص کاربر", - "@userSpecificNotificationSettings": {}, - "otherNotificationSettings": "سایر تنظیمات آگاه‌ساز", - "@otherNotificationSettings": {}, - "notificationRuleContainsUserName": "دارای نام کاربری", - "@notificationRuleContainsUserName": {}, - "notificationRuleContainsUserNameDescription": "وقتی پیامی حاوی نام کاربری باشد، کاربر را آگاه میکند.", - "@notificationRuleContainsUserNameDescription": {}, - "notificationRuleMaster": "بی‌صدا کردن همه آگاه‌سازها", - "@notificationRuleMaster": {}, - "notificationRuleMasterDescription": "از قوانین دیگر چشم‌پوشی میکند و همه آگاه‌سازها را غیرفعال میکند.", - "@notificationRuleMasterDescription": {}, - "notificationRuleSuppressNotices": "سرکوب پیام‌های خودکار", - "@notificationRuleSuppressNotices": {}, - "notificationRuleSuppressNoticesDescription": "آگاه‌سازهای کارخواه‌های خودکار مانند ربات‌ها را سرکوب میکند.", - "@notificationRuleSuppressNoticesDescription": {}, - "notificationRuleInviteForMe": "دعوت برای من", - "@notificationRuleInviteForMe": {}, - "notificationRuleInviteForMeDescription": "وقتی کاربر به اتاقی دعوت میشود، او را آگاه میکند.", - "@notificationRuleInviteForMeDescription": {}, - "notificationRuleMemberEvent": "رویداد عضویت", - "@notificationRuleMemberEvent": {}, - "notificationRuleMemberEventDescription": "آگاه‌سازهای رویدادهای عضویت را سرکوب میکند.", - "@notificationRuleMemberEventDescription": {}, - "notificationRuleIsUserMention": "نام‌بردن از کاربر", - "@notificationRuleIsUserMention": {}, - "notificationRuleIsUserMentionDescription": "وقتی در پیامی مستقیماً از کاربر نام برده میشود، او را آگاه میکند.", - "@notificationRuleIsUserMentionDescription": {}, - "notificationRuleContainsDisplayName": "دارای نام نمایشی", - "@notificationRuleContainsDisplayName": {}, - "notificationRuleContainsDisplayNameDescription": "وقتی پیامی حاوی نام نمایشی کاربر باشد، کاربر را آگاه میکند.", - "@notificationRuleContainsDisplayNameDescription": {}, - "notificationRuleIsRoomMention": "نام‌بردن از اتاق", - "@notificationRuleIsRoomMention": {}, - "notificationRuleIsRoomMentionDescription": "وقتی نام اتاق ذکر میشود، کاربر را آگاه میکند.", - "@notificationRuleIsRoomMentionDescription": {}, - "notificationRuleRoomnotif": "آگاه‌ساز اتاق", - "@notificationRuleRoomnotif": {}, - "notificationRuleRoomnotifDescription": "وقتی پیامی حاوی '@room' باشد، کاربر را آگاه میکند.", - "@notificationRuleRoomnotifDescription": {}, - "notificationRuleTombstone": "سنگ قبر", - "@notificationRuleTombstone": {}, - "notificationRuleTombstoneDescription": "کاربر را از پیام‌های غیرفعال‌سازی اتاق آگاه میکند.", - "@notificationRuleTombstoneDescription": {}, - "notificationRuleReaction": "واکنش", - "@notificationRuleReaction": {}, - "notificationRuleReactionDescription": "آگاه‌سازهای واکنش‌ها را سرکوب میکند.", - "@notificationRuleReactionDescription": {}, - "notificationRuleRoomServerAcl": "ACL سرور اتاق", - "@notificationRuleRoomServerAcl": {}, - "notificationRuleRoomServerAclDescription": "آگاه‌سازهای فهرست‌های کنترل دسترسی سرور اتاق (ACL) را سرکوب میکند.", - "@notificationRuleRoomServerAclDescription": {}, - "notificationRuleSuppressEdits": "سرکوب ویرایش‌ها", - "@notificationRuleSuppressEdits": {}, - "notificationRuleSuppressEditsDescription": "آگاه‌سازهای پیام‌های ویرایش‌شده را سرکوب میکند.", - "@notificationRuleSuppressEditsDescription": {}, - "notificationRuleCall": "تماس", - "@notificationRuleCall": {}, - "notificationRuleCallDescription": "درباره تماس‌ها کاربر را آگاه میکند.", - "@notificationRuleCallDescription": {}, - "notificationRuleEncryptedRoomOneToOne": "اتاق رمزنگاری‌شده یک‌به‌یک", - "@notificationRuleEncryptedRoomOneToOne": {}, - "notificationRuleEncryptedRoomOneToOneDescription": "کاربر را از پیام‌ها در اتاق‌های رمزنگاری‌شده یک‌به‌یک آگاه میکند.", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, - "notificationRuleRoomOneToOne": "اتاق یک‌به‌یک", - "@notificationRuleRoomOneToOne": {}, - "notificationRuleRoomOneToOneDescription": "کاربر را از پیام‌ها در اتاق‌های یک‌به‌یک آگاه میکند.", - "@notificationRuleRoomOneToOneDescription": {}, - "notificationRuleMessage": "پیام", - "@notificationRuleMessage": {}, - "notificationRuleMessageDescription": "کاربر را از پیام‌های عمومی آگاه میکند.", - "@notificationRuleMessageDescription": {}, - "notificationRuleEncrypted": "رمزنگاری‌شده", - "@notificationRuleEncrypted": {}, - "notificationRuleEncryptedDescription": "کاربر را از پیام‌ها در اتاق‌های رمزنگاری‌شده آگاه میکند.", - "@notificationRuleEncryptedDescription": {}, - "notificationRuleJitsi": "جیتسی", - "@notificationRuleJitsi": {}, - "notificationRuleJitsiDescription": "کاربر را از رویدادهای ابزارک جیتسی آگاه میکند.", - "@notificationRuleJitsiDescription": {}, - "notificationRuleServerAcl": "سرکوب رویدادهای ACL سرور", - "@notificationRuleServerAcl": {}, - "notificationRuleServerAclDescription": "آگاه‌سازهای رویدادهای ACL سرور را سرکوب میکند.", - "@notificationRuleServerAclDescription": {}, - "unknownPushRule": "قانون ناشناخته آگاه‌ساز '{rule}'", - "@unknownPushRule": { - "type": "String", - "placeholders": { - "rule": { - "type": "String" - } - } - }, - "sentVoiceMessage": "🎙️ {duration} - پیام صوتی از {sender}", - "@sentVoiceMessage": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - }, - "duration": { - "type": "String" - } - } - }, - "deletePushRuleCanNotBeUndone": "اگر این تنظیم آگاه‌ساز را پاک کنید، این کار برگشت‌ناپذیر است.", - "@deletePushRuleCanNotBeUndone": {}, - "more": "بیشتر", - "@more": {}, - "shareKeysWith": "هم‌رسانی کلیدها با...", - "@shareKeysWith": {}, - "shareKeysWithDescription": "کدام دستگاه‌ها باید مورد اعتماد باشند تا بتوانند پیام‌های شما را در گپ‌های رمزنگاری‌شده بخوانند؟", - "@shareKeysWithDescription": {}, - "allDevices": "همه دستگاه‌ها", - "@allDevices": {}, - "crossVerifiedDevicesIfEnabled": "دستگاه‌های بازبینی‌شده متقابل اگر فعال باشد", - "@crossVerifiedDevicesIfEnabled": {}, - "crossVerifiedDevices": "دستگاه‌های بازبینی‌شده متقابل", - "@crossVerifiedDevices": {}, - "verifiedDevicesOnly": "فقط دستگاه‌های بازبینی‌شده", - "@verifiedDevicesOnly": {}, - "takeAPhoto": "گرفتن عکس", - "@takeAPhoto": {}, - "recordAVideo": "ضبط ویدئو", - "@recordAVideo": {}, - "optionalMessage": "(اختیاری) پیام...", - "@optionalMessage": {}, - "notSupportedOnThisDevice": "در این دستگاه پشتیبانی نمیشود", - "@notSupportedOnThisDevice": {}, - "enterNewChat": "ورود به گپ جدید", - "@enterNewChat": {}, - "approve": "پذیرفتن", - "@approve": {}, - "youHaveKnocked": "شما در زده‌اید", - "@youHaveKnocked": {}, - "pleaseWaitUntilInvited": "لطفاً اکنون صبر کنید تا کسی از اتاق شما را دعوت کند.", - "@pleaseWaitUntilInvited": {}, - "commandHint_logout": "خروج از دستگاه کنونی", - "@commandHint_logout": {}, - "commandHint_logoutall": "خروج از همه دستگاه‌های فعال", - "@commandHint_logoutall": {}, - "displayNavigationRail": "نمایش نوار ناوبری در تلفن همراه", - "@displayNavigationRail": {}, - "customReaction": "واکنش سفارشی", - "@customReaction": {}, - "moreEvents": "رویدادهای بیشتر", - "@moreEvents": {}, - "initAppError": "خطایی هنگام آغاز برنامه رخ داد", - "@initAppError": {} + "accept": "پذیرش", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} دعوت را پذیرفت", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "حساب", + "@account": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "به فضا افزودن", + "appLock": "قفل برنامه", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "all": "همه", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "همه گپ‌ها", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addEmail": "افزودن رایانامه", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} به تماس پاسخ داد", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "هرکسی می‌تواند بپیوندد", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "بایگانی", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "مطمئن هستید؟", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "مطمئن هستید می‌خواهید خارج شوید؟", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} رمزنگاری سراسری را فعال کرد", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "مدیر", + "@admin": { + "type": "String", + "placeholders": {} + }, + "supposedMxid": "گمان میرود {mxid} باشد", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "botMessages": "پیام‌های ربات", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} نام نمایشی را به '{displayname}' تغییر داد", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "confirmMatrixId": "برای پاک کردن حساب، لطفاً هویت ماتریکس خود را بپذیرید.", + "changeDeviceName": "تغییر نام دستگاه", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "alias": "نام مستعار", + "@alias": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "محروم کردن از گپ", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "آیا درخواست بازبینی {username} را می‌پذیرید؟", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "areGuestsAllowedToJoin": "آیا مهمانان اجازه پیوستن دارند", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "autoplayImages": "پخش خودکار شکلک‌ها و برچسب‌های متحرک", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "sendOnEnter": "فرستادن با کلید Enter", + "cancel": "رد کردن", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changedTheChatDescriptionTo": "{username} توضیح گپ را به '{description}' تغییر داد", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} دسترسی‌های گپ را تغییر داد", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} نام گپ را به '{chatname}' تغییر داد", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "cantOpenUri": "نمی‌توان پیوند {uri} را باز کرد", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "banned": "محروم‌شده", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} کاربر {targetName} را محروم کرد", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "مسدود کردن دستگاه", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "مسدود‌شده", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "سرور از این نوع ورود پشتیبانی می‌کند:\n{serverVersions}\nاما برنامه تنها از این‌ها پشتیبانی می‌کند:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "badServerVersionsException": "سرور از این نسخه‌های مشخصات پشتیبانی می‌کند:\n{serverVersions}\nاما برنامه تنها از این‌ها پشتیبانی می‌کند:\n{supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "changedTheChatAvatar": "{username} نماد گپ را تغییر داد", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} قوانین دسترسی مهمان را تغییر داد", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} نماد نمایه را تغییر داد", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chats": "گپ‌ها", + "@chats": { + "type": "String", + "placeholders": {} + }, + "messages": "پیام‌ها", + "@messages": { + "type": "String", + "placeholders": {} + }, + "send": "فرستادن", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "فرستادن صدا", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "فرستادن نسخه اصلی", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "changedTheRoomAliases": "{username} نام‌های مستعار اتاق را تغییر داد", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} پیوند دعوت را تغییر داد", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "close": "بستن", + "@close": { + "type": "String", + "placeholders": {} + }, + "sendImage": "فرستادن تصویر", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "فرستادن پیام‌ها", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "changedTheHistoryVisibility": "{username} ویژگی دیدن تاریخچه را تغییر داد", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} قوانین دسترسی مهمان را به {rules} تغییر داد", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} قوانین پیوستن را به {joinRules} تغییر داد", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ویژگی دیدن تاریخچه را به {rules} تغییر داد", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "chooseAStrongPassword": "یک گذرواژه قوی انتخاب کنید", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "پشتیبان گپ شما تنظیم شد.", + "changeTheme": "تغییر پوسته", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "تغییر نام گروه", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "تغییر نماد نمایه", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "رمزنگاری مخدوش شده است", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "پاک کردن بایگانی", + "commandHint_create": "ساختن یک گپ گروهی خالی\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_dm": "شروع یک گپ مستقیم\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "sendSticker": "فرستادن برچسب", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "فرستادن ویدئو", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sender": "فرستنده", + "changedTheJoinRules": "{username} قوانین پیوستن را تغییر داد", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chatDetails": "جزئیات گپ", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "علامت‌گذاری به‌عنوان اتاق پیام مستقیم با شناسه ماتریکس", + "commandHint_markasgroup": "علامت‌گذاری به‌عنوان گروه", + "commandHint_clearcache": "پاک کردن حافظه نهان", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "رد کردن نشست", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "groups": "گروه‌ها", + "@groups": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "برای خواندن پیام‌ها، برنامه را باز کنید", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "فرستادن پیام", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sentCallInformations": "{senderName} اطلاعات تماس را فرستاد", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "sendAsText": "فرستادن به‌عنوان متن", + "@sendAsText": { + "type": "String" + }, + "sendFile": "فرستادن پرونده", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} تماس را آغاز کرد", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "tryToSendAgain": "تلاش دوباره برای فرستادن", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "reactedWith": "{sender} با {reaction} واکنش نشان داد", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "askSSSSSign": "لطفاً عبارت عبور یا کلید بازیابی حافظه امن را وارد کنید تا شخص دیگری را امضا کنید.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "گپ به این فضا افزوده شد", + "chat": "گپ", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatBackup": "پشتیبان گپ", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changePassword": "تغییر گذرواژه", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "تغییر سرور خانگی", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "separateChatTypes": "جداسازی گپ‌های مستقیم از گروه‌ها", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "sentAPicture": "🖼️ {username} یک تصویر فرستاد", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} یک ویدئو فرستاد", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandInvalid": "دستور نامعتبر", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} یک دستور نیست.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "contactHasBeenInvitedToTheGroup": "مخاطب به گروه دعوت شد", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} یک پرونده فرستاد", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} یک صدا فرستاد", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} یک رویداد {type} فرستاد", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "weSentYouAnEmail": "یک رایانامه برای شما فرستادیم", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "بارگیری {count} شرکت‌کننده دیگر", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentASticker": "😊 {username} یک برچسب فرستاد", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "connect": "اتصال", + "@connect": { + "type": "String", + "placeholders": {} + }, + "confirm": "پذیرفتن", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "allSpaces": "همه فضاها", + "commandHint_ban": "محروم کردن کاربر مشخص‌شده از این اتاق", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_kick": "بیرون کردن کاربر مشخص‌شده از این اتاق", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_plain": "فرستادن متن بدون قالب", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_unban": "رد محرومیت کاربر مشخص‌شده از این اتاق", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "containsDisplayName": "دارای نام نمایشی", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "دارای نام کاربری", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "device": "دستگاه", + "@device": { + "type": "String", + "placeholders": {} + }, + "copy": "رونوشت", + "@copy": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "سطح دسترسی پیش‌فرض", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "پاک کردن", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "پاک کردن حساب", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "پاک کردن پیام", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "فرستادن متن با قالب HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_join": "پیوستن به اتاق مشخص‌شده", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_leave": "ترک این اتاق", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_myroomnick": "تنظیم نام نمایشی برای این اتاق", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_myroomavatar": "تنظیم نماد نمایه برای این اتاق (با mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_op": "تنظیم سطح دسترسی کاربر مشخص‌شده (پیش‌فرض: ۵۰)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_react": "فرستادن پاسخ به‌عنوان واکنش", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "compareEmojiMatch": "لطفاً شکلک‌ها را مقایسه کنید", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "رونوشت به بریده‌دان", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "countParticipants": "{count} شرکت‌کننده", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "ساختن", + "@create": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "فضای جدید", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deviceId": "شناسه دستگاه", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "دستگاه‌ها", + "@devices": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "نام نمایشی تغییر کرد", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "بارگیری پرونده", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "ویرایش", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "ویرایش سرورهای مسدود", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "ویرایش نام‌های مستعار اتاق", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "ویرایش نماد اتاق", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "شکلک از پیش وجود دارد!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "باید یک کد کوتاه شکلک و یک تصویر انتخاب کنید!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "کد کوتاه شکلک نامعتبر است!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "گپ خالی", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "به بریده‌دان رونوشت شد", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} گپ را ساخت", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "darkTheme": "تیره", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "directChats": "گپ‌های مستقیم", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "بسته‌های شکلک برای اتاق", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "تنظیمات شکلک", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "کد کوتاه شکلک", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "توصیف خود", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_send": "فرستادن متن", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "couldNotDecryptMessage": "نمی‌توان پیام را رمزگشایی کرد: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "chatBackupDescription": "پیام‌های شما با کلید بازیابی محافظت می‌شوند. حتماً آن را نزد خود نگه دارید.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "این کار حساب شما را غیرفعال می‌کند. این کنش برگشت‌ناپذیر است! آیا مطمئن هستید؟", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "commandHint_invite": "دعوت از کاربر مشخص‌شده به این اتاق", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "compareNumbersMatch": "لطفاً اعداد را مقایسه کنید", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "پیکربندی گپ", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "currentlyActive": "اکنون فعال", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}، {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "editDisplayname": "ویرایش نام نمایشی", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "id": "شناسه", + "@id": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} دعوت {targetName} را پس گرفت", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "guestsAreForbidden": "مهمان‌ها ممنوع هستند", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "پنهان کردن رویدادهای ویرایش‌شده", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "پنهان کردن رویدادهای ناشناخته", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "محتوا به مدیران سرور گزارش شد", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "از پیوستن", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "از دعوت", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "رفتن به اتاق جدید", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "گروه", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "گروه عمومی است", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "گروه با {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "howOffensiveIsThisContent": "این محتوا چقدر توهین‌آمیز است؟", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "فعال کردن بسته شکلک به‌صورت سراسری", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "فعال کردن رمزنگاری", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "نمی‌توانید رمزنگاری را غیرفعال کنید. آیا مطمئن هستید؟", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "رمزنگاری‌شده", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "رمزنگاری", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "رمزنگاری فعال نیست", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "enterAnEmailAddress": "یک نشانی رایانامه وارد کنید", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} به تماس پایان داد", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "homeserver": "سرور خانگی", + "enterYourHomeserver": "سرور خانگی خود را وارد کنید", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "خطا در به‌دست آوردن مکان: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "همه‌چیز آماده است!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "بسیار توهین‌آمیز", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "نام پرونده", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "فلافی‌چت", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "اندازه قلم", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "هدایت", + "@forward": { + "type": "String", + "placeholders": {} + }, + "help": "کمک", + "@help": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "مهمان‌ها می‌توانند بپیوندند", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "کاربران نادیده‌گرفته شده", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "فرستادن چند چشم گوگولی", + "googlyEyesContent": "{senderName} برای شما چشم‌های گوگولی می‌فرستد", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "ignore": "نادیده‌گرفتن", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "cuddleContent": "{senderName} شما را در آغوش می‌گیرد", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "identity": "هویت", + "@identity": { + "type": "String", + "placeholders": {} + }, + "hugContent": "{senderName} شما را بغل می‌کند", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_cuddle": "فرستادن آغوش", + "commandHint_hug": "فرستادن بغل", + "editBundlesForAccount": "ویرایش بسته‌های این حساب", + "logout": "خروج", + "@logout": { + "type": "String", + "placeholders": {} + }, + "mention": "نام‌بردن", + "@mention": { + "type": "String", + "placeholders": {} + }, + "muteChat": "بی‌صدا کردن گپ", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "گپ جدید", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 پیام جدید در فلافی‌چت", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "بدون اتصال به سرور", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "no": "خیر", + "@no": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "هنوز روشی برای بازیابی گذرواژه خود اضافه نکرده‌اید.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "آگاه‌سازها برای این حساب فعال شدند", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "or": "یا", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "شرکت‌کننده", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "عبارت عبور یا کلید بازیابی", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "گذرواژه", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "گذرواژه تغییر کرد", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "بازیابی گذرواژه", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pin": "سنجاق کردن", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "پخش {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnter4Digits": "لطفاً ۴ رقم وارد کنید یا خالی بگذارید تا قفل برنامه غیرفعال شود.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "لطفاً رمز کوتاه خود را وارد کنید", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "لطفاً گذرواژه خود را وارد کنید", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "لطفاً دستورالعمل‌های وبگاه را دنبال کنید و روی بعدی بزنید.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "اتاق‌های عمومی", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "obtainingLocation": "در حال به‌دست آوردن مکان…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "اوه، مشکلی پیش آمد…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "افزودن به بسته", + "passwordForgotten": "فراموشی گذرواژه", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterRecoveryKey": "لطفاً کلید بازیابی خود را وارد کنید:", + "link": "پیوند", + "iHaveClickedOnLink": "روی پیوند کلیک کردم", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "عبارت عبور یا کلید بازیابی نادرست است", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "بی‌ضرر", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "دعوت مخاطب به {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "فقط کاربران دعوت‌شده", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "دعوت برای من", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "isTyping": "در حال نوشتن…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinRoom": "پیوستن به اتاق", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} کاربر {targetName} را بیرون کرد", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "بیرون کردن از گپ", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "گپ را ترک کرد", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "dehydrate": "صدور نشست و پاک کردن دستگاه", + "hydrateTorLong": "آیا آخرین بار نشست خود را با تور صادر کردید؟ آن را وارد کنید و گپ را ادامه دهید.", + "loadingPleaseWait": "در حال بارگذاری… لطفاً صبر کنید.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "بارگذاری بیشتر…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "دسترسی به مکان رد شد. برای هم‌رسانی مکان، لطفاً دسترسی بدهید.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "logInTo": "ورود به {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "memberChanges": "تغییرات اعضا", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "moderator": "ناظر", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "درخواست بازبینی جدید!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "noPermission": "بدون دسترسی", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "اتاقی پیدا نشد…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "offline": "آفلاین", + "@offline": { + "type": "String", + "placeholders": {} + }, + "online": "آنلاین", + "@online": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "اوه! خطایی در تنظیم آگاه‌سازها رخ داد.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "openCamera": "باز کردن دوربین", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "addAccount": "افزودن حساب", + "people": "افراد", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "انتخاب تصویر", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "لطفاً انتخاب کنید", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "لطفاً یک رمز کوتاه انتخاب کنید", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "لطفاً نام کاربری خود را وارد کنید", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "حریم خصوصی", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "license": "گواهینامه", + "@license": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} کاربر در حال نوشتن…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "invited": "دعوت‌شده", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} از {targetName} دعوت کرد", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "joinedTheChat": "👋 {username} به گپ پیوست", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} کاربر {targetName} را بیرون و محروم کرد", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "dehydrateWarning": "این کنش برگشت‌ناپذیر است. مطمئن شوید پرونده پشتیبان را به‌صورت امن ذخیره می‌کنید.", + "locationDisabledNotice": "مکان‌یاب غیرفعال است. لطفاً آن را فعال کنید تا بتوانید مکان خود را هم‌رسانی کنید.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "dehydrateTorLong": "برای کاربران تور، پیشنهاد می‌شود پیش از بستن پنجره، نشست را صادر کنند.", + "needPantalaimonWarning": "لطفاً توجه کنید که برای رمزنگاری سرتاسر به Pantalaimon نیاز دارید.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "next": "بعدی", + "@next": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "شکلکی پیدا نشد. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "به نظر می‌رسد دستگاه شما سرویس‌های گوگل ندارد. این انتخاب خوبی برای حریم خصوصی است! برای دریافت آگاه‌سازها در فلافی‌چت، پیشنهاد می‌کنیم از https://ntfy.sh استفاده کنید. با ntfy یا یک فراهم‌کننده UnifiedPush می‌توانید آگاه‌سازهای امن دریافت کنید. می‌توانید ntfy را از Play Store یا F-Droid بارگیری کنید.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "رمزنگاری را تنها زمانی می‌توانید فعال کنید که اتاق عمومی نباشد.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "پشتیبان‌گیری آنلاین کلید فعال است", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "enableMultiAccounts": "(آزمایشی) فعال کردن چند حساب در این دستگاه", + "pleaseClickOnLink": "لطفاً روی پیوند در رایانامه کلیک کنید و ادامه دهید.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "hydrateTor": "کاربران تور: وارد کردن نشست صادر شده", + "hydrate": "بازیابی از پرونده پشتیبان", + "inviteContact": "دعوت از مخاطب", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} سرور ماتریکس نیست، از {server2} استفاده شود؟", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "openVideoCamera": "باز کردن دوربین برای فیلم‌برداری", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "یکی از برنامه‌های شما از سیستم خارج شد", + "removeFromBundle": "برداشتن از بسته", + "bundleName": "نام بسته", + "openInMaps": "باز کردن در نقشه", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "serverRequiresEmail": "برای ثبت‌نام، این سرور باید نشانی رایانامه شما را تأیید کند.", + "inviteText": "{username} شما را به فلافی‌چت دعوت کرد.\n۱. به fluffychat.im بروید و برنامه را نصب کنید\n۲. ثبت‌نام کنید یا وارد شوید\n۳. پیوند دعوت را باز کنید:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "leave": "ترک کردن", + "@leave": { + "type": "String", + "placeholders": {} + }, + "none": "هیچ", + "@none": { + "type": "String", + "placeholders": {} + }, + "offensive": "توهین‌آمیز", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "پویش کد QR", + "lastActiveAgo": "آخرین فعالیت: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "lightTheme": "روشن", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "dehydrateTor": "کاربران تور: صدور نشست", + "login": "ورود", + "@login": { + "type": "String", + "placeholders": {} + }, + "notifications": "آگاه‌سازها", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "ok": "خوب", + "@ok": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "اتاق ارتقا یافت", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "register": "ثبت‌نام", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "رد کردن", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} دعوت را رد کرد", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "پیوستن دوباره", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "لغو محرومیت از گپ", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "پاسخ", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "درخواست دسترسی", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "نگارش اتاق", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "search": "جستجو", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "امنیت", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "دیده‌شده توسط {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "تنظیم به‌عنوان نام مستعار اصلی", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "برداشتن نماد نمایه", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "recording": "در حال ضبط", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} یک رویداد را ویرایش کرد", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "remove": "برداشتن", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "پاک کردن همه دستگاه‌های دیگر", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "پاک‌شده توسط {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "پاک کردن دستگاه", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "گزارش پیام", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "saveFile": "ذخیره پرونده", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "کلید بازیابی", + "setInvitationLink": "تنظیم پیوند دعوت", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "pushRules": "قوانین آگاه‌ساز", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "دلیل", + "@reason": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "تنظیم شکلک‌های سفارشی", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "ویرایش پیام", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "جایگزینی اتاق با نگارش جدیدتر", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "recoveryKeyLost": "کلید بازیابی گم شد؟", + "fileHasBeenSavedAt": "پرونده در {path} ذخیره شد", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "enterSpace": "ورود به فضا", + "wasDirectChatDisplayName": "گپ خالی (پیش‌تر {oldDisplayName} بود)", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "فضاها امکان یکپارچه‌سازی گپ‌ها و ساخت جوامع خصوصی یا عمومی را فراهم می‌کنند.", + "encryptThisChat": "رمزنگاری این گپ", + "sorryThatsNotPossible": "متأسفیم... این ممکن نیست", + "deviceKeys": "کلیدهای دستگاه:", + "fileIsTooBigForServer": "نمیتوان فرستاد! سرور تنها از پیوست های تا {max} پشتیبانی میکند.", + "jumpToLastReadMessage": "پرش به آخرین پیام خوانده‌شده", + "hideUnimportantStateEvents": "پنهان کردن رویدادهای غیرمهم وضعیت", + "doNotShowAgain": "دوباره نمایش نده", + "readUpToHere": "خوانده‌شده تا اینجا", + "noBackupWarning": "هشدار! بدون فعال کردن پشتیبان گپ، دسترسی به پیام‌های رمزنگاری‌شده خود را از دست خواهید داد. پیشنهاد می‌شود پیش از خروج، پشتیبان گپ را فعال کنید.", + "noOtherDevicesFound": "دستگاه دیگری پیدا نشد", + "countFiles": "{count} پرونده", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "callingAccountDetails": "اجازه به فلافی‌چت برای استفاده از شماره‌گیر بومی اندروید.", + "noKeyForThisMessage": "اگر پیام پیش از ورود به حساب در این دستگاه فرستاده شده باشد، این مشکل ممکن است رخ دهد.\n\nهمچنین ممکن است فرستنده دستگاه شما را مسدود کرده باشد یا مشکلی در اتصال اینترنت وجود داشته باشد.\n\nآیا می‌توانید پیام را در نشست دیگری بخوانید؟ در این صورت، می‌توانید آن را منتقل کنید! به تنظیمات > دستگاه‌ها بروید و مطمئن شوید دستگاه‌هایتان یکدیگر را بازبینی کرده‌اند. هنگام باز کردن دوباره اتاق و فعال بودن هر دو نشست، کلیدها به‌صورت خودکار منتقل می‌شوند.\n\nآیا نمی‌خواهید هنگام خروج یا تغییر دستگاه کلیدها را گم کنید؟ مطمئن شوید پشتیبان گپ را در تنظیمات فعال کرده‌اید.", + "numChats": "{number} گپ", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "disableEncryptionWarning": "به دلایل امنیتی نمی‌توانید رمزنگاری را در گپی که فعال شده غیرفعال کنید.", + "enterRoom": "ورود به اتاق", + "newGroup": "گروه جدید", + "foregroundServiceRunning": "این آگاه‌ساز زمانی ظاهر می‌شود که خدمت پیش‌زمینه فعال است.", + "appearOnTopDetails": "اجازه به برنامه برای نمایش در بالا (اگر فلافی‌چت را به‌عنوان حساب تماس تنظیم کرده‌اید، لازم نیست)", + "storeSecurlyOnThisDevice": "ذخیره امن در این دستگاه", + "screenSharingDetail": "شما در حال هم‌رسانی صفحه‌نمایش خود در فلافی‌چت هستید", + "newSpace": "فضای جدید", + "saveKeyManuallyDescription": "این کلید را با استفاده از هم‌رسانی یا بریده‌دان به‌طور دستی ذخیره کنید.", + "storeInAndroidKeystore": "ذخیره در Android KeyStore", + "storeInAppleKeyChain": "ذخیره در Apple KeyChain", + "user": "کاربر", + "custom": "سفارشی", + "screenSharingTitle": "هم‌رسانی صفحه‌نمایش", + "callingPermissions": "دسترسی‌های تماس", + "callingAccount": "حساب تماس", + "appearOnTop": "نمایش در بالا", + "otherCallingPermissions": "میکروفون، دوربین و دیگر دسترسی‌های فلافی‌چت", + "whyIsThisMessageEncrypted": "چرا این پیام خوانا نیست؟", + "reopenChat": "باز کردن دوباره گپ", + "unmuteChat": "فعال کردن صدای گپ", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "nextAccount": "حساب بعدی", + "unlockOldMessages": "گشودن پیام‌های قدیمی", + "share": "هم‌رسانی", + "@share": { + "type": "String", + "placeholders": {} + }, + "skip": "رد کردن", + "@skip": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "سامانه", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "هم‌خوانی ندارند", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "تغییر وضعیت برگزیده", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "تغییر وضعیت بی‌صدا", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "تغییر وضعیت خوانده‌شده/خوانده‌نشده", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "unavailable": "در دسترس نیست", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "باز کردن دستگاه", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "آغاز بازبینی", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "بازبینی با موفقیت انجام شد!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "در انتظار پذیرش شکلک توسط دیگری…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "کاغذدیواری:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "چه کسی می‌تواند چه کاری انجام دهد", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "نوشتن پیام…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "widgetVideo": "ویدئو", + "youHaveBeenBannedFromThisChat": "شما از این گپ محروم شده‌اید", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "تنظیم سطح دسترسی", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "تنظیم وضعیت", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "تنظیمات", + "@settings": { + "type": "String", + "placeholders": {} + }, + "showPassword": "نمایش گذرواژه", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "ورود یکپارچه", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "spaceName": "نام فضا", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startFirstChat": "شروع اولین گپ", + "theyMatch": "هم‌خوانی دارند", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "فلافی‌چت", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "درخواست‌های بیش از حد. لطفاً بعداً دوباره تلاش کنید!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} محرومیت {targetName} را برداشت", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownEncryptionAlgorithm": "الگوریتم رمزنگاری ناشناخته", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unpin": "برداشتن سنجاق", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} و {username2} در حال نوشتن…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "videoCall": "تماس تصویری", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "قابل‌دید برای همه شرکت‌کنندگان", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "قابل‌دید برای همه", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "پیام صوتی", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "در انتظار پذیرش درخواست توسط دیگری…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "warning": "هشدار!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "شما دیگر در این گپ شرکت نمی‌کنید", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "اطلاعات پیام", + "time": "زمان", + "messageType": "نوع پیام", + "addToSpaceDescription": "فضایی را برای افزودن این گپ انتخاب کنید.", + "start": "آغاز", + "videoWithSize": "ویدئو ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "userIsTyping": "{username} در حال نوشتن…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "نام کاربری", + "@username": { + "type": "String", + "placeholders": {} + }, + "yes": "بله", + "@yes": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "کلید عمومی شما", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "publish": "انتشار", + "shareLocation": "هم‌رسانی مکان", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "youInvitedUser": "📩 شما {user} را دعوت کردید", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unverified": "تأییدنشده", + "verify": "بازبینی", + "@verify": { + "type": "String", + "placeholders": {} + }, + "openChat": "باز کردن گپ", + "dismiss": "رد کردن", + "unsupportedAndroidVersion": "نسخه اندروید پشتیبانی‌نشده", + "youUnbannedUser": "شما محرومیت {user} را برداشتید", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "verified": "تاییدشده", + "@verified": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "چرا می‌خواهید گزارش دهید؟", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "you": "شما", + "@you": { + "type": "String", + "placeholders": {} + }, + "widgetJitsi": "جیتسی‌میت(Jitsi Meet)", + "sourceCode": "کد منبع", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "فضا عمومی است", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "در حال همگام‌سازی... لطفا صبر کنید.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "رویداد ناشناخته '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} و {count} نفر دیگر در حال تایپ کردن…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userLeftTheChat": "👋 {username} گپ را ترک کرد", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "verifyTitle": "در حال تایید حساب دیگر", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "قابلیت دیدن تاریخچه گپ", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "چه کسی اجازه پیوستن به این گروه را دارد", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "در انتظار پذیرش اعداد توسط دیگری…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "برای ایجاد کلید بازیابی جدید، پشتیبان گپ خود را پاک می‌کنید؟", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "با این آدرس‌ها می‌توانید رمز خود را بازیابی کنید.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "openGallery": "بازکردن گالری", + "removeFromSpace": "حذف از فضا", + "pleaseEnterRecoveryKeyDescription": "برای گشودن قفل پیام‌های قدیمیتان، لطفا کلید بازیابی‌ای که در یک نشست پیشین تولید شده را وارد کنید. کلید بازیابی شما، رمز عبور شما نیست.", + "confirmEventUnpin": "آیا از برداشتن سنجاق رویداد به صورت دائمی مطمئن هستید؟", + "indexedDbErrorLong": "متاسفانه فضای ذخیره‌سازی پیام‌ها، به صورت پیش‌فرض در حالت خصوصی فعال نیست.\nلطفا آدرس زیر را باز کنید:\nabout:config\nمقدار «dom.indexedDB.privateBrowsing.enabled» را به «true» تغییر دهید\nدر غیر این صورت، امکان اجرای فلافی‌چت وجود ندارد.", + "widgetEtherpad": "یادداشت متنی", + "youKickedAndBanned": "🙅 شما {user} را بیرون و محروم کردید", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "statusExampleMessage": "امروز حالتان چطور است؟", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "ارسال", + "@submit": { + "type": "String", + "placeholders": {} + }, + "youRejectedTheInvitation": "شما دعوت را رد کردید", + "youAcceptedTheInvitation": "👍 شما دعوت را پذیرفتید", + "emailOrUsername": "رایانامه(ایمیل) یا نام کاربری", + "transferFromAnotherDevice": "انتقال از دستگاهی دیگر", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "videoCallsBetaWarning": "لطفا توجه داشته باشید که تماس‌های تصویری در حال حاضر آزمایشی هستند. ممکن است طبق انتظار کار نکنند یا روی همه پلتفرم‌ها اصلا کار نکنند.", + "experimentalVideoCalls": "تماس‌های تصویری آزمایشی", + "placeCall": "برقراری تماس", + "unsupportedAndroidVersionLong": "این ویژگی به نسخه تازه‌تری از اندروید نیاز دارد. لطفا به‌روزرسانی یا پشتیبانی لینیج‌اواس(LineageOS) را بررسی کنید.", + "sharedTheLocation": "{username} وضعیت مکانی خود را به اشتراک گذاشت", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unreadChats": "{unreadCount, plural, other{{unreadCount} گپ خوانده نشده}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "status": "وضعیت", + "@status": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "دستگاه ناشناس", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "علامت‌گذاشتن به عنوان خوانده شده", + "reportUser": "گزارش دادن کاربر", + "pinMessage": "سنجاق کردن به اتاق", + "emojis": "شکلک‌ها", + "voiceCall": "تماس صوتی", + "indexedDbErrorTitle": "اشکالات حالت خصوصی", + "switchToAccount": "تغییر به حساب {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "previousAccount": "حساب قبلی", + "addWidget": "افزودن ویجت", + "widgetCustom": "سفارشی", + "widgetName": "نام", + "widgetUrlError": "این آدرس وب معتبر نیست.", + "widgetNameError": "لطفا یک نام نمایشی مشخص کنید.", + "errorAddingWidget": "بروز خطا هنگام افزودن ویجت.", + "youJoinedTheChat": "شما به گپ پیوستید", + "youBannedUser": "شما {user} را محروم کردید", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "شما دعوت {user} را پس‌گرفتید", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 شما توسط {user} دعوت شده‌اید", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 شما {user} را بیرون کردید", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "users": "کاربرها", + "storeInSecureStorageDescription": "کلید بازیابی را در محل ذخیره‌سازی امن این دستگاه ذخیره کنید.", + "jump": "پرش", + "allRooms": "تمام چت‌های گروهی", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "report": "گزارش", + "openLinkInBrowser": "بازکردن پیوند در مرورگر", + "reportErrorDescription": "اوه نه. اشتباهی رخ داد. اگر تمایل دارید، می‌توانید این اشکال را با توسعه‌دهندگان گزارش دهید.", + "signInWithPassword": "ورود با رمزعبور", + "pleaseTryAgainLaterOrChooseDifferentServer": "لطفا بعدا تلاش کنید یا سرور دیگری انتخاب کنید.", + "notAnImage": "یک فایل تصویری نیست.", + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "setCustomPermissionLevel": "تنظیم سطح دسترسی سفارشی", + "setPermissionsLevelDescription": "لطفاً نقش از پیش تعریف‌شده‌ای را انتخاب کنید یا سطح دسترسی سفارشی بین ۰ تا ۱۰۰ وارد کنید.", + "ignoreUser": "چشم‌پوشی از کاربر", + "normalUser": "کاربر عادی", + "importNow": "اکنون وارد کنید", + "importEmojis": "وارد کردن شکلک‌ها", + "importFromZipFile": "وارد کردن از پرونده زیپ", + "exportEmotePack": "صادر کردن بسته شکلک به‌صورت زیپ", + "replace": "جایگزین کردن", + "aboutHomeserver": "درباره {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "addChatDescription": "افزودن توضیح گپ...", + "commandHint_roomupgrade": "ارتقای این اتاق به نگارش مشخص‌شده", + "appLockDescription": "قفل کردن برنامه با رمز کوتاه هنگام عدم استفاده", + "sendTypingNotifications": "فرستادن آگاه‌سازهای نوشتن", + "swipeRightToLeftToReply": "کشیدن از راست به چپ برای پاسخ", + "countChatsAndCountParticipants": "{chats} گپ و {participants} شرکت‌کننده", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "گپ دیگری پیدا نشد...", + "noChatsFoundHere": "اینجا هنوز گپی پیدا نشد. با استفاده از دکمه زیر گپ جدیدی با کسی شروع کنید. ⤵️", + "joinedChats": "گپ‌های پیوسته", + "unread": "خوانده‌نشده", + "space": "فضا", + "spaces": "فضاها", + "checkList": "فهرست بررسی", + "countInvited": "{count} دعوت‌شده", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createGroup": "ساختن گروه", + "chatPermissions": "دسترسی‌های گپ", + "emoteKeyboardNoRecents": "شکلک‌هایی که به تازگی استفاده‌شده اینجا نمایش داده میشوند...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "شناسه گپ سراسری", + "accessAndVisibility": "دسترسی و قابلیت دید", + "accessAndVisibilityDescription": "چه کسی اجازه پیوستن به این گپ را دارد و گپ چگونه قابل کشف است.", + "calls": "تماس‌ها", + "customEmojisAndStickers": "شکلک‌ها و برچسب‌های سفارشی", + "customEmojisAndStickersBody": "افزودن یا هم‌رسانی شکلک‌ها یا برچسب‌های سفارشی که در هر گپ قابل استفاده‌اند.", + "chatDescription": "توضیح گپ", + "chatDescriptionHasBeenChanged": "توضیح گپ تغییر کرد", + "hideRedactedMessages": "پنهان کردن پیام‌های ویرایش‌شده", + "hideRedactedMessagesBody": "اگر کسی پیامی را ویرایش کند، دیگر نمیتوان آن پیام را در گپ دید.", + "hideInvalidOrUnknownMessageFormats": "پنهان کردن قالب‌های پیام نامعتبر یا ناشناخته", + "block": "مسدود کردن", + "blockedUsers": "کاربران مسدود‌شده", + "blockListDescription": "میتوانید کاربرانی که مزاحم شما هستند را مسدود کنید. از کاربران موجود در فهرست مسدود شخصی، پیام یا دعوت به اتاق دریافت نخواهید کرد.", + "blockUsername": "چشم‌پوشی از نام کاربری", + "inviteContactToGroupQuestion": "آیا میخواهید {contact} را به گپ «{groupName}» دعوت کنید؟", + "noChatDescriptionYet": "هنوز توضیح گپی ساخته نشده است.", + "tryAgain": "تلاش دوباره", + "invalidServerName": "نام سرور نامعتبر", + "redactMessageDescription": "پیام برای همه شرکت‌کنندگان در این گفتگو ویرایش خواهد شد. این کار برگشت‌ناپذیر است.", + "optionalRedactReason": "(اختیاری) دلیل ویرایش این پیام...", + "messagesStyle": "پیام‌ها:", + "shareInviteLink": "هم‌رسانی پیوند دعوت", + "hideMemberChangesInPublicChats": "پنهان کردن تغییرات اعضا در گپ‌های عمومی", + "hideMemberChangesInPublicChatsBody": "برای بهبود خوانایی، اینکه کسی به گپ عمومی پیوست یا آن را ترک کرد در خط زمانی گپ نمایش داده نشود.", + "overview": "دید کلی", + "notifyMeFor": "برایم آگاه‌ساز بفرست برای", + "passwordRecoverySettings": "تنظیمات بازیابی گذرواژه", + "redactedBy": "ویرایش‌شده به‌دست {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "گپ مستقیم", + "redactedByBecause": "ویرایش‌شده به‌دست {username} زیرا: «{reason}»", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "sendImages": "فرستادن {count} تصویر", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "setChatDescription": "تنظیم توضیح گپ", + "presenceStyle": "حضور:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "نمایش پیام‌های وضعیت از دیگر کاربران", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " در حال همگام‌سازی... ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 شما با پیوند دعوت شده‌اید به:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "invitedBy": "📩 دعوت‌شده توسط {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} در زده است", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "کاربران باید در بزنند", + "noOneCanJoin": "هیچ‌کس نمیتواند بپیوندد", + "userWouldLikeToChangeTheChat": "{user} مایل به پیوستن به گپ است.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "هنوز پیوند عمومی ساخته نشده است", + "knock": "در زدن", + "hidePresences": "پنهان کردن فهرست وضعیت؟", + "signInWith": "ورود با {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "profileNotFound": "کاربر در سرور پیدا نشد. شاید مشکل اتصال وجود دارد یا کاربر وجود ندارد.", + "setTheme": "تنظیم پوسته:", + "setColorTheme": "تنظیم پوسته رنگی:", + "invite": "دعوت", + "inviteGroupChat": "📨 دعوت به گپ گروهی", + "invitePrivateChat": "📨 دعوت به گپ خصوصی", + "invalidInput": "ورودی نامعتبر!", + "wrongPinEntered": "رمز کوتاه نادرست وارد شد! {seconds} ثانیه دیگر دوباره تلاش کنید...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "لطفاً عددی بزرگ‌تر از ۰ وارد کنید", + "archiveRoomDescription": "گپ به بایگانی خواهد رفت. کاربران دیگر میتوانند ببینند که شما گپ را ترک کرده‌اید.", + "roomUpgradeDescription": "گپ با نگارش جدید اتاق بازسازی خواهد شد. به همه شرکت‌کنندگان آگاهی‌رسانی میشود که باید به گپ جدید بروند. داده‌های بیشتر درباره نگارش‌های اتاق در https://spec.matrix.org/latest/rooms/", + "removeDevicesDescription": "از این دستگاه خارج خواهید شد و دیگر نمیتوانید پیام دریافت کنید.", + "banUserDescription": "کاربر از گپ محروم خواهد شد و تا زمانی که محرومیت برداشته نشود، نمیتواند دوباره وارد گپ شود.", + "unbanUserDescription": "کاربر در صورت تلاش دوباره میتواند وارد گپ شود.", + "kickUserDescription": "کاربر از گپ بیرون میشود اما محروم نمیشود. در گپ‌های عمومی، کاربر میتواند هر زمان دوباره بپیوندد.", + "makeAdminDescription": "پس از مدیر کردن این کاربر، ممکن است نتوانید این کار را لغو کنید، زیرا آن‌ها همان دسترسی‌های شما را خواهند داشت.", + "pushNotificationsNotAvailable": "آگاه‌سازهای فشاری در دسترس نیستند", + "learnMore": "بیشتر بدانید", + "yourGlobalUserIdIs": "شناسه کاربری سراسری شما: ", + "noUsersFoundWithQuery": "متأسفانه کاربری با «{query}» پیدا نشد. لطفاً بررسی کنید که آیا اشتباه نوشتاری دارید.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "knocking": "در زدن", + "chatCanBeDiscoveredViaSearchOnServer": "گپ با جستجو در {server} قابل کشف است", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "جستجو برای #گپ‌ها، @کاربران...", + "nothingFound": "چیزی پیدا نشد...", + "groupName": "نام گروه", + "createGroupAndInviteUsers": "ساختن گروه و دعوت کاربران", + "groupCanBeFoundViaSearch": "گروه با جستجو قابل یافتن است", + "wrongRecoveryKey": "متأسفیم... به نظر میرسد این کلید بازیابی درست نباشد.", + "startConversation": "آغاز گفتگو", + "commandHint_sendraw": "فرستادن JSON خام", + "databaseMigrationTitle": "پایگاه داده بهینه‌سازی شد", + "databaseMigrationBody": "لطفاً صبر کنید. این ممکن است لحظه‌ای طول بکشد.", + "leaveEmptyToClearStatus": "برای پاک کردن وضعیت، خالی بگذارید.", + "select": "انتخاب", + "searchForUsers": "جستجو برای @کاربران...", + "pleaseEnterYourCurrentPassword": "لطفاً گذرواژه کنونی خود را وارد کنید", + "newPassword": "گذرواژه جدید", + "pleaseChooseAStrongPassword": "لطفاً یک گذرواژه قوی انتخاب کنید", + "passwordsDoNotMatch": "گذرواژه‌ها هم‌خوانی ندارند", + "passwordIsWrong": "گذرواژه واردشده نادرست است", + "publicLink": "پیوند عمومی", + "publicChatAddresses": "نشانی‌های گپ عمومی", + "createNewAddress": "ساختن نشانی جدید", + "joinSpace": "پیوستن به فضا", + "publicSpaces": "فضاهای عمومی", + "addChatOrSubSpace": "افزودن گپ یا زیرفضا", + "subspace": "زیرفضا", + "decline": "نپذیرفتن", + "thisDevice": "این دستگاه:", + "userRole": "نقش کاربر", + "minimumPowerLevel": "{level} کمینه سطح دسترسی است.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "searchIn": "جستجو در گپ «{chat}»...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "جستجوی بیشتر...", + "gallery": "نگارخانه", + "files": "پرونده‌ها", + "databaseBuildErrorBody": "ناتوانی در ساخت پایگاه داده SQLite. برنامه اکنون سعی میکند از پایگاه داده قدیمی استفاده کند. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "نشست شما گم شده است. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "برنامه اکنون سعی میکند نشست شما را از پشتیبان بازیابی کند. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "forwardMessageTo": "هدایت پیام به {roomName}؟", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceipts": "فرستادن رسیدهای خواندن", + "sendTypingNotificationsDescription": "دیگر شرکت‌کنندگان در گپ میتوانند ببینند که شما در حال تایپ پیام جدید هستید.", + "sendReadReceiptsDescription": "دیگر شرکت‌کنندگان در گپ میتوانند ببینند که شما پیام را خوانده‌اید.", + "formattedMessages": "پیام‌های قالب‌بندی‌شده", + "formattedMessagesDescription": "نمایش محتوای پیام غنی مانند متن پررنگ با استفاده از مارک‌داون.", + "verifyOtherUser": "🔐 بازبینی کاربر دیگر", + "verifyOtherUserDescription": "اگر کاربر دیگری را بازبینی کنید، میتوانید مطمئن شوید که واقعاً با چه کسی در حال نوشتن هستید. 💪\n\nهنگام شروع بازبینی، شما و کاربر دیگر پنجره‌ای در برنامه خواهید دید. در آنجا مجموعه‌ای از شکلک‌ها یا اعداد را مشاهده میکنید که باید با یکدیگر مقایسه کنید.\n\nبهترین راه برای این کار دیدار حضوری یا شروع تماس تصویری است. 👭", + "verifyOtherDevice": "🔐 بازبینی دستگاه دیگر", + "verifyOtherDeviceDescription": "هنگام بازبینی دستگاه دیگر، آن دستگاه‌ها میتوانند کلیدها را تبادل کنند و امنیت کلی شما را افزایش دهند. 💪 هنگام شروع بازبینی، پنجره‌ای در برنامه روی هر دو دستگاه ظاهر میشود. در آنجا مجموعه‌ای از شکلک‌ها یا اعداد را مشاهده میکنید که باید با یکدیگر مقایسه کنید. بهتر است پیش از شروع بازبینی، هر دو دستگاه در دسترس باشند. 🤳", + "acceptedKeyVerification": "{sender} بازبینی کلید را پذیرفت", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} بازبینی کلید را رد کرد", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} بازبینی کلید را کامل کرد", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} برای بازبینی کلید آماده است", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} درخواست بازبینی کلید کرد", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} بازبینی کلید را آغاز کرد", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "شفاف", + "incomingMessages": "پیام‌های دریافتی", + "stickers": "برچسب‌ها", + "discover": "کشف", + "commandHint_ignore": "چشم‌پوشی از شناسه ماتریکس داده‌شده", + "commandHint_unignore": "لغو چشم‌پوشی از شناسه ماتریکس داده‌شده", + "unreadChatsInApp": "{appname}: {unread} گپ خوانده‌نشده", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "رمزنگاری پایگاه داده در این سکو پشتیبانی نمیشود", + "thereAreCountUsersBlocked": "اکنون {count} کاربر مسدود شده‌اند.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "restricted": "محدودشده", + "knockRestricted": "در زدن محدود", + "goToSpace": "رفتن به فضا: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "علامت‌گذاری به‌عنوان خوانده‌نشده", + "userLevel": "{level} - کاربر", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - ناظر", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - مدیر", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "تغییر تنظیمات عمومی گپ", + "inviteOtherUsers": "دعوت کاربران دیگر به این گپ", + "changeTheChatPermissions": "تغییر دسترسی‌های گپ", + "changeTheVisibilityOfChatHistory": "تغییر قابلیت دید تاریخچه گپ", + "changeTheCanonicalRoomAlias": "تغییر نشانی اصلی گپ عمومی", + "sendRoomNotifications": "فرستادن آگاه‌سازهای @room", + "changeTheDescriptionOfTheGroup": "تغییر توضیح گپ", + "chatPermissionsDescription": "مشخص کنید کدام سطح دسترسی برای اقدامات خاصی در این گپ لازم است. سطح‌های دسترسی ۰، ۵۰ و ۱۰۰ معمولاً نشان‌دهنده کاربران، ناظران و مدیران هستند، اما هر درجه‌بندی ممکن است.", + "updateInstalled": "🎉 به‌روزرسانی {version} نصب شد!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "فهرست تغییرات", + "sendCanceled": "فرستادن رد شد", + "loginWithMatrixId": "ورود با شناسه ماتریکس", + "discoverHomeservers": "کشف سرورهای خانگی", + "whatIsAHomeserver": "سرور خانگی چیست؟", + "homeserverDescription": "همه داده‌های شما روی سرور خانگی نگه‌داری میشوند، مانند یک فراهم‌کننده رایانامه. میتوانید سرور خانگی مورد نظر خود را انتخاب کنید، در حالی که همچنان میتوانید با هر کسی گفتگو کنید. اطلاعات بیشتر در https://matrix.org.", + "doesNotSeemToBeAValidHomeserver": "به نظر نمیرسد سرور خانگی سازگاری داشته باشد. نشانی اشتباه است؟", + "calculatingFileSize": "در حال محاسبه اندازه پرونده...", + "prepareSendingAttachment": "آماده‌سازی برای فرستادن پیوست...", + "sendingAttachment": "در حال فرستادن پیوست...", + "generatingVideoThumbnail": "در حال تولید تصویر کوچک ویدئو...", + "compressVideo": "در حال فشرده‌سازی ویدئو...", + "sendingAttachmentCountOfCount": "در حال فرستادن پیوست {index} از {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "محدودیت سرور رسیده است! {seconds} ثانیه صبر کنید...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "یکی از دستگاه‌های شما بازبینی نشده است", + "noticeChatBackupDeviceVerification": "توجه: وقتی همه دستگاه‌های خود را به پشتیبان گپ متصل کنید، به‌صورت خودکار بازبینی میشوند.", + "continueText": "ادامه", + "welcomeText": "درود درود 👋 این فلافی‌چت است. میتوانید به هر سرور خانگی سازگار با https://matrix.org وارد شوید و با هر کسی گپ بزنید. این یک شبکه پیام‌رسانی غیرمتمرکز بزرگ است!", + "blur": "محو کردن:", + "opacity": "شفافیت:", + "setWallpaper": "تنظیم کاغذدیواری", + "manageAccount": "مدیریت حساب", + "noContactInformationProvided": "سرور هیچ اطلاعات تماس معتبری نمیدهد", + "contactServerAdmin": "تماس با مدیر سرور", + "contactServerSecurity": "تماس با امنیت سرور", + "supportPage": "صفحه پشتیبانی", + "serverInformation": "درباره سرور:", + "name": "نام", + "version": "نگارش", + "website": "وبگاه", + "compress": "فشرده‌سازی", + "boldText": "متن درشت", + "italicText": "متن کج", + "strikeThrough": "خط‌خورده", + "pleaseFillOut": "لطفاً پر کنید", + "invalidUrl": "نشانی نامعتبر", + "addLink": "افزودن پیوند", + "unableToJoinChat": "ناتوانی در پیوستن به گپ. شاید طرف مقابل گفتگو را بسته است.", + "previous": "پیشین", + "otherPartyNotLoggedIn": "طرف مقابل اکنون وارد نشده است و بنابراین نمیتواند پیام دریافت کند!", + "appWantsToUseForLogin": "برای ورود از '{server}' استفاده کنید", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "شما بدین‌وسیله به برنامه و وبگاه اجازه میدهید اطلاعات شما را هم‌رسانی کنند.", + "open": "باز کردن", + "waitingForServer": "در انتظار سرور...", + "appIntroduction": "فلافی‌چت به شما امکان گپ با دوستانتان در پیام‌رسان‌های مختلف را میدهد. اطلاعات بیشتر در https://matrix.org یا فقط روی *ادامه* بزنید.", + "newChatRequest": "📩 درخواست گپ جدید", + "contentNotificationSettings": "تنظیمات آگاه‌ساز محتوا", + "generalNotificationSettings": "تنظیمات آگاه‌ساز عمومی", + "roomNotificationSettings": "تنظیمات آگاه‌ساز اتاق", + "userSpecificNotificationSettings": "تنظیمات آگاه‌ساز خاص کاربر", + "otherNotificationSettings": "سایر تنظیمات آگاه‌ساز", + "notificationRuleContainsUserName": "دارای نام کاربری", + "notificationRuleContainsUserNameDescription": "وقتی پیامی حاوی نام کاربری باشد، کاربر را آگاه میکند.", + "notificationRuleMaster": "بی‌صدا کردن همه آگاه‌سازها", + "notificationRuleMasterDescription": "از قوانین دیگر چشم‌پوشی میکند و همه آگاه‌سازها را غیرفعال میکند.", + "notificationRuleSuppressNotices": "سرکوب پیام‌های خودکار", + "notificationRuleSuppressNoticesDescription": "آگاه‌سازهای کارخواه‌های خودکار مانند ربات‌ها را سرکوب میکند.", + "notificationRuleInviteForMe": "دعوت برای من", + "notificationRuleInviteForMeDescription": "وقتی کاربر به اتاقی دعوت میشود، او را آگاه میکند.", + "notificationRuleMemberEvent": "رویداد عضویت", + "notificationRuleMemberEventDescription": "آگاه‌سازهای رویدادهای عضویت را سرکوب میکند.", + "notificationRuleIsUserMention": "نام‌بردن از کاربر", + "notificationRuleIsUserMentionDescription": "وقتی در پیامی مستقیماً از کاربر نام برده میشود، او را آگاه میکند.", + "notificationRuleContainsDisplayName": "دارای نام نمایشی", + "notificationRuleContainsDisplayNameDescription": "وقتی پیامی حاوی نام نمایشی کاربر باشد، کاربر را آگاه میکند.", + "notificationRuleIsRoomMention": "نام‌بردن از اتاق", + "notificationRuleIsRoomMentionDescription": "وقتی نام اتاق ذکر میشود، کاربر را آگاه میکند.", + "notificationRuleRoomnotif": "آگاه‌ساز اتاق", + "notificationRuleRoomnotifDescription": "وقتی پیامی حاوی '@room' باشد، کاربر را آگاه میکند.", + "notificationRuleTombstone": "سنگ قبر", + "notificationRuleTombstoneDescription": "کاربر را از پیام‌های غیرفعال‌سازی اتاق آگاه میکند.", + "notificationRuleReaction": "واکنش", + "notificationRuleReactionDescription": "آگاه‌سازهای واکنش‌ها را سرکوب میکند.", + "notificationRuleRoomServerAcl": "ACL سرور اتاق", + "notificationRuleRoomServerAclDescription": "آگاه‌سازهای فهرست‌های کنترل دسترسی سرور اتاق (ACL) را سرکوب میکند.", + "notificationRuleSuppressEdits": "سرکوب ویرایش‌ها", + "notificationRuleSuppressEditsDescription": "آگاه‌سازهای پیام‌های ویرایش‌شده را سرکوب میکند.", + "notificationRuleCall": "تماس", + "notificationRuleCallDescription": "درباره تماس‌ها کاربر را آگاه میکند.", + "notificationRuleEncryptedRoomOneToOne": "اتاق رمزنگاری‌شده یک‌به‌یک", + "notificationRuleEncryptedRoomOneToOneDescription": "کاربر را از پیام‌ها در اتاق‌های رمزنگاری‌شده یک‌به‌یک آگاه میکند.", + "notificationRuleRoomOneToOne": "اتاق یک‌به‌یک", + "notificationRuleRoomOneToOneDescription": "کاربر را از پیام‌ها در اتاق‌های یک‌به‌یک آگاه میکند.", + "notificationRuleMessage": "پیام", + "notificationRuleMessageDescription": "کاربر را از پیام‌های عمومی آگاه میکند.", + "notificationRuleEncrypted": "رمزنگاری‌شده", + "notificationRuleEncryptedDescription": "کاربر را از پیام‌ها در اتاق‌های رمزنگاری‌شده آگاه میکند.", + "notificationRuleJitsi": "جیتسی", + "notificationRuleJitsiDescription": "کاربر را از رویدادهای ابزارک جیتسی آگاه میکند.", + "notificationRuleServerAcl": "سرکوب رویدادهای ACL سرور", + "notificationRuleServerAclDescription": "آگاه‌سازهای رویدادهای ACL سرور را سرکوب میکند.", + "unknownPushRule": "قانون ناشناخته آگاه‌ساز '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - پیام صوتی از {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "اگر این تنظیم آگاه‌ساز را پاک کنید، این کار برگشت‌ناپذیر است.", + "more": "بیشتر", + "shareKeysWith": "هم‌رسانی کلیدها با...", + "shareKeysWithDescription": "کدام دستگاه‌ها باید مورد اعتماد باشند تا بتوانند پیام‌های شما را در گپ‌های رمزنگاری‌شده بخوانند؟", + "allDevices": "همه دستگاه‌ها", + "crossVerifiedDevicesIfEnabled": "دستگاه‌های بازبینی‌شده متقابل اگر فعال باشد", + "crossVerifiedDevices": "دستگاه‌های بازبینی‌شده متقابل", + "verifiedDevicesOnly": "فقط دستگاه‌های بازبینی‌شده", + "takeAPhoto": "گرفتن عکس", + "recordAVideo": "ضبط ویدئو", + "optionalMessage": "(اختیاری) پیام...", + "notSupportedOnThisDevice": "در این دستگاه پشتیبانی نمیشود", + "enterNewChat": "ورود به گپ جدید", + "approve": "پذیرفتن", + "youHaveKnocked": "شما در زده‌اید", + "pleaseWaitUntilInvited": "لطفاً اکنون صبر کنید تا کسی از اتاق شما را دعوت کند.", + "commandHint_logout": "خروج از دستگاه کنونی", + "commandHint_logoutall": "خروج از همه دستگاه‌های فعال", + "displayNavigationRail": "نمایش نوار ناوبری در تلفن همراه", + "customReaction": "واکنش سفارشی", + "moreEvents": "رویدادهای بیشتر", + "initAppError": "خطایی هنگام آغاز برنامه رخ داد", + "changedTheChatDescription": "‮‭‭‮‭‬‫{username} توضیحات گپ را تغییر داد", + "changedTheChatName": "{username} نام گپ را تغییر داد", + "declineInvitation": "رد کردن دعوت", + "noMessagesYet": "پیامی وجود ندارد", + "longPressToRecordVoiceMessage": "برای ضبط پیام صوتی، انگشت خود را نگه دارید." } From 1972eef11d3625faf739978773ae6bb52fd838e3 Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Mon, 2 Feb 2026 19:56:04 +0100 Subject: [PATCH 058/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 99.2% (829 of 835 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 73 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 9d320c0b..e0e60669 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -3065,5 +3065,76 @@ "attribution": "Kreditering", "skipChatBackupWarning": "Er du sikker? Uten sikkerhetskopi av chattene kan du miste meldingene dine hvis du bytter enhet.", "noMoreResultsFound": "Ingen flere treff", - "federationBaseUrl": "Federation Base URL" + "federationBaseUrl": "Federation Base URL", + "notificationRuleServerAclDescription": "Skjuler varslinger for Server ACL-hendelser.", + "notificationRuleServerAcl": "Skjul Server ACL-hendelser", + "notificationRuleMemberEventDescription": "Skjuler varslinger for medlemsskapshendelser.", + "youHaveKnocked": "Du har banket på", + "moreEvents": "Flere hendelser", + "knockRestricted": "Banking deaktivert", + "contactServerSecurity": "Kontakt sikkerhetsansvarlig for serveren", + "notificationRuleMemberEvent": "Medlemshendelse", + "spaceMemberOfCanKnock": "Et medlem av området {spaces} kan banke på", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "countVotes": "{count, plural, =1{En stemme} other{{count} stemmer}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countReplies": "{count, plural, =1{Et svar} other{{count} svar}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chatSearchedUntil": "Søkte i chatten frem til {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "sendingAttachmentCountOfCount": "Sender vedlegg {index} av {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "spaceMemberOf": "Områdemedlem av {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "confirmEventUnpin": "Er du sikker på at du vil løsne hendelsen permanent?", + "indexedDbErrorLong": "Lagring av meldinger er dessverre ikke aktivert i privat modus som standard.\nVennligst gå til:\n - about:config\n - Sett dom.indexedDB.privateBrowsing.enabled til true\nEllers er det ikke mulig å kjøre FluffyChat.", + "saveKeyManuallyDescription": "Lagre denne nøkkelen manuelt ved å åpne systemets delingsmeny eller kopiere til utklippstavlen.", + "newSpaceDescription": "Områder lar deg samle chattene dine og bygge private eller offentlige fellesskap.", + "chatPermissionsDescription": "Definer hvilket tilgangsnivå som kreves for bestemte handlinger i denne chatten. Nivåene 0, 50 og 100 representerer vanligvis brukere, moderatorer og administratorer, men alle mellomtrinn er mulige.", + "knocking": "Banker på" } From 4a2cd139106afa591d8893238c38c8cd5408db9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 3 Feb 2026 11:31:54 +0100 Subject: [PATCH 059/333] chore(translations): Translated using Weblate (Estonian) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/ --- lib/l10n/intl_et.arb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index 14558254..17dcf651 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -2281,7 +2281,7 @@ "hydrate": "Taasta varundatud failist", "user": "Kasutaja", "custom": "Kohandatud", - "confirmMatrixId": "Konto kustutamiseks palun kinnitage oma Matrix'i ID.", + "confirmMatrixId": "Konto kustutamiseks palun kinnita oma Matrix'i kasutajatunnus (Matrix ID).", "supposedMxid": "See peaks olema {mxid}", "@supposedMxid": { "type": "String", @@ -2986,7 +2986,7 @@ "enterNewChat": "Liitu uue vestlusega", "commandHint_roomupgrade": "Uuenda see jututuba antud jututoa versioonini", "setCustomPermissionLevel": "Seadista kohandatud õiguste tase", - "setPermissionsLevelDescription": "Palun vali eelvalitud rollide seast või lisa õiguste tase vahemikus 0 kuni 100.", + "setPermissionsLevelDescription": "Palun vali eelseadistatud rollide seast või lisa õiguste tase vahemikus 0 kuni 100.", "ignoreUser": "Eira kasutajat", "normalUser": "Tavakasutaja", "approve": "Kiida heaks", @@ -3138,5 +3138,11 @@ "logs": "Logid", "advancedConfigs": "Täiendav seadistus", "advancedConfigurations": "Täiendavad seadistused", - "signInWithLabel": "Logi sisse kasutades:" + "signInWithLabel": "Logi sisse kasutades:", + "signIn": "Logi sisse", + "createNewAccount": "Loo uus kasutajakonto", + "signUpGreeting": "FluffyChat kasutab hajutatud võrku! Vali server, kuhu tahad oma kasutajakonto lisada ning alustame!", + "signInGreeting": "Sul juba on Matrixi kasutajakonto olemas? Tere tulemast tagasi! Vali oma koduserver ja logi sisse.", + "appIntro": "FluffyChati abil saad suhelda oma sõpradega. See on turvaline ja hajutatud sõnumiklient [matrix]-i võrgus! Lisateavet leiad https://matrix.org saidist või lihtsalt liitu.", + "theProcessWasCanceled": "Protsess on katkestatud." } From 882c1cac74a4bbe2b4155bf25d1d7d4ade0b63d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m=2E?= Date: Tue, 3 Feb 2026 15:09:23 +0100 Subject: [PATCH 060/333] chore(translations): Translated using Weblate (Galician) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/ --- lib/l10n/intl_gl.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index 88bde085..4afbd72f 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -3138,5 +3138,11 @@ "logs": "Rexistros", "advancedConfigs": "Axustes avanzados", "advancedConfigurations": "Configuracións avanzadas", - "signInWithLabel": "Acceder con:" + "signInWithLabel": "Acceder con:", + "signIn": "Acceder", + "createNewAccount": "Crear nova conta", + "signUpGreeting": "FluffyChat é descentralizada! Elixe un servidor para crear a conta e xa podes utilizar a app!", + "signInGreeting": "Xa tes unha conta en Matrix? Benvida! Selecciona o teu servidor de orixe e accede.", + "appIntro": "Con FluffyChat podes conversar coas amizades. É mensaxería segura e descentralizada en [matrix]! Coñece máis en https://matrix.org ou crea unha conta.", + "theProcessWasCanceled": "Desbotouse o proceso." } From c0cba9816f2fd4b1de12b4c0154390446b08dd42 Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Tue, 3 Feb 2026 13:32:44 +0100 Subject: [PATCH 061/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index e0e60669..2491aa33 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -3136,5 +3136,20 @@ "saveKeyManuallyDescription": "Lagre denne nøkkelen manuelt ved å åpne systemets delingsmeny eller kopiere til utklippstavlen.", "newSpaceDescription": "Områder lar deg samle chattene dine og bygge private eller offentlige fellesskap.", "chatPermissionsDescription": "Definer hvilket tilgangsnivå som kreves for bestemte handlinger i denne chatten. Nivåene 0, 50 og 100 representerer vanligvis brukere, moderatorer og administratorer, men alle mellomtrinn er mulige.", - "knocking": "Banker på" + "knocking": "Banker på", + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "noKeyForThisMessage": "Dette kan skje hvis meldingen ble sendt før du logget inn på kontoen din på denne enheten.\n\nDet er også mulig at senderen har blokkert enheten din, eller at noe gikk galt med internettforbindelsen.\n\nEr du i stand til å lese meldingen i en annen sesjon? Da kan du overføre meldingen fra den! Gå til Innstillinger > Enheter og sørg for at enhetene dine har verifisert hverandre. Neste gang du åpner rommet og begge sesjonene er i forgrunnen, vil nøklene bli overført automatisk.\n\nVil du unngå å miste nøklene når du logger ut eller bytter enhet? Sørg for at du har aktivert sikkerhetskopiering av chat i innstillingene.", + "report": "rapportere", + "addChatOrSubSpace": "Legg til chat eller underområde", + "subspace": "Underområde", + "newSubSpace": "Nytt underområde", + "signIn": "Logg på", + "createNewAccount": "Opprett ny konto", + "signUpGreeting": "FluffyChat er desentralisert! Velg en server der du vil opprette kontoen din, så kjører vi på!", + "signInGreeting": "Har du allerede en Matrix-konto? Velkommen tilbake! Velg hjemmeserveren din og logg inn.", + "appIntro": "Med FluffyChat kan du chatte med vennene dine. Det er en sikker, desentralisert [matrix]-meldingsapp! Les mer på https://matrix.org hvis du vil, eller bare registrer deg.", + "theProcessWasCanceled": "Prosessen ble avbrutt." } From 0bdff47e41bcbc6e697728d935c2acded64a407a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Tue, 3 Feb 2026 11:23:44 +0100 Subject: [PATCH 062/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 3f8cb470..502def90 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -3138,5 +3138,11 @@ "logs": "日志", "advancedConfigs": "高级配置", "advancedConfigurations": "高级配置", - "signInWithLabel": "登录方式:" + "signInWithLabel": "登录方式:", + "signIn": "登录", + "createNewAccount": "创建新账户", + "signUpGreeting": "FluffyChat 是去中心化的!选择您希望创建账户的服务器!", + "signInGreeting": "已经有 Matrix 账户了?欢迎回来!选择 homeserver 登录。", + "appIntro": "借助 FluffyChat,您可以和好友聊天。它是安全的去中心化 [matrix] 消息收发应用!如果愿意,可以在 https://matrix.org 了解更多信息,也可直接注册账户。", + "theProcessWasCanceled": "过程被取消。" } From df1bda1c699da5af12919a997650c35cb0ede85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Tue, 3 Feb 2026 15:39:35 +0100 Subject: [PATCH 063/333] chore(translations): Added translation using Weblate (Kabyle) --- lib/l10n/intl_kab.arb | 1 + 1 file changed, 1 insertion(+) create mode 100644 lib/l10n/intl_kab.arb diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/lib/l10n/intl_kab.arb @@ -0,0 +1 @@ +{} From baba28010a0a839ae1cd4627abc58d26b735cf21 Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Wed, 4 Feb 2026 08:06:37 +0100 Subject: [PATCH 064/333] chore(translations): Translated using Weblate (Latvian) Currently translated at 98.6% (829 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/lv/ --- lib/l10n/intl_lv.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_lv.arb b/lib/l10n/intl_lv.arb index 9e9a9ddb..9ad9c22f 100644 --- a/lib/l10n/intl_lv.arb +++ b/lib/l10n/intl_lv.arb @@ -3121,5 +3121,11 @@ "logs": "Žurnāli", "advancedConfigs": "Izvērsta konfigurācijas", "advancedConfigurations": "Izvērstas konfigurācijas", - "signInWithLabel": "Pieteikties ar:" + "signInWithLabel": "Pieteikties ar:", + "theProcessWasCanceled": "Darbība tika atcelta.", + "signIn": "Pieteikties", + "createNewAccount": "Izveidot jaunu kontu", + "signUpGreeting": "FluffyChat ir decentralizēta. Jāatlasa serveris, kurā ir vēlēšanās izveidot savu kontu, un aiziet!", + "signInGreeting": "Jau ir Matrix konts? Laipni lūdzam atpakaļ! Jāatlasa savs mājasserveris un jāpiesakās.", + "appIntro": "Ar FluffyChat vari tērzēt ar saviem draugiem. Tā ir droša un decentralizēta [matrix] ziņapmaiņas lietotne. Vairāk var uzzināt https://matrix.org, ja ir vēlēšanās, vai vienkārši jāpiesakās." } From a84b73bb248f5655befee7d4d8da0fe41a12dc7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Wed, 4 Feb 2026 13:34:06 +0100 Subject: [PATCH 065/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index bd9e47f0..f1368c70 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -3144,5 +3144,11 @@ "logs": "Logaí", "advancedConfigs": "Cumraíochtaí Ardleibhéil", "advancedConfigurations": "Cumraíochtaí ardleibhéil", - "signInWithLabel": "Sínigh isteach le:" + "signInWithLabel": "Sínigh isteach le:", + "signIn": "Sínigh isteach", + "createNewAccount": "Cruthaigh cuntas nua", + "signUpGreeting": "Tá FluffyChat díláraithe! Roghnaigh freastalaí inar mian leat do chuntas a chruthú agus déanaimis é!", + "signInGreeting": "An bhfuil cuntas agat i Matrix cheana féin? Fáilte ar ais! Roghnaigh do fhreastalaí baile agus sínigh isteach.", + "appIntro": "Le FluffyChat is féidir leat comhrá a dhéanamh le do chairde. Is teachtaire [maitrís] díláraithe slán é! Foghlaim tuilleadh ar https://matrix.org más maith leat nó cláraigh.", + "theProcessWasCanceled": "Cuireadh an próiseas ar ceal." } From 067db946266ce93d20c5be6478fe99fef846ee92 Mon Sep 17 00:00:00 2001 From: Jelv Date: Wed, 4 Feb 2026 07:55:00 +0100 Subject: [PATCH 066/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index 40f298f2..3f081131 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -3137,5 +3137,11 @@ "logs": "Logs", "advancedConfigs": "Geavanceerde configuratie", "advancedConfigurations": "Geavanceerde configuraties", - "signInWithLabel": "Log in met:" + "signInWithLabel": "Log in met:", + "signIn": "Log in", + "createNewAccount": "Registreer nieuw account", + "signUpGreeting": "FluffyChat is decentraal! Kies een server waar je wil voor jouw account en laten we gaan!", + "signInGreeting": "Heb je al een Matrix account? Welkom terug! Kies jouw server en log in.", + "appIntro": "Met FluffyChat kan je chatten met je vrienden. Het is een veilige en decentrale [matrix] app! Lees meer op https://matrix.org als je wilt of kies registreren.", + "theProcessWasCanceled": "Het proces is geannuleerd." } From 7997da248d400ebc6b595463283d2ac9a343c85a Mon Sep 17 00:00:00 2001 From: nautilusx Date: Wed, 4 Feb 2026 04:08:41 +0100 Subject: [PATCH 067/333] chore(translations): Translated using Weblate (German) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/ --- lib/l10n/intl_de.arb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 22910ecc..c37baf26 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -3135,5 +3135,13 @@ "logs": "Protokolle", "baseUrl": "Basis-URL", "advancedConfigs": "Erweiterte Konfigurationen", - "advancedConfigurations": "Erweiterte Konfigurationen" + "advancedConfigurations": "Erweiterte Konfigurationen", + "signIn": "Anmelden", + "createNewAccount": "Neues Konto erstellen", + "signUpGreeting": "FluffyChat ist dezentral! Wähle einen Server, auf dem du dein Konto erstellen möchtest, und los geht's!", + "signInGreeting": "Du hast bereits ein Konto bei Matrix? Willkommen zurück! Wähle deinen Homeserver aus und melde dich an.", + "appIntro": "Mit FluffyChat kannst du mit deinen Freunden chatten. Es ist ein sicherer, dezentralisierter [Matrix]-Messenger! Erfahre mehr auf https://matrix.org, wenn du möchtest, oder melde dich einfach an.", + "theProcessWasCanceled": "Der Vorgang wurde abgebrochen.", + "federationBaseUrl": "Basis-URL der Föderation", + "clientWellKnownInformation": "Bekannte Informationen zum Client:" } From f449b1002ceb51bc8b9a352a497bb7f1e6eabce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Tue, 3 Feb 2026 16:13:05 +0100 Subject: [PATCH 068/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 2.8% (24 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 79 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 0967ef42..f4854b17 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1 +1,78 @@ -{} +{ + "repeatPassword": "Ales awal n uɛeddi", + "notAnImage": "Mačči d afaylu n tugna.", + "setCustomPermissionLevel": "Sbadu aswir yugnen n usireg", + "ignoreUser": "Zgel aseqdac", + "setPermissionsLevelDescription": "Ma ulac aɣilif fren tamlilt i yettusbadun ddaw-a neɣ sekcem aswir n usireg yugnen gar 0 akked 100.", + "normalUser": "Aseqdac amagnu", + "remove": "Kkes", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Kter tura", + "importEmojis": "Kter imujiten", + "importFromZipFile": "Kter seg ufaylu .zip", + "exportEmotePack": "Sifeḍ akemmus n Emote am .zip", + "replace": "Semselsi", + "about": "Ɣef", + "aboutHomeserver": "Ɣef {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Qbel", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} yeqbel tinubga", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Amiḍan", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} irmed awgelhen seg yixef ɣer yixef", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Rnu imayl", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Ttxil-ik·im, sentem asulay-ik·im n Matrix akken ad tekkseḍ amiḍan-ik·im.", + "supposedMxid": "A win yufan, ad yili d {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addChatDescription": "Rnu aglam n udiwenni...", + "addToSpace": "Rnu ɣer tallunt", + "admin": "Anedbal", + "@admin": { + "type": "String", + "placeholders": {} + } +} From 6d9a6a73109b3475bccf9ae4d9fb51a12dad7130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Thu, 5 Feb 2026 16:27:18 +0100 Subject: [PATCH 069/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 9.6% (81 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 293 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 293 insertions(+) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index f4854b17..b45fcb04 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -74,5 +74,298 @@ "@admin": { "type": "String", "placeholders": {} + }, + "alias": "Tazaẓlut", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Meṛṛa", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "Meṛṛa idiwenniyen", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Sali aswir n txxamt-agi ɣer lqem n texxamt i d-yettunefken", + "answeredTheCall": "{senderName} yerra-d i usiwel", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Yal yiwen yezmer ad yettekki", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Asekkeṛ n usnas", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Sekkeṛ asnas ticki ur tseqdaceḍ ara s tengalt n pin", + "archive": "Aɣbaṛ", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Iseqdacen inebgiwen ttusirgen ad ttekkin", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Tetḥeqqeḍ?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "D tidet tebɣiḍ ad teffɣeḍ?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Iwakken ad teszmeleḍ amdan-nniḍen, ttxil-k·m sekcem tafyirt-ik·im n uḥraz s wudem aɣelsan neɣ tasarut n tririt.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Qbel asuter-agi n usenqed seg {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "spaces": "Tallunin", + "banFromChat": "Gdel seg adiwenni", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Yettwagdel", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} yegdel {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Sewḥel ibenk", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Yettusewḥel", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Iznan n iṛubuten", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Sefsex", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Ur yezmir ara ad yeldi URl {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Snifel isem n yibenk", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} yesnifel avaṭar n udiwenni", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescription": "{username} yesnifel aglam n udiwenni", + "changedTheChatDescriptionTo": "{username} yesnifel aglam n udiwenni ɣer: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatName": "{username} yesnifel isem n udiwenni", + "changedTheChatNameTo": "{username} yesnifel isem n udiwenni ɣer: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} yesnifel tisirag n udiwenni", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} yesnifel tisirag n udiwenni ɣer: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "chat": "Adiwenni", + "@chat": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Aḥraz n udiwenni-ik·im yettusbadu.", + "chatBackup": "Aḥraz n udiwenni", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Iznan-ik·im d iɣelsanen s tsarut n tririt. Ɣur-k·m ad k·em-truḥ.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Ifatusen n udiwenni", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Adiwenni yettwarna ɣer tallunt-agi", + "chats": "Idiwenniyen", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Fren awal n uɛeddi iǧehden", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Sfeḍ aɣbaṛ", + "close": "Mdel", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "Creḍ d akken taxxamt n yizen usrid i usulay Matrix i d-yettunefken", + "commandHint_markasgroup": "Creḍ am ugraw", + "commandHint_ban": "Gdel aseqdac i d-ittunefken seg texxamt-agi", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Sfeḍ tazarkatut", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Snulfu-d agraw n udiwenni ilem\nSeqdec -- war awgelhen i tukksa n uwgelhen", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Kkes tiɣimit", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Senker adiwenni usrid\nSeqdec --war awgelhen i tukksa n uwgelhen", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "Azen aḍris s umasal HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Snubeg aseqdac i d-ittunefken ɣer texxamt-agi", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Ddu ɣer texxamt i d-ittunefken", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Kkes aseqdac i d-ittunefken seg texxamt-agi", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Ffeɣ seg texxamt-a", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Glem-d iman-ik·im", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Sbadu tawlaft-ik·im i texxamt-a (s mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Sbadu isem n uskan i texxamt-agi", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Sbadu aswir n tnezmert n useqdac i d-ittunefken (amezwer: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" } } From 6322dbd68bff0ea4e7413a407873577ac36c89fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Fri, 6 Feb 2026 16:52:29 +0100 Subject: [PATCH 070/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 12.1% (102 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 127 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index b45fcb04..5c44ce26 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -367,5 +367,130 @@ "@commandHint_op": { "type": "String", "description": "Usage hint for the command /op" - } + }, + "createNewSpace": "Tallunt tamaynut", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Yermed akka tura", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Ubrik", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{timeOfDay}, {date}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Ayagi ad yekkes armed i umiḍan-ik·im n useqdac. Aya ur yezmir ara ad yettwasefsex. Tetḥeqqeḍ s tidet?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Aswir n turagt amezwer i yiseqdacen imaynuten", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "kkes", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "kkes amiḍan", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "kkes izen", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Ibenk", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Asulay n yibenk", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Ibenkan", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Idiwenniyen Usriden", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "allRooms": "Akk Igrawen Usriden", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Isem n uskan yettusnifel", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Sider afaylu", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Ẓreg", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Ẓreg iqeddacen yettusweḥlen", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Isirigen n Udiwenni" } From 64272f1c9163d7330dc98d4f7d90549fa887a579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Sun, 8 Feb 2026 19:40:40 +0100 Subject: [PATCH 071/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 18.0% (152 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 241 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 240 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 5c44ce26..9bdcea03 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -492,5 +492,244 @@ "type": "String", "placeholders": {} }, - "chatPermissions": "Isirigen n Udiwenni" + "chatPermissions": "Isirigen n Udiwenni", + "encrypted": "Yettwawgelhen", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Awgelhen", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Awgelhen ur yettwarmed ara", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ifukk asiwel", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Sekcem tansa n yimayl", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Aqeddac agejdan", + "enterYourHomeserver": "Sekcem Aqeddac-ik·im agejdan", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Tuccḍa deg wawway n yideg: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Kullec ihegga!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "fileName": "Isem n ufaylu", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Tiddi n tsefsit", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Ɣer zdat", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Seg unekcam-is", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Seg tinubga", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Ddu ɣer texxamt tamaynut", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Agraw", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "Aglam n udiwenni", + "chatDescriptionHasBeenChanged": "Aglam n udiwenni yettwabeddel", + "groupIsPublic": "Agraw d azayez", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Igrawen", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Agraw s {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "tryAgain": "Ɛreḍ tikkelt-nniḍen", + "invalidServerName": "Isem n uqeddac d armeɣtu", + "invited": "Yettwaɛreḍ", + "@invited": { + "type": "String", + "placeholders": {} + }, + "redactMessageDescription": "Izen ad yettwakkesn i imttekkiyen merra deg udiwenni-agi. Ur tezmireḍ ara ad tesfesxeḍ.", + "optionalRedactReason": "(Afrayan) Sebba n tukksa n izen-agi…", + "invitedUser": "📩 {username} yenced {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Iseqdacen kan yettwaɛerḍen", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Snubget-yi-d", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "isTyping": "la yettaru…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋{username} yekcem ɣer udiwenni", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Tekki deg texxamt", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞{username} yessuffeɣ-d {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} yessuffeɣ-d udiɣ igdel {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Suffeɣ seg udiwenni", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Yermed i tikkelt taneggarut: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Eǧǧ", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Ffeɣ seg udiwenni", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Turagt", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Aceɛlal", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Sali-d ugar n {count} yimttekkiyen", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Sifeḍ tiɣimit akked usfaḍ n yibenk", + "dehydrateWarning": "Tigawt-agi ur tezmir ara ad tettwasefsex. Tḥeqqeq belli tesseklaseḍ afaylu n weḥraz.", + "dehydrateTor": "Iseqdacen TOR: Sifeḍ tiɣimit", + "dehydrateTorLong": "I iseqdacen TOR, yettusemter ad tsifeḍ tɣimit send ad tmedleḍ asfaylu.", + "hydrateTor": "Iseqdacen TOR: Akter n tɣimit usifeḍ", + "hydrateTorLong": "Tsifḍeḍ tiɣimit-ik·im taneggarut deg TOR? kter-it-id s wudem arurad u kemmel adiwenni.", + "hydrate": "Err-d seg ufaylu n weḥraz", + "loadingPleaseWait": "Asali... Ttxil-k·m arǧu.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + } } From d3e6dbe9977e2246b2592a6ad4d28713526c9087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Mon, 9 Feb 2026 19:03:10 +0100 Subject: [PATCH 072/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 21.3% (179 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 119 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 9bdcea03..2577cfab 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -731,5 +731,124 @@ "@loadingPleaseWait": { "type": "String", "placeholders": {} + }, + "copiedToClipboard": "Yettwanɣel ɣer tecfawit", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Nɣel", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Nɣel ɣer tecfawit", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Ur izmer ara tukksa n uwgelhen n yizen: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "checkList": "Senqed tabdart", + "countParticipants": "{count} imttekkiyen", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countInvited": "{count} yettwaɛerḍen", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Snulfu-d", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} yesnulfa-d adiwenni", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Snulfu-d agraw", + "editDisplayname": "Ẓreg isem n ubeqqeḍ", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Ẓreg avaṭar n texxamt", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Azamul uḥulfu yella yakan!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Tangalt tawezlant n uzamul uḥulfu d tarmeɣtut!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Izamulen uḥulfu yettwasqedcen melmi kan ad banen dagi…", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Ikemmusen n uzamul uḥulfu i texxamt", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Iɣewwaṛen n uzamul uḥulfu", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "Asulay n udiwenni amatu", + "accessAndVisibility": "Addaf d twalit", + "accessAndVisibilityDescription": "Anwa i yesɛan turagt ad yernu ɣer udiwenni-agi u amek adiwenni yezmer ad yettwaf.", + "calls": "Isawalen", + "customEmojisAndStickers": "Imujiten yugnen akked tcṛeṭ n tesfift", + "customEmojisAndStickersBody": "Rnu neɣ bḍu imujiten yugnen neɣ tcṛeṭ n tesfift i zemren ad ttwasqedcen deg yal adiwenni.", + "emptyChat": "Adiwenni d ilem", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Sermed akemmus n uzamul uḥulfu s wudem amatu", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Rmed awgelhen", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Ur tettizmireḍ ara ad tessenseḍ awgelhen syagi ɣer zdat. Tetḥeqqeḍ s tidet?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} } } From be39f1b1f85bf5c610b86fd9397daf87352fc5eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Caras?= Date: Tue, 10 Feb 2026 11:21:01 +0100 Subject: [PATCH 073/333] chore(translations): Translated using Weblate (Czech) Currently translated at 75.4% (634 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/cs/ --- lib/l10n/intl_cs.arb | 360 ++++++++++++++++++------------------------- 1 file changed, 146 insertions(+), 214 deletions(-) diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb index 946e3cd3..a2e42f30 100644 --- a/lib/l10n/intl_cs.arb +++ b/lib/l10n/intl_cs.arb @@ -402,7 +402,6 @@ "placeholders": {} }, "clearArchive": "Vymazat archiv", - "@clearArchive": {}, "close": "Zavřít", "@close": { "type": "String", @@ -2083,55 +2082,30 @@ "placeholders": {} }, "chatHasBeenAddedToThisSpace": "Do tohoto prostoru byl přidán chat", - "@chatHasBeenAddedToThisSpace": {}, "addToSpace": "Přidat do prostoru", - "@addToSpace": {}, "scanQrCode": "Naskenujte QR kód", - "@scanQrCode": {}, "sendOnEnter": "Odeslat při vstupu", - "@sendOnEnter": {}, "homeserver": "Domácí server", - "@homeserver": {}, "serverRequiresEmail": "Tento server potřebuje k registraci ověřit vaši e -mailovou adresu.", - "@serverRequiresEmail": {}, "addToBundle": "Přidat do balíčku", - "@addToBundle": {}, "addAccount": "Přidat účet", - "@addAccount": {}, "bundleName": "Název balíčku", - "@bundleName": {}, "link": "Odkaz", - "@link": {}, "yourChatBackupHasBeenSetUp": "Vaše záloha chatu byla nastavena.", - "@yourChatBackupHasBeenSetUp": {}, "editBundlesForAccount": "Upravit balíčky pro tento účet", - "@editBundlesForAccount": {}, "enableMultiAccounts": "(BETA) Na tomto zařízení povolte více účtů", - "@enableMultiAccounts": {}, "oneClientLoggedOut": "Jeden z vašich klientů byl odhlášen", - "@oneClientLoggedOut": {}, "removeFromBundle": "Odstranit z tohoto balíčku", - "@removeFromBundle": {}, "unverified": "Neověřeno", - "@unverified": {}, "messageInfo": "Informace o zprávě", - "@messageInfo": {}, "time": "Čas", - "@time": {}, "messageType": "Typ zprávy", - "@messageType": {}, "sender": "Odesílatel", - "@sender": {}, "repeatPassword": "Zopakujte heslo", - "@repeatPassword": {}, "openGallery": "Otevřít galerii", - "@openGallery": {}, "addToSpaceDescription": "Vyberte umístění, do kterého chcete tento chat přidat.", - "@addToSpaceDescription": {}, "start": "Start", - "@start": {}, "removeFromSpace": "Odstranit z tohoto místa", - "@removeFromSpace": {}, "commandHint_clearcache": "Vymazat mezipamět", "@commandHint_clearcache": { "type": "String", @@ -2158,7 +2132,6 @@ "placeholders": {} }, "publish": "Uveřejnit", - "@publish": {}, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "String", @@ -2169,13 +2142,9 @@ } }, "markAsRead": "Označit jako přečtené", - "@markAsRead": {}, "reportUser": "Nahlásit uživatele", - "@reportUser": {}, "openChat": "Otevřete chat", - "@openChat": {}, "dismiss": "Zavrhnout", - "@dismiss": {}, "reactedWith": "{sender} reagoval s {reaction}", "@reactedWith": { "type": "String", @@ -2189,25 +2158,15 @@ } }, "emojis": "Emojis", - "@emojis": {}, "voiceCall": "Hlasový hovor", - "@voiceCall": {}, "unsupportedAndroidVersion": "Nepodporovaná verze Androidu", - "@unsupportedAndroidVersion": {}, "videoCallsBetaWarning": "Upozorňujeme, že videohovory jsou aktuálně ve verzi beta. Nemusí fungovat podle očekávání nebo fungovat vůbec na všech platformách.", - "@videoCallsBetaWarning": {}, "placeCall": "Zavolejte", - "@placeCall": {}, "emailOrUsername": "E-mail nebo uživatelské jméno", - "@emailOrUsername": {}, "experimentalVideoCalls": "Experimentální videohovory", - "@experimentalVideoCalls": {}, "unsupportedAndroidVersionLong": "Tato funkce vyžaduje novější verzi Android. Zkontrolujte prosím aktualizace nebo podporu Lineage OS.", - "@unsupportedAndroidVersionLong": {}, "pinMessage": "Připnout zprávu do místnosti", - "@pinMessage": {}, "confirmEventUnpin": "Opravdu chcete událost trvale odepnout?", - "@confirmEventUnpin": {}, "separateChatTypes": "Odděĺlit přímé chaty, skupiny a prostory", "@separateChatTypes": { "type": "String", @@ -2231,13 +2190,9 @@ } }, "previousAccount": "Předchozí účet", - "@previousAccount": {}, "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "youAcceptedTheInvitation": "Přijal jsi pozvání", - "@youAcceptedTheInvitation": {}, "youJoinedTheChat": "Připojili jste se k chatu", - "@youJoinedTheChat": {}, "youInvitedBy": "Byli jste pozváni uživatelem {user}", "@youInvitedBy": { "placeholders": { @@ -2247,15 +2202,10 @@ } }, "nextAccount": "Další účet", - "@nextAccount": {}, "addWidget": "Přidat widget", - "@addWidget": {}, "widgetVideo": "Video", - "@widgetVideo": {}, "widgetEtherpad": "Textová poznámka", - "@widgetEtherpad": {}, "widgetName": "Jméno", - "@widgetName": {}, "youBannedUser": "Zakázali jste uživatele {user}", "@youBannedUser": { "placeholders": { @@ -2289,9 +2239,7 @@ } }, "widgetCustom": "Vlastní", - "@widgetCustom": {}, "youRejectedTheInvitation": "Odmítli jste pozvání", - "@youRejectedTheInvitation": {}, "youHaveWithdrawnTheInvitationFor": "Stáhli jste pozvánku pro uživatele {user}", "@youHaveWithdrawnTheInvitationFor": { "placeholders": { @@ -2301,21 +2249,13 @@ } }, "widgetUrlError": "Toto není platná adresa URL.", - "@widgetUrlError": {}, "widgetNameError": "Zadejte jméno pro zobrazení.", - "@widgetNameError": {}, "errorAddingWidget": "Chyba při přidávání widgetu.", - "@errorAddingWidget": {}, "disableEncryptionWarning": "Z bezpečnostních důvodů nemůžete vypnout šifrování v chatu, kde již bylo dříve zapnuto.", - "@disableEncryptionWarning": {}, "confirmMatrixId": "Prosím, potvrďte vaše Matrix ID, abyste mohli smazat váš účet.", - "@confirmMatrixId": {}, "commandHint_googly": "Poslat kroutící se očička", - "@commandHint_googly": {}, "commandHint_cuddle": "Poslat mazlení", - "@commandHint_cuddle": {}, "commandHint_hug": "Poslat obejmutí", - "@commandHint_hug": {}, "hugContent": "{senderName} vás objímá", "@hugContent": { "type": "String", @@ -2344,9 +2284,7 @@ } }, "notAnImage": "Není obrázek.", - "@notAnImage": {}, "importNow": "Importovat nyní", - "@importNow": {}, "redactedByBecause": "Smazáno uživatelem {username} s důvodem: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2360,9 +2298,7 @@ } }, "storeInAndroidKeystore": "Uložit v Android KeyStore", - "@storeInAndroidKeystore": {}, "dehydrateTorLong": "Uživatelům TOR se doporučuje exportovat sezení před zavřením okna.", - "@dehydrateTorLong": {}, "numChats": "{number} konverzací", "@numChats": { "type": "number", @@ -2373,47 +2309,26 @@ } }, "dehydrate": "Exportovat sezení a promazat zařízení", - "@dehydrate": {}, "newGroup": "Nová skupina", - "@newGroup": {}, "hydrateTor": "TOR uživatelé: Import exportovaného sezení", - "@hydrateTor": {}, "doNotShowAgain": "Nezobrazovat znovu", - "@doNotShowAgain": {}, "commandHint_markasdm": "Označit jako místnost přímé konverzace s daným Matrix ID", - "@commandHint_markasdm": {}, "recoveryKey": "Klíč k obnovení", - "@recoveryKey": {}, "hydrateTorLong": "Exportovali jste vaše poslední sezení na TOR? Rychle jej importujte a pokračujte v konverzaci.", - "@hydrateTorLong": {}, "hydrate": "Obnovit ze záložního souboru", - "@hydrate": {}, "pleaseEnterRecoveryKey": "Prosím vložte váš klíč pro obnovení:", - "@pleaseEnterRecoveryKey": {}, "createGroup": "Vytvořit skupinu", - "@createGroup": {}, "shareInviteLink": "Sdílet pozvánku", - "@shareInviteLink": {}, "pleaseEnterRecoveryKeyDescription": "K odemknutí vašich starých zpráv prosím vložte váš klíč k obnovení vygenerovaný v předchozím sezení. Váš klíč k obnovení NENÍ vaše heslo.", - "@pleaseEnterRecoveryKeyDescription": {}, "setColorTheme": "Nastavit barvy:", - "@setColorTheme": {}, "importEmojis": "Importovat Emoji", - "@importEmojis": {}, "importFromZipFile": "Importovat ze .zip souboru", - "@importFromZipFile": {}, "exportEmotePack": "Exportovat Emoji jako .zip", - "@exportEmotePack": {}, "replace": "Nahradit", - "@replace": {}, "users": "Uživatelé", - "@users": {}, "storeInAppleKeyChain": "Uložit v Apple KeyChain", - "@storeInAppleKeyChain": {}, "jumpToLastReadMessage": "Skočit na naposledy přečtenou zprávu", - "@jumpToLastReadMessage": {}, "signInWithPassword": "Přihlásit se pomocí hesla", - "@signInWithPassword": {}, "redactedBy": "Smazáno uživatelem {username}", "@redactedBy": { "type": "String", @@ -2424,43 +2339,24 @@ } }, "inviteContactToGroupQuestion": "Chcete pozvat {contact} do konverzace \"{groupName}\"?", - "@inviteContactToGroupQuestion": {}, "dehydrateTor": "TOR uživatelé: Export sezení", - "@dehydrateTor": {}, "tryAgain": "Zkuste to znovu", - "@tryAgain": {}, "redactMessageDescription": "Tato zpráva bude smazána pro všechny účastníky konverzace. Tuto akci nelze vzít zpět.", - "@redactMessageDescription": {}, "optionalRedactReason": "(Nepovinné) Důvod smazání této zprávy…", - "@optionalRedactReason": {}, "messagesStyle": "Zprávy:", - "@messagesStyle": {}, "allSpaces": "Všechny prostory", - "@allSpaces": {}, "noOtherDevicesFound": "Žádná ostatní zařízení nebyla nalezena", - "@noOtherDevicesFound": {}, "addChatDescription": "Přidat popis konverzace...", - "@addChatDescription": {}, "chatDescription": "Popis konverzace", - "@chatDescription": {}, "chatDescriptionHasBeenChanged": "Popis konverzace byl změněn", - "@chatDescriptionHasBeenChanged": {}, "noChatDescriptionYet": "Zatím nebyl vytvořen žádný popis konverzace.", - "@noChatDescriptionYet": {}, "invalidServerName": "Neplatné jméno serveru", - "@invalidServerName": {}, "chatPermissions": "Oprávnění konverzace", - "@chatPermissions": {}, "directChat": "Přímá konverzace", - "@directChat": {}, "setChatDescription": "Nastavit popis konverzace", - "@setChatDescription": {}, "startFirstChat": "Začněte svou první konverzaci", - "@startFirstChat": {}, "callingPermissions": "Oprávnění volání", - "@callingPermissions": {}, "whyIsThisMessageEncrypted": "Proč nelze přečíst tuto zprávu?", - "@whyIsThisMessageEncrypted": {}, "wasDirectChatDisplayName": "Prázdná konverzace (dříve {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2471,50 +2367,30 @@ } }, "newSpaceDescription": "Prostory umožňují organizovat Vaše konverzace a vytvářet soukromé nebo veřejné komunity.", - "@newSpaceDescription": {}, "profileNotFound": "Uživatel nebyl na serveru nalezen. Možná je problém s připojením nebo uživatel neexistuje.", - "@profileNotFound": {}, "setTheme": "Nastavit vzhled:", - "@setTheme": {}, "sendTypingNotifications": "Posílat oznámení o psaní", - "@sendTypingNotifications": {}, "commandHint_markasgroup": "Označit jako skupinu", - "@commandHint_markasgroup": {}, "allRooms": "Všechny skupinové konverzace", "@allRooms": { "type": "String", "placeholders": {} }, "recoveryKeyLost": "Ztracený klíč k obnovení?", - "@recoveryKeyLost": {}, "unlockOldMessages": "Odemknout staré zprávy", - "@unlockOldMessages": {}, "foregroundServiceRunning": "Toto oznámení se zobrazuje když běží služba na pozadí.", - "@foregroundServiceRunning": {}, "screenSharingDetail": "Sdílíte svou obrazovku přes FluffyChat", - "@screenSharingDetail": {}, "callingAccountDetails": "Opravňuje FluffyChat používat Android systémovou aplikaci pro vytáčení.", - "@callingAccountDetails": {}, "appearOnTop": "Zobrazovat nahoře", - "@appearOnTop": {}, "otherCallingPermissions": "Mikrofon, kamera a ostatní oprávnění FluffyChat", - "@otherCallingPermissions": {}, "encryptThisChat": "Zašifrovat tuto konverzaci", - "@encryptThisChat": {}, "sorryThatsNotPossible": "Omlouváme se… to není možné", - "@sorryThatsNotPossible": {}, "deviceKeys": "Klíče zařízení:", - "@deviceKeys": {}, "reopenChat": "Znovu otevřít konverzaci", - "@reopenChat": {}, "fileIsTooBigForServer": "Neodesláno! Server povoluje maximálně {max} příloh.", - "@fileIsTooBigForServer": {}, "jump": "Skočit", - "@jump": {}, "openLinkInBrowser": "Otevřít odkaz v prohlížeči", - "@openLinkInBrowser": {}, "pleaseTryAgainLaterOrChooseDifferentServer": "Prosím zkuste to znovu nebo si vyberte jiný server.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "signInWith": "Přihlásit se pomocí {provider}", "@signInWith": { "type": "String", @@ -2534,11 +2410,8 @@ } }, "newSpace": "Nový prostor", - "@newSpace": {}, "screenSharingTitle": "sdílení obrazovky", - "@screenSharingTitle": {}, "user": "Uživatel", - "@user": {}, "fileHasBeenSavedAt": "Soubor uložen do {path}", "@fileHasBeenSavedAt": { "type": "String", @@ -2549,15 +2422,10 @@ } }, "custom": "Vlastní", - "@custom": {}, "dehydrateWarning": "Tuto akci nelze vzít zpět. Ujistěte se že záložní soubor máte bezpečně uložen.", - "@dehydrateWarning": {}, "storeInSecureStorageDescription": "Klíč k obnovení uložte v zabezpečeném úložišti tohoto zařízení.", - "@storeInSecureStorageDescription": {}, "saveKeyManuallyDescription": "Uložte tento klíč manuálně pomocí systémového dialogu sdílení nebo zkopírováním do schránky.", - "@saveKeyManuallyDescription": {}, "storeSecurlyOnThisDevice": "Uložit bezpečně na tomto zařízení", - "@storeSecurlyOnThisDevice": {}, "countFiles": "{count} souborů", "@countFiles": { "placeholders": { @@ -2572,21 +2440,13 @@ "placeholders": {} }, "appLockDescription": "Zamknout aplikaci pomocí PIN kódu když není používána", - "@appLockDescription": {}, "globalChatId": "Globální ID chatu", - "@globalChatId": {}, "accessAndVisibility": "Přístup a viditelnost", - "@accessAndVisibility": {}, "calls": "Volání", - "@calls": {}, "customEmojisAndStickers": "Vlastní emoji a nálepky", - "@customEmojisAndStickers": {}, "accessAndVisibilityDescription": "Kdo se může připojit a najít tuto konverzaci.", - "@accessAndVisibilityDescription": {}, "customEmojisAndStickersBody": "Přidat nebo sdílet vlastní emoji nebo nálepky, které mohou být použité v konverzaci.", - "@customEmojisAndStickersBody": {}, "swipeRightToLeftToReply": "Potáhněte z prava do leva pro odpověď", - "@swipeRightToLeftToReply": {}, "countChatsAndCountParticipants": "{chats} konverzaci a {participants} účastníci", "@countChatsAndCountParticipants": { "type": "String", @@ -2600,34 +2460,22 @@ } }, "noMoreChatsFound": "Žádné další konverzace nalezeny...", - "@noMoreChatsFound": {}, "hideRedactedMessages": "Skrýt upravené zprávy", - "@hideRedactedMessages": {}, "hideRedactedMessagesBody": "Pokud někdo zprávu zrediguje, nebude tato zpráva v chatu již viditelná.", - "@hideRedactedMessagesBody": {}, "hideInvalidOrUnknownMessageFormats": "Skrytí nesprávných nebo neznámých formátů zpráv", - "@hideInvalidOrUnknownMessageFormats": {}, "blockUsername": "Ignorovat uživatelské jméno", - "@blockUsername": {}, "hideMemberChangesInPublicChats": "Skrýt změny členů ve veřejných chatech", - "@hideMemberChangesInPublicChats": {}, "hideMemberChangesInPublicChatsBody": "Nezobrazovat na časové ose chatu, pokud se někdo připojí nebo opustí veřejný chat, aby se zlepšila čitelnost.", - "@hideMemberChangesInPublicChatsBody": {}, "overview": "Přehled", - "@overview": {}, "notifyMeFor": "Upozorněte mě na", - "@notifyMeFor": {}, "passwordRecoverySettings": "Nastavení obnovení hesla", - "@passwordRecoverySettings": {}, "presenceStyle": "Dostupnost:", "@presenceStyle": { "type": "String", "placeholders": {} }, "block": "Blokovat", - "@block": {}, "indexedDbErrorLong": "Ukládání zpráv bohužel není ve výchozím nastavení v soukromém režimu povoleno.\nNavštivte prosím\n - about:config\n - nastavte dom.indexedDB.privateBrowsing.enabled na true\nV opačném případě nebude možné FluffyChat spustit.", - "@indexedDbErrorLong": {}, "youInvitedToBy": "📩 Prostřednictvím odkazu jste byli pozváni na:\n{alias}", "@youInvitedToBy": { "placeholders": { @@ -2637,25 +2485,17 @@ } }, "indexedDbErrorTitle": "Problémy privátního prostředí", - "@indexedDbErrorTitle": {}, "blockListDescription": "Můžete blokovat uživatele, kteří vás obtěžují. Od uživatelů na vašem osobním seznamu blokovaných uživatelů nebudete moci přijímat žádné zprávy ani pozvánky do místnosti.", - "@blockListDescription": {}, "blockedUsers": "Zablokování uživatelé", - "@blockedUsers": {}, "alwaysUse24HourFormat": "Vypnuto", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, "noChatsFoundHere": "Nejsou zde žádné chaty. Začněte nový chat s někým, použitím níže uvedeného tlačítka. ⤵️", - "@noChatsFoundHere": {}, "joinedChats": "Připojené chaty", - "@joinedChats": {}, "unread": "Nepřečtené", - "@unread": {}, "space": "Prostor", - "@space": {}, "spaces": "Prostory", - "@spaces": {}, "presencesToggle": "Zobrazení stavových zpráv od jiných uživatelů", "@presencesToggle": { "type": "String", @@ -2671,9 +2511,7 @@ } }, "ignoreUser": "Ignorovat uživatele", - "@ignoreUser": {}, "normalUser": "Normalní uživatel", - "@normalUser": {}, "countInvited": "{count} pozváno", "@countInvited": { "type": "String", @@ -2700,17 +2538,11 @@ } }, "usersMustKnock": "Uživatelé musí zaklepat", - "@usersMustKnock": {}, "setCustomPermissionLevel": "Nastavit vlastní úroveň oprávnění", - "@setCustomPermissionLevel": {}, "changedTheChatDescription": "{username} změnil/a popis konverzace", - "@changedTheChatDescription": {}, "changedTheChatName": "{username} změnil/a název konverzace", - "@changedTheChatName": {}, "checkList": "Kontrolní seznam", - "@checkList": {}, "knock": "Zaklepat", - "@knock": {}, "userWouldLikeToChangeTheChat": "{user} požádal/a o přidání do konverzace.", "@userWouldLikeToChangeTheChat": { "placeholders": { @@ -2720,33 +2552,19 @@ } }, "enterSpace": "Vstoupit do prostoru", - "@enterSpace": {}, "enterRoom": "Vstoupit do místnosti", - "@enterRoom": {}, "hideUnimportantStateEvents": "Skrýt nedůležité stavové události", - "@hideUnimportantStateEvents": {}, "hidePresences": "Skrýt seznam událostí?", - "@hidePresences": {}, "noBackupWarning": "Pozor! Bez povolení zálohování konverzací ztratíte přístup k zašifrovaným zprávám. Důrazně doporučujeme zálohování konverzací před odhlášením povolit.", - "@noBackupWarning": {}, "readUpToHere": "Čtěte až sem", - "@readUpToHere": {}, "reportErrorDescription": "😭 Ale ne, něco se porouchalo. Pokud chcete, můžete tento bug nahlásit vývojářům.", - "@reportErrorDescription": {}, "report": "hlášení", - "@report": {}, "invite": "Pozvánka", - "@invite": {}, "inviteGroupChat": "📨 Skupinová pozvánka", - "@inviteGroupChat": {}, "invitePrivateChat": "📨 Soukromá pozvánka", - "@invitePrivateChat": {}, "appearOnTopDetails": "Umožňuje zobrazit aplikaci nahoře (není nutné, pokud již máte Fluffychat nastaven jako účet volajícího)", - "@appearOnTopDetails": {}, "noKeyForThisMessage": "K tomuto může dojít, pokud byla zpráva odeslána před přihlášením k účtu v tomto zařízení.\n\nJe také možné, že odesílatel zablokoval vaše zařízení nebo se něco pokazilo s internetovým připojením.\n\nJste schopni si zprávu přečíst v jiné relaci? Pak můžete zprávu přenést z něj! Přejděte do Nastavení > Zařízení a zkontrolujte, zda se Vaše zařízení vzájemně ověřila. Při příštím otevření místnosti, kdy budou obě relace v popředí, se klíče přenesou automaticky.\n\nNechcete klíče ztratit při odhlašování nebo přepínání zařízení? Ujistěte se, že jste v nastaveních povolili zálohování konverzací.", - "@noKeyForThisMessage": {}, "invalidInput": "Nevhodný vstup!", - "@invalidInput": {}, "wrongPinEntered": "Nespravný PIN! Zkuste to znovu za {seconds} vteřin...", "@wrongPinEntered": { "type": "String", @@ -2757,27 +2575,16 @@ } }, "pleaseEnterANumber": "Prosím, zadejte číslo větší než 0", - "@pleaseEnterANumber": {}, "archiveRoomDescription": "Konverzace bude přesunuta do archivu. Ostatní uživatelé uvidí, že jste konverzaci opustil/a.", - "@archiveRoomDescription": {}, "roomUpgradeDescription": "Konverzace bude vytvořena znovu s novou verzí místnosti. Všem účastníkům bude oznámeno, že se musí přesunout do nové konverzace. Více o verzích místností se dočtete na https://spec.matrix.org/latest/", - "@roomUpgradeDescription": {}, "removeDevicesDescription": "Budete odhlášen/a z tohoto zařízení a nebudete nadále moci přijímat zprávy.", - "@removeDevicesDescription": {}, "banUserDescription": "Uživatel bude vyhozen z konverzace a nebude se moci znovu připojit dokud nebude odblokován.", - "@banUserDescription": {}, "unbanUserDescription": "Uživatel se bude moci vrátit do konverzace pokud se o to pokusí.", - "@unbanUserDescription": {}, "makeAdminDescription": "Jestliže tohoto uživatele povýšíte na administrátora, nebude tak moci odčinit, protože bude mít stejná oprávnění jako Vy.", - "@makeAdminDescription": {}, "pushNotificationsNotAvailable": "Notifikace nejsou dostupné", - "@pushNotificationsNotAvailable": {}, "learnMore": "Dozvědět se více", - "@learnMore": {}, "yourGlobalUserIdIs": "Vaše globální uživatelské ID (user-ID) je: ", - "@yourGlobalUserIdIs": {}, "knocking": "Klepání", - "@knocking": {}, "chatCanBeDiscoveredViaSearchOnServer": "Konverzaci naleznete vyhledáváním na {server}", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2788,45 +2595,170 @@ } }, "searchChatsRooms": "Vyhledat #konverzace, @uživatele...", - "@searchChatsRooms": {}, "nothingFound": "Nic nenalezeno...", - "@nothingFound": {}, "groupName": "Název skupiny", - "@groupName": {}, "createGroupAndInviteUsers": "Vytvořit skupinu a pozvat uživatele", - "@createGroupAndInviteUsers": {}, "groupCanBeFoundViaSearch": "Skupinu naleznete vyhledávním", - "@groupCanBeFoundViaSearch": {}, "startConversation": "Začít konverzaci", - "@startConversation": {}, "commandHint_sendraw": "Odeslat soubor json", - "@commandHint_sendraw": {}, "databaseMigrationTitle": "Databáze je optimalizována", - "@databaseMigrationTitle": {}, "databaseMigrationBody": "Vydržte prosím. Bude to chvilku trvat.", - "@databaseMigrationBody": {}, "leaveEmptyToClearStatus": "Zanechte prázdné pro smazání statusu.", - "@leaveEmptyToClearStatus": {}, "select": "Vybrat", - "@select": {}, "searchForUsers": "Vyhledat @uživatele...", - "@searchForUsers": {}, "pleaseEnterYourCurrentPassword": "Prosím, zadejte Vaše současné heslo", - "@pleaseEnterYourCurrentPassword": {}, "newPassword": "Nové heslo", - "@newPassword": {}, "pleaseChooseAStrongPassword": "Prosím, zvolte si silné heslo", - "@pleaseChooseAStrongPassword": {}, "passwordsDoNotMatch": "Hesla se neshodují", - "@passwordsDoNotMatch": {}, "passwordIsWrong": "Zadané heslo je nesprávné", - "@passwordIsWrong": {}, "publicLink": "Veřejný odkaz", - "@publicLink": {}, "publicChatAddresses": "Adresy veřejných konverzací", - "@publicChatAddresses": {}, "createNewAddress": "Vytvořit novou adresu", - "@createNewAddress": {}, "thisDevice": "Toto zařzení:", - "@thisDevice": {} + "setPermissionsLevelDescription": "Zvolte, prosím, níže roli, nebo zadejte vlastní úroveň oprávnění mezi 0 a 100.", + "synchronizingPleaseWaitCounter": " Synchronizuji… ({percentage} %)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "noOneCanJoin": "Nikdo se nemůže připojit", + "noPublicLinkHasBeenCreatedYet": "Zatím nebyl vytvořen žádný veřejný odkaz", + "kickUserDescription": "Uživatel bude vyhozen z chatu, ale nikoliv zabanován. V případě veřejných chatů to znamená, že se kdykoliv může znovu připojit.", + "noUsersFoundWithQuery": "Nepodařilo se najít uživatele \"{query}\". Zkontrolujte, prosím, že jste se nepřepsali.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "wrongRecoveryKey": "Jejda... toto nejspíš není správný obnovovací klíč.", + "joinSpace": "Připojit se do prostoru", + "publicSpaces": "Veřejné prostory", + "decline": "Odmítnout", + "initAppError": "Při načítání nastala chyba", + "minimumPowerLevel": "Minimální úroveň oprávnění je {level}.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "gallery": "Galerie", + "files": "Soubory", + "databaseBuildErrorBody": "Nepodařilo se sestavit SQlite databázi. Aplikace se pokusí použít starší verzi databáze. Nahlaste, prosím, tuto chybu vývojářům na adrese {url}. Chybová hláška je: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "Vaše relace byla ztracena. Nahlaste, prosím, tuto chybu vývojářům na adrese {url}. Chybová hláška je: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "Aplikace se pokusí obnovit vaši relaci ze zálohy. Nahlaste, prosím, tuto chybu vývojářům na adrese {url}. Chybová hláška je: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "forwardMessageTo": "Přeposlat zprávu do {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceipts": "Posílat potvrzení o přečtení", + "sendTypingNotificationsDescription": "Ostatní účastníci konverzace uvidí, že píšete novou zprávu.", + "sendReadReceiptsDescription": "Ostatní účastníci konverzace uvidí, že jste si přečetl/a jejich zprávu.", + "formattedMessages": "Formátované zprávy", + "formattedMessagesDescription": "Zobrazovat formátovaný obsah zpráv, jako například tučný text pomocí markdownu.", + "verifyOtherUser": "🔐 Ověřit jiného uživatele", + "verifyOtherUserDescription": "Když ověříte jiného uživatele, můžete si být jistí, že víte, s kým si píšete. 💪\n\nJakmile začnete s ověřením, vy a druhý uživatel uvidíte v aplikaci vyskakovací okno. V něm uvidíte sérii emodži nebo čísel, které musíte společně porovnat.\n\nNejjednodušší je setkat se osobně nebo si udělat videohovor. 👭", + "verifyOtherDevice": "🔐 Ověřit jiné zařízení", + "verifyOtherDeviceDescription": "Když ověříte jiné zařízení, tato zařízení si mohou vyměnit klíče, čímž zvýšíte vaše zabezpečení. 💪 Jakmile začnete s ověřením, v aplikaci na obou zařízeních se objeví vyskakovací okno. V něm uvidíte sérii emodži nebo čísel, které musíte na zařízeních porovnat mezi sebou. Než začnete s ověřováním, je fajn mít obě zařízení po ruce. 🤳", + "acceptedKeyVerification": "{sender} přijal ověření klíče", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} zrušil ověření klíče", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} dokončil ověření klíče", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} je připraven/a na ověření klíče", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} požádal/a o ověření klíče", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} začal/a s ověřením klíče", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + } } From 8d86dcec212a1f7b9bedccf3359fcb41c4b080cd Mon Sep 17 00:00:00 2001 From: Malva Jakobsson Date: Mon, 9 Feb 2026 21:55:32 +0100 Subject: [PATCH 074/333] chore(translations): Translated using Weblate (Swedish) Currently translated at 85.8% (721 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/sv/ --- lib/l10n/intl_sv.arb | 5784 +++++++++++++++++++++--------------------- 1 file changed, 2931 insertions(+), 2853 deletions(-) diff --git a/lib/l10n/intl_sv.arb b/lib/l10n/intl_sv.arb index c3e78d76..492a8cd0 100644 --- a/lib/l10n/intl_sv.arb +++ b/lib/l10n/intl_sv.arb @@ -1,2858 +1,2936 @@ { - "@@last_modified": "2021-08-14 12:41:09.835634", - "about": "Om", - "@about": { - "type": "String", - "placeholders": {} - }, - "accept": "Acceptera", - "@accept": { - "type": "String", - "placeholders": {} - }, - "acceptedTheInvitation": "👍 {username} accepterade inbjudan", - "@acceptedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "account": "Konto", - "@account": { - "type": "String", - "placeholders": {} - }, - "activatedEndToEndEncryption": "🔐 {username} aktiverade ändpunktskryptering", - "@activatedEndToEndEncryption": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "admin": "Admin", - "@admin": { - "type": "String", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "String", - "placeholders": {} - }, - "all": "Alla", - "@all": { - "type": "String", - "placeholders": {} - }, - "answeredTheCall": "{senderName} besvarade samtalet", - "@answeredTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "anyoneCanJoin": "Vem som helst kan gå med", - "@anyoneCanJoin": { - "type": "String", - "placeholders": {} - }, - "appLock": "App-lås", - "@appLock": { - "type": "String", - "placeholders": {} - }, - "archive": "Arkiv", - "@archive": { - "type": "String", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Får gästanvändare gå med", - "@areGuestsAllowedToJoin": { - "type": "String", - "placeholders": {} - }, - "areYouSure": "Är du säker?", - "@areYouSure": { - "type": "String", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Är du säker på att du vill logga ut?", - "@areYouSureYouWantToLogout": { - "type": "String", - "placeholders": {} - }, - "askSSSSSign": "För att kunna signera den andra personen, vänligen ange din lösenfras eller återställningsnyckel för säker lagring.", - "@askSSSSSign": { - "type": "String", - "placeholders": {} - }, - "askVerificationRequest": "Acceptera denna verifikationsförfrågan från {username}?", - "@askVerificationRequest": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "badServerVersionsException": "Hemservern stöjder Spec-versionen:\n{serverVersions}\nMen denna app stödjer enbart {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "banFromChat": "Bannlys från chatt", - "@banFromChat": { - "type": "String", - "placeholders": {} - }, - "banned": "Bannlyst", - "@banned": { - "type": "String", - "placeholders": {} - }, - "bannedUser": "{username} bannlös {targetName}", - "@bannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "blockDevice": "Blockera Enhet", - "@blockDevice": { - "type": "String", - "placeholders": {} - }, - "botMessages": "Bot meddelanden", - "@botMessages": { - "type": "String", - "placeholders": {} - }, - "cancel": "Avbryt", - "@cancel": { - "type": "String", - "placeholders": {} - }, - "changeDeviceName": "Ändra enhetsnamn", - "@changeDeviceName": { - "type": "String", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} ändrade sin chatt-avatar", - "@changedTheChatAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheChatDescriptionTo": "{username} ändrade chatt-beskrivningen till: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "description": { - "type": "String" - } - } - }, - "changedTheChatNameTo": "{username} ändrade sitt chatt-namn till: '{chatname}'", - "@changedTheChatNameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "chatname": { - "type": "String" - } - } - }, - "changedTheChatPermissions": "{username} ändrade chatt-rättigheterna", - "@changedTheChatPermissions": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheDisplaynameTo": "{username} ändrade visningsnamnet till: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "displayname": { - "type": "String" - } - } - }, - "changedTheGuestAccessRules": "{username} ändrade reglerna för gästaccess", - "@changedTheGuestAccessRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheGuestAccessRulesTo": "{username} ändrade reglerna för gästaccess till: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheHistoryVisibility": "{username} ändrade historikens synlighet", - "@changedTheHistoryVisibility": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheHistoryVisibilityTo": "{username} ändrade historikens synlighet till: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheJoinRules": "{username} ändrade anslutningsreglerna", - "@changedTheJoinRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheJoinRulesTo": "{username} ändrade anslutningsreglerna till {joinRules}", - "@changedTheJoinRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "joinRules": { - "type": "String" - } - } - }, - "changedTheProfileAvatar": "{username} ändrade sin avatar", - "@changedTheProfileAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheRoomAliases": "{username} ändrade rummets alias", - "@changedTheRoomAliases": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheRoomInvitationLink": "{username} ändrade inbjudningslänken", - "@changedTheRoomInvitationLink": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changePassword": "Ändra lösenord", - "@changePassword": { - "type": "String", - "placeholders": {} - }, - "changeTheHomeserver": "Ändra hemserver", - "@changeTheHomeserver": { - "type": "String", - "placeholders": {} - }, - "changeTheme": "Ändra din stil", - "@changeTheme": { - "type": "String", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Ändra namn på gruppen", - "@changeTheNameOfTheGroup": { - "type": "String", - "placeholders": {} - }, - "channelCorruptedDecryptError": "Krypteringen har blivit korrupt", - "@channelCorruptedDecryptError": { - "type": "String", - "placeholders": {} - }, - "chat": "Chatt", - "@chat": { - "type": "String", - "placeholders": {} - }, - "chatDetails": "Chatt-detaljer", - "@chatDetails": { - "type": "String", - "placeholders": {} - }, - "chooseAStrongPassword": "Välj ett starkt lösenord", - "@chooseAStrongPassword": { - "type": "String", - "placeholders": {} - }, - "close": "Stäng", - "@close": { - "type": "String", - "placeholders": {} - }, - "compareEmojiMatch": "Vänligen jämför uttryckssymbolerna", - "@compareEmojiMatch": { - "type": "String", - "placeholders": {} - }, - "compareNumbersMatch": "Vänligen jämför siffrorna", - "@compareNumbersMatch": { - "type": "String", - "placeholders": {} - }, - "configureChat": "Konfigurera chatt", - "@configureChat": { - "type": "String", - "placeholders": {} - }, - "confirm": "Bekräfta", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Anslut", - "@connect": { - "type": "String", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Kontakten har blivit inbjuden till gruppen", - "@contactHasBeenInvitedToTheGroup": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "Innehåller visningsnamn", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Innehåller användarnamn", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "contentHasBeenReported": "Innehållet har rapporterats till server-admins", - "@contentHasBeenReported": { - "type": "String", - "placeholders": {} - }, - "copiedToClipboard": "Kopierat till urklipp", - "@copiedToClipboard": { - "type": "String", - "placeholders": {} - }, - "copy": "Kopiera", - "@copy": { - "type": "String", - "placeholders": {} - }, - "couldNotDecryptMessage": "Kunde ej avkoda meddelande: {error}", - "@couldNotDecryptMessage": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "countParticipants": "{count} deltagare", - "@countParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "create": "Skapa", - "@create": { - "type": "String", - "placeholders": {} - }, - "createdTheChat": "💬 {username} skapade chatten", - "@createdTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "currentlyActive": "För närvarande aktiv", - "@currentlyActive": { - "type": "String", - "placeholders": {} - }, - "darkTheme": "Mörkt", - "@darkTheme": { - "type": "String", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "String", - "placeholders": { - "date": { - "type": "String" - }, - "timeOfDay": { - "type": "String" - } - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "deactivateAccountWarning": "Detta kommer att avaktivera ditt konto. Det här går inte att ångra! Är du säker?", - "@deactivateAccountWarning": { - "type": "String", - "placeholders": {} - }, - "defaultPermissionLevel": "Standard behörighetsnivå", - "@defaultPermissionLevel": { - "type": "String", - "placeholders": {} - }, - "delete": "Radera", - "@delete": { - "type": "String", - "placeholders": {} - }, - "deleteAccount": "Ta bort konto", - "@deleteAccount": { - "type": "String", - "placeholders": {} - }, - "deleteMessage": "Ta bort meddelande", - "@deleteMessage": { - "type": "String", - "placeholders": {} - }, - "device": "Enhet", - "@device": { - "type": "String", - "placeholders": {} - }, - "deviceId": "Enhets-ID", - "@deviceId": { - "type": "String", - "placeholders": {} - }, - "devices": "Enheter", - "@devices": { - "type": "String", - "placeholders": {} - }, - "directChats": "Direkt chatt", - "@directChats": { - "type": "String", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Visningsnamn har ändrats", - "@displaynameHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "downloadFile": "Ladda ner fil", - "@downloadFile": { - "type": "String", - "placeholders": {} - }, - "edit": "Ändra", - "@edit": { - "type": "String", - "placeholders": {} - }, - "editBlockedServers": "redigera blockerade servrar", - "@editBlockedServers": { - "type": "String", - "placeholders": {} - }, - "editDisplayname": "Ändra visningsnamn", - "@editDisplayname": { - "type": "String", - "placeholders": {} - }, - "editRoomAvatar": "redigera rumsavatar", - "@editRoomAvatar": { - "type": "String", - "placeholders": {} - }, - "emoteExists": "Dekalen existerar redan!", - "@emoteExists": { - "type": "String", - "placeholders": {} - }, - "emoteInvalid": "Ogiltig dekal-kod!", - "@emoteInvalid": { - "type": "String", - "placeholders": {} - }, - "emotePacks": "Dekalpaket för rummet", - "@emotePacks": { - "type": "String", - "placeholders": {} - }, - "emoteSettings": "Emote inställningar", - "@emoteSettings": { - "type": "String", - "placeholders": {} - }, - "emoteShortcode": "Dekal kod", - "@emoteShortcode": { - "type": "String", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Du måste välja en dekal-kod och en bild!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, - "emptyChat": "Tom chatt", - "@emptyChat": { - "type": "String", - "placeholders": {} - }, - "enableEmotesGlobally": "Aktivera dekal-paket globalt", - "@enableEmotesGlobally": { - "type": "String", - "placeholders": {} - }, - "enableEncryption": "Aktivera kryptering", - "@enableEncryption": { - "type": "String", - "placeholders": {} - }, - "enableEncryptionWarning": "Du kommer inte ha fortsatt möjlighet till att inaktivera krypteringen. Är du säker?", - "@enableEncryptionWarning": { - "type": "String", - "placeholders": {} - }, - "encrypted": "Krypterad", - "@encrypted": { - "type": "String", - "placeholders": {} - }, - "encryption": "Kryptering", - "@encryption": { - "type": "String", - "placeholders": {} - }, - "encryptionNotEnabled": "Kryptering är ej aktiverad", - "@encryptionNotEnabled": { - "type": "String", - "placeholders": {} - }, - "endedTheCall": "{senderName} avslutade samtalet", - "@endedTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "enterAnEmailAddress": "Ange en e-postaddress", - "@enterAnEmailAddress": { - "type": "String", - "placeholders": {} - }, - "enterYourHomeserver": "Ange din hemserver", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, - "extremeOffensive": "Extremt stötande", - "@extremeOffensive": { - "type": "String", - "placeholders": {} - }, - "fileName": "Filnamn", - "@fileName": { - "type": "String", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "String", - "placeholders": {} - }, - "forward": "Framåt", - "@forward": { - "type": "String", - "placeholders": {} - }, - "fromJoining": "Från att gå med", - "@fromJoining": { - "type": "String", - "placeholders": {} - }, - "fromTheInvitation": "Från inbjudan", - "@fromTheInvitation": { - "type": "String", - "placeholders": {} - }, - "group": "Grupp", - "@group": { - "type": "String", - "placeholders": {} - }, - "groupIsPublic": "Gruppen är publik", - "@groupIsPublic": { - "type": "String", - "placeholders": {} - }, - "groups": "Grupper", - "@groups": { - "type": "String", - "placeholders": {} - }, - "groupWith": "Gruppen med {displayname}", - "@groupWith": { - "type": "String", - "placeholders": { - "displayname": { - "type": "String" - } - } - }, - "guestsAreForbidden": "Gäster är förbjudna", - "@guestsAreForbidden": { - "type": "String", - "placeholders": {} - }, - "guestsCanJoin": "Gäster kan ansluta", - "@guestsCanJoin": { - "type": "String", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} har tagit tillbaka inbjudan för {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "help": "Hjälp", - "@help": { - "type": "String", - "placeholders": {} - }, - "hideRedactedEvents": "Göm redigerade händelser", - "@hideRedactedEvents": { - "type": "String", - "placeholders": {} - }, - "hideUnknownEvents": "Göm okända händelser", - "@hideUnknownEvents": { - "type": "String", - "placeholders": {} - }, - "howOffensiveIsThisContent": "Hur stötande är detta innehåll?", - "@howOffensiveIsThisContent": { - "type": "String", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "String", - "placeholders": {} - }, - "identity": "Identitet", - "@identity": { - "type": "String", - "placeholders": {} - }, - "ignore": "Ignorera", - "@ignore": { - "type": "String", - "placeholders": {} - }, - "ignoredUsers": "Ignorera användare", - "@ignoredUsers": { - "type": "String", - "placeholders": {} - }, - "iHaveClickedOnLink": "Jag har klickat på länken", - "@iHaveClickedOnLink": { - "type": "String", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Felaktig lösenordsfras eller åsterställningsnyckel", - "@incorrectPassphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "inoffensive": "Oförargligt", - "@inoffensive": { - "type": "String", - "placeholders": {} - }, - "inviteContact": "Bjud in kontakt", - "@inviteContact": { - "type": "String", - "placeholders": {} - }, - "inviteContactToGroup": "Bjud in kontakt till {groupName}", - "@inviteContactToGroup": { - "type": "String", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "invited": "Inbjuden", - "@invited": { - "type": "String", - "placeholders": {} - }, - "invitedUser": "📩 {username} bjöd in {targetName}", - "@invitedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "invitedUsersOnly": "Endast inbjudna användare", - "@invitedUsersOnly": { - "type": "String", - "placeholders": {} - }, - "inviteForMe": "Inbjudning till mig", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, - "inviteText": "{username} bjöd in dig till FluffyChat.\n1. Besök fluffychat.im och installera appen\n2. Registrera dig eller logga in\n3. Öppna inbjudningslänk:\n {link}", - "@inviteText": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "isTyping": "skriver…", - "@isTyping": { - "type": "String", - "placeholders": {} - }, - "joinedTheChat": "👋 {username} anslöt till chatten", - "@joinedTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "joinRoom": "Anslut till rum", - "@joinRoom": { - "type": "String", - "placeholders": {} - }, - "kicked": "👞 {username} sparkade ut {targetName}", - "@kicked": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "kickedAndBanned": "🙅 {username} sparkade och bannade {targetName}", - "@kickedAndBanned": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "kickFromChat": "Sparka från chatt", - "@kickFromChat": { - "type": "String", - "placeholders": {} - }, - "lastActiveAgo": "Senast aktiv: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "String", - "placeholders": { - "localizedTimeShort": { - "type": "String" - } - } - }, - "leave": "Lämna", - "@leave": { - "type": "String", - "placeholders": {} - }, - "leftTheChat": "Lämnade chatten", - "@leftTheChat": { - "type": "String", - "placeholders": {} - }, - "license": "Licens", - "@license": { - "type": "String", - "placeholders": {} - }, - "lightTheme": "Ljust", - "@lightTheme": { - "type": "String", - "placeholders": {} - }, - "loadCountMoreParticipants": "Ladda {count} mer deltagare", - "@loadCountMoreParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "loadingPleaseWait": "Laddar... Var god vänta.", - "@loadingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "loadMore": "Ladda mer…", - "@loadMore": { - "type": "String", - "placeholders": {} - }, - "login": "Logga in", - "@login": { - "type": "String", - "placeholders": {} - }, - "logInTo": "Logga in till {homeserver}", - "@logInTo": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "logout": "Logga ut", - "@logout": { - "type": "String", - "placeholders": {} - }, - "memberChanges": "Medlemsändringar", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, - "mention": "Nämn", - "@mention": { - "type": "String", - "placeholders": {} - }, - "messages": "Meddelanden", - "@messages": { - "type": "String", - "placeholders": {} - }, - "moderator": "Moderator", - "@moderator": { - "type": "String", - "placeholders": {} - }, - "muteChat": "Tysta chatt", - "@muteChat": { - "type": "String", - "placeholders": {} - }, - "needPantalaimonWarning": "Var medveten om att du behöver Pantalaimon för att använda ändpunktskryptering tillsvidare.", - "@needPantalaimonWarning": { - "type": "String", - "placeholders": {} - }, - "newChat": "Ny chatt", - "@newChat": { - "type": "String", - "placeholders": {} - }, - "newMessageInFluffyChat": "💬 Nya meddelanden i FluffyChat", - "@newMessageInFluffyChat": { - "type": "String", - "placeholders": {} - }, - "newVerificationRequest": "Ny verifikationsbegäran!", - "@newVerificationRequest": { - "type": "String", - "placeholders": {} - }, - "next": "Nästa", - "@next": { - "type": "String", - "placeholders": {} - }, - "no": "Nej", - "@no": { - "type": "String", - "placeholders": {} - }, - "noConnectionToTheServer": "Ingen anslutning till servern", - "@noConnectionToTheServer": { - "type": "String", - "placeholders": {} - }, - "noEmotesFound": "Hittade inga dekaler. 😕", - "@noEmotesFound": { - "type": "String", - "placeholders": {} - }, - "noGoogleServicesWarning": "De ser ut som att du inte har google-tjänster på din telefon. Det är ett bra beslut för din integritet! För att få aviseringar i FluffyChat rekommenderar vi att använda https://microg.org/ eller https://unifiedpush.org/ .", - "@noGoogleServicesWarning": { - "type": "String", - "placeholders": {} - }, - "none": "Ingen", - "@none": { - "type": "String", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Du har inte lagt till något sätt för att återställa ditt lösenord än.", - "@noPasswordRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "noPermission": "Ingen behörighet", - "@noPermission": { - "type": "String", - "placeholders": {} - }, - "noRoomsFound": "Hittade inga rum…", - "@noRoomsFound": { - "type": "String", - "placeholders": {} - }, - "notifications": "Aviseringar", - "@notifications": { - "type": "String", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Aviseringar är påslaget för detta konto", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, - "numUsersTyping": "{count} användare skriver…", - "@numUsersTyping": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "offensive": "Stötande", - "@offensive": { - "type": "String", - "placeholders": {} - }, - "offline": "Offline", - "@offline": { - "type": "String", - "placeholders": {} - }, - "ok": "OK", - "@ok": { - "type": "String", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "String", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online Nyckel-backup är aktiverad", - "@onlineKeyBackupEnabled": { - "type": "String", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Hoppsan, något gick fel…", - "@oopsSomethingWentWrong": { - "type": "String", - "placeholders": {} - }, - "openAppToReadMessages": "Öppna app för att lästa meddelanden", - "@openAppToReadMessages": { - "type": "String", - "placeholders": {} - }, - "openCamera": "Öppna kamera", - "@openCamera": { - "type": "String", - "placeholders": {} - }, - "participant": "Deltagare", - "@participant": { - "type": "String", - "placeholders": {} - }, - "passphraseOrKey": "lösenord eller återställningsnyckel", - "@passphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "password": "Lösenord", - "@password": { - "type": "String", - "placeholders": {} - }, - "passwordForgotten": "Glömt lösenord", - "@passwordForgotten": { - "type": "String", - "placeholders": {} - }, - "passwordHasBeenChanged": "Lösenordet har ändrats", - "@passwordHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "passwordRecovery": "Återställ lösenord", - "@passwordRecovery": { - "type": "String", - "placeholders": {} - }, - "pickImage": "Välj en bild", - "@pickImage": { - "type": "String", - "placeholders": {} - }, - "pin": "Nåla fast", - "@pin": { - "type": "String", - "placeholders": {} - }, - "play": "Spela {fileName}", - "@play": { - "type": "String", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "pleaseChooseAPasscode": "Ange ett lösenord", - "@pleaseChooseAPasscode": { - "type": "String", - "placeholders": {} - }, - "pleaseClickOnLink": "Klicka på länken i e-postmeddelandet för att sedan fortsätta.", - "@pleaseClickOnLink": { - "type": "String", - "placeholders": {} - }, - "pleaseEnter4Digits": "Ange 4 siffror eller lämna tom för att inaktivera app-lås.", - "@pleaseEnter4Digits": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Ange ditt lösenord", - "@pleaseEnterYourPassword": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Ange ditt användarnamn", - "@pleaseEnterYourUsername": { - "type": "String", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Följ instruktionerna på hemsidan och tryck på nästa.", - "@pleaseFollowInstructionsOnWeb": { - "type": "String", - "placeholders": {} - }, - "privacy": "Integritet", - "@privacy": { - "type": "String", - "placeholders": {} - }, - "publicRooms": "Publika Rum", - "@publicRooms": { - "type": "String", - "placeholders": {} - }, - "pushRules": "Regler", - "@pushRules": { - "type": "String", - "placeholders": {} - }, - "reason": "Anledning", - "@reason": { - "type": "String", - "placeholders": {} - }, - "recording": "Spelar in", - "@recording": { - "type": "String", - "placeholders": {} - }, - "redactedAnEvent": "{username} redigerade en händelse", - "@redactedAnEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "redactMessage": "Redigera meddelande", - "@redactMessage": { - "type": "String", - "placeholders": {} - }, - "reject": "Avböj", - "@reject": { - "type": "String", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} avböjde inbjudan", - "@rejectedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "rejoin": "Återanslut", - "@rejoin": { - "type": "String", - "placeholders": {} - }, - "remove": "Ta bort", - "@remove": { - "type": "String", - "placeholders": {} - }, - "removeAllOtherDevices": "Ta bort alla andra enheter", - "@removeAllOtherDevices": { - "type": "String", - "placeholders": {} - }, - "removedBy": "Bortagen av {username}", - "@removedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "removeDevice": "Ta bort enhet", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, - "unbanFromChat": "Ta bort chatt-blockering", - "@unbanFromChat": { - "type": "String", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Ersätt rum med nyare version", - "@replaceRoomWithNewerVersion": { - "type": "String", - "placeholders": {} - }, - "reply": "Svara", - "@reply": { - "type": "String", - "placeholders": {} - }, - "reportMessage": "Rapportera meddelande", - "@reportMessage": { - "type": "String", - "placeholders": {} - }, - "requestPermission": "Begär behörighet", - "@requestPermission": { - "type": "String", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Rummet har blivit uppgraderat", - "@roomHasBeenUpgraded": { - "type": "String", - "placeholders": {} - }, - "search": "Sök", - "@search": { - "type": "String", - "placeholders": {} - }, - "security": "Säkerhet", - "@security": { - "type": "String", - "placeholders": {} - }, - "seenByUser": "Sedd av {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "send": "Skicka", - "@send": { - "type": "String", - "placeholders": {} - }, - "sendAMessage": "Skicka ett meddelande", - "@sendAMessage": { - "type": "String", - "placeholders": {} - }, - "sendAudio": "Skicka ljud", - "@sendAudio": { - "type": "String", - "placeholders": {} - }, - "sendFile": "Skicka fil", - "@sendFile": { - "type": "String", - "placeholders": {} - }, - "sendImage": "Skicka bild", - "@sendImage": { - "type": "String", - "placeholders": {} - }, - "sendMessages": "Skickade meddelanden", - "@sendMessages": { - "type": "String", - "placeholders": {} - }, - "sendOriginal": "Skicka orginal", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendVideo": "Skicka video", - "@sendVideo": { - "type": "String", - "placeholders": {} - }, - "sentAFile": "📁 {username} skickade en fil", - "@sentAFile": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAnAudio": "🎤 {username} skickade ett ljudklipp", - "@sentAnAudio": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAPicture": "🖼️ {username} skickade en bild", - "@sentAPicture": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentASticker": "😊 {username} skickade ett klistermärke", - "@sentASticker": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAVideo": "🎥 {username} skickade en video", - "@sentAVideo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentCallInformations": "{senderName} skickade samtalsinformation", - "@sentCallInformations": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "setCustomEmotes": "Ställ in anpassade dekaler", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Ställ in inbjudningslänk", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Ställ in behörighetsnivå", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "setStatus": "Ställ in status", - "@setStatus": { - "type": "String", - "placeholders": {} - }, - "settings": "Inställningar", - "@settings": { - "type": "String", - "placeholders": {} - }, - "share": "Dela", - "@share": { - "type": "String", - "placeholders": {} - }, - "sharedTheLocation": "{username} delade sin position", - "@sharedTheLocation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "skip": "Hoppa över", - "@skip": { - "type": "String", - "placeholders": {} - }, - "sourceCode": "Källkod", - "@sourceCode": { - "type": "String", - "placeholders": {} - }, - "startedACall": "{senderName} startade ett samtal", - "@startedACall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "status": "Status", - "@status": { - "type": "String", - "placeholders": {} - }, - "statusExampleMessage": "Hur mår du i dag?", - "@statusExampleMessage": { - "type": "String", - "placeholders": {} - }, - "submit": "Skicka in", - "@submit": { - "type": "String", - "placeholders": {} - }, - "systemTheme": "System", - "@systemTheme": { - "type": "String", - "placeholders": {} - }, - "theyDontMatch": "Dom Matchar Inte", - "@theyDontMatch": { - "type": "String", - "placeholders": {} - }, - "theyMatch": "Dom Matchar", - "@theyMatch": { - "type": "String", - "placeholders": {} - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "String", - "placeholders": {} - }, - "toggleFavorite": "Växla favorit", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Växla tystad", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Markera läst/oläst", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "tooManyRequestsWarning": "För många förfrågningar. Vänligen försök senare!", - "@tooManyRequestsWarning": { - "type": "String", - "placeholders": {} - }, - "tryToSendAgain": "Försök att skicka igen", - "@tryToSendAgain": { - "type": "String", - "placeholders": {} - }, - "unavailable": "Upptagen", - "@unavailable": { - "type": "String", - "placeholders": {} - }, - "unbannedUser": "{username} avbannade {targetName}", - "@unbannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "unblockDevice": "Avblockera enhet", - "@unblockDevice": { - "type": "String", - "placeholders": {} - }, - "unknownDevice": "Okänd enhet", - "@unknownDevice": { - "type": "String", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Okänd krypteringsalgoritm", - "@unknownEncryptionAlgorithm": { - "type": "String", - "placeholders": {} - }, - "unknownEvent": "Okänd händelse '{type}'", - "@unknownEvent": { - "type": "String", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "unmuteChat": "Slå på ljudet för chatten", - "@unmuteChat": { - "type": "String", - "placeholders": {} - }, - "unpin": "Avnåla", - "@unpin": { - "type": "String", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{en oläst chatt} other{{unreadCount} olästa chattar}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, - "userAndOthersAreTyping": "{username} och {count} andra skriver…", - "@userAndOthersAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "userAndUserAreTyping": "{username} och {username2} skriver…", - "@userAndUserAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "username2": { - "type": "String" - } - } - }, - "userIsTyping": "{username} skriver…", - "@userIsTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "userLeftTheChat": "🚪 {username} lämnade chatten", - "@userLeftTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "username": "Användarnamn", - "@username": { - "type": "String", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} skickade en {type} händelse", - "@userSentUnknownEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "type": { - "type": "String" - } - } - }, - "verify": "Verifiera", - "@verify": { - "type": "String", - "placeholders": {} - }, - "verifyStart": "Starta verifiering", - "@verifyStart": { - "type": "String", - "placeholders": {} - }, - "verifySuccess": "Du har lyckats verifiera!", - "@verifySuccess": { - "type": "String", - "placeholders": {} - }, - "verifyTitle": "Verifiera andra konton", - "@verifyTitle": { - "type": "String", - "placeholders": {} - }, - "videoCall": "Videosamtal", - "@videoCall": { - "type": "String", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Chatt-historikens synlighet", - "@visibilityOfTheChatHistory": { - "type": "String", - "placeholders": {} - }, - "visibleForAllParticipants": "Synlig för alla deltagare", - "@visibleForAllParticipants": { - "type": "String", - "placeholders": {} - }, - "visibleForEveryone": "Synlig för alla", - "@visibleForEveryone": { - "type": "String", - "placeholders": {} - }, - "voiceMessage": "Röstmeddelande", - "@voiceMessage": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Väntar på att deltagaren accepterar begäran…", - "@waitingPartnerAcceptRequest": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerEmoji": "Väntar på att deltagaren accepterar emojien…", - "@waitingPartnerEmoji": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerNumbers": "Väntar på att deltagaren accepterar nummer…", - "@waitingPartnerNumbers": { - "type": "String", - "placeholders": {} - }, - "wallpaper": "Bakgrund:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, - "warning": "Varning!", - "@warning": { - "type": "String", - "placeholders": {} - }, - "weSentYouAnEmail": "Vi skickade dig ett e-postmeddelande", - "@weSentYouAnEmail": { - "type": "String", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Vem kan utföra vilken åtgärd", - "@whoCanPerformWhichAction": { - "type": "String", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Vilka som är tilllåtna att ansluta till denna grupp", - "@whoIsAllowedToJoinThisGroup": { - "type": "String", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Varför vill du rapportera detta?", - "@whyDoYouWantToReportThis": { - "type": "String", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Med dessa addresser kan du återställa ditt lösenord.", - "@withTheseAddressesRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "writeAMessage": "Skriv ett meddelande…", - "@writeAMessage": { - "type": "String", - "placeholders": {} - }, - "yes": "Ja", - "@yes": { - "type": "String", - "placeholders": {} - }, - "you": "Du", - "@you": { - "type": "String", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Du deltar inte längre i denna chatt", - "@youAreNoLongerParticipatingInThisChat": { - "type": "String", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "Du har blivit bannad från denna chatt", - "@youHaveBeenBannedFromThisChat": { - "type": "String", - "placeholders": {} - }, - "yourPublicKey": "Din publika nyckel", - "@yourPublicKey": { - "type": "String", - "placeholders": {} - }, - "commandHint_html": "Skicka HTML-formatted text", - "@commandHint_html": { - "type": "String", - "description": "Usage hint for the command /html" - }, - "commandHint_ban": "Bannlys användaren från detta rum", - "@commandHint_ban": { - "type": "String", - "description": "Usage hint for the command /ban" - }, - "clearArchive": "Rensa arkiv", - "@clearArchive": {}, - "chats": "Chatter", - "@chats": { - "type": "String", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chatt har lagts till i detta utrymme", - "@chatHasBeenAddedToThisSpace": {}, - "chatBackup": "Chatt backup", - "@chatBackup": { - "type": "String", - "placeholders": {} - }, - "changeYourAvatar": "Ändra din avatar", - "@changeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "cantOpenUri": "Kan inte öppna URL {uri}", - "@cantOpenUri": { - "type": "String", - "placeholders": { - "uri": { - "type": "String" - } - } - }, - "blocked": "Blockerad", - "@blocked": { - "type": "String", - "placeholders": {} - }, - "badServerLoginTypesException": "Hemma servern stödjer följande inloggnings typer :\n {serverVersions}\nMen denna applikation stödjer enbart:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "autoplayImages": "Automatisk spela upp animerade klistermärken och emoji", - "@autoplayImages": { - "type": "String", - "placeholder": {} - }, - "allChats": "Alla chattar", - "@allChats": { - "type": "String", - "placeholders": {} - }, - "addToSpace": "Lägg till i utrymme", - "@addToSpace": {}, - "addEmail": "Lägg till e-post", - "@addEmail": { - "type": "String", - "placeholders": {} - }, - "commandHint_myroomavatar": "Sätt din bild för detta rum (by mxc-uri)", - "@commandHint_myroomavatar": { - "type": "String", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_me": "Beskriv dig själv", - "@commandHint_me": { - "type": "String", - "description": "Usage hint for the command /me" - }, - "commandHint_leave": "Lämna detta rum", - "@commandHint_leave": { - "type": "String", - "description": "Usage hint for the command /leave" - }, - "commandHint_kick": "Ta bort användare från detta rum", - "@commandHint_kick": { - "type": "String", - "description": "Usage hint for the command /kick" - }, - "commandHint_join": "Gå med i rum", - "@commandHint_join": { - "type": "String", - "description": "Usage hint for the command /join" - }, - "commandHint_invite": "Bjud in användaren till detta rum", - "@commandHint_invite": { - "type": "String", - "description": "Usage hint for the command /invite" - }, - "locationPermissionDeniedNotice": "Plats åtkomst nekad. Var god godkän detta för att kunna dela din plats.", - "@locationPermissionDeniedNotice": { - "type": "String", - "placeholders": {} - }, - "locationDisabledNotice": "Platstjänster är inaktiverade. Var god aktivera dom för att kunna dela din plats.", - "@locationDisabledNotice": { - "type": "String", - "placeholders": {} - }, - "goToTheNewRoom": "Gå till det nya rummet", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, - "fontSize": "Textstorlek", - "@fontSize": { - "type": "String", - "placeholders": {} - }, - "everythingReady": "Allt är klart!", - "@everythingReady": { - "type": "String", - "placeholders": {} - }, - "errorObtainingLocation": "Fel vid erhållande av plats: {error}", - "@errorObtainingLocation": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "editRoomAliases": "Redigera rum alias", - "@editRoomAliases": { - "type": "String", - "placeholders": {} - }, - "createNewSpace": "Nytt utrymme", - "@createNewSpace": { - "type": "String", - "placeholders": {} - }, - "copyToClipboard": "Kopiera till urklipp", - "@copyToClipboard": { - "type": "String", - "placeholders": {} - }, - "commandMissing": "{command} är inte ett kommando.", - "@commandMissing": { - "type": "String", - "placeholders": { - "command": { - "type": "String" - } + "@@last_modified": "2021-08-14 12:41:09.835634", + "about": "Om", + "@about": { + "type": "String", + "placeholders": {} }, - "description": "State that {command} is not a valid /command." - }, - "commandInvalid": "Felaktigt kommando", - "@commandInvalid": { - "type": "String" - }, - "commandHint_unban": "Tillåt användare i rummet", - "@commandHint_unban": { - "type": "String", - "description": "Usage hint for the command /unban" - }, - "commandHint_send": "Skicka text", - "@commandHint_send": { - "type": "String", - "description": "Usage hint for the command /send" - }, - "commandHint_react": "Skicka svar som reaktion", - "@commandHint_react": { - "type": "String", - "description": "Usage hint for the command /react" - }, - "commandHint_plain": "Skicka oformaterad text", - "@commandHint_plain": { - "type": "String", - "description": "Usage hint for the command /plain" - }, - "commandHint_op": "Sätt användarens kraft nivå ( standard: 50)", - "@commandHint_op": { - "type": "String", - "description": "Usage hint for the command /op" - }, - "commandHint_myroomnick": "Sätt ditt användarnamn för rummet", - "@commandHint_myroomnick": { - "type": "String", - "description": "Usage hint for the command /myroomnick" - }, - "noEncryptionForPublicRooms": "Du kan endast aktivera kryptering när rummet inte längre är publikt tillgängligt.", - "@noEncryptionForPublicRooms": { - "type": "String", - "placeholders": {} - }, - "noMatrixServer": "{server1} är inte en matrix server, använd {server2} istället?", - "@noMatrixServer": { - "type": "String", - "placeholders": { - "server1": { + "accept": "Acceptera", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} accepterade inbjudan", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktiverade ändpunktskryptering", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "Alla", + "@all": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} besvarade samtalet", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Vem som helst kan gå med", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "App-lås", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arkiv", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Får gästanvändare gå med", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Är du säker?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Är du säker på att du vill logga ut?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "För att kunna signera den andra personen, vänligen ange din lösenfras eller återställningsnyckel för säker lagring.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Acceptera denna verifikationsförfrågan från {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "badServerVersionsException": "Hemservern stöjder Spec-versionen:\n{serverVersions}\nMen denna app stödjer enbart {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "banFromChat": "Bannlys från chatt", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Bannlyst", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} bannlös {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Blockera Enhet", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bot meddelanden", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Avbryt", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "Ändra enhetsnamn", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ändrade sin chatt-avatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} ändrade chatt-beskrivningen till: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} ändrade sitt chatt-namn till: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ändrade chatt-rättigheterna", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} ändrade visningsnamnet till: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ändrade reglerna för gästaccess", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ändrade reglerna för gästaccess till: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ändrade historikens synlighet", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ändrade historikens synlighet till: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ändrade anslutningsreglerna", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ändrade anslutningsreglerna till {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ändrade sin avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ändrade rummets alias", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ändrade inbjudningslänken", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Ändra lösenord", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Ändra hemserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Ändra din stil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Ändra namn på gruppen", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "Krypteringen har blivit korrupt", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chatt", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chatt-detaljer", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Välj ett starkt lösenord", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Stäng", + "@close": { + "type": "String", + "placeholders": {} + }, + "compareEmojiMatch": "Vänligen jämför uttryckssymbolerna", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Vänligen jämför siffrorna", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Konfigurera chatt", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Bekräfta", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Anslut", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Kontakten har blivit inbjuden till gruppen", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Innehåller visningsnamn", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Innehåller användarnamn", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Innehållet har rapporterats till server-admins", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Kopierat till urklipp", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Kopiera", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Kunde ej avkoda meddelande: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} deltagare", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Skapa", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} skapade chatten", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "För närvarande aktiv", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Mörkt", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Detta kommer att avaktivera ditt konto. Det här går inte att ångra! Är du säker?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Standard behörighetsnivå", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Radera", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Ta bort konto", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Ta bort meddelande", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Enhet", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Enhets-ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Enheter", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direkt chatt", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Visningsnamn har ändrats", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Ladda ner fil", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Ändra", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "redigera blockerade servrar", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Ändra visningsnamn", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "redigera rumsavatar", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Dekalen existerar redan!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Ogiltig dekal-kod!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Dekalpaket för rummet", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote inställningar", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Dekal kod", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Du måste välja en dekal-kod och en bild!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Tom chatt", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Aktivera dekal-paket globalt", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Aktivera kryptering", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "Du kommer inte ha fortsatt möjlighet till att inaktivera krypteringen. Är du säker?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Krypterad", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Kryptering", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Kryptering är ej aktiverad", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} avslutade samtalet", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Ange en e-postaddress", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Ange din hemserver", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremt stötande", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "Filnamn", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Framåt", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Från att gå med", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Från inbjudan", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grupp", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "Gruppen är publik", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Grupper", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Gruppen med {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Gäster är förbjudna", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Gäster kan ansluta", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} har tagit tillbaka inbjudan för {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Hjälp", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Göm redigerade händelser", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Göm okända händelser", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "howOffensiveIsThisContent": "Hur stötande är detta innehåll?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitet", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignorera", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Ignorera användare", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Jag har klickat på länken", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Felaktig lösenordsfras eller åsterställningsnyckel", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Oförargligt", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Bjud in kontakt", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Bjud in kontakt till {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Inbjuden", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} bjöd in {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Endast inbjudna användare", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Inbjudning till mig", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} bjöd in dig till FluffyChat.\n1. Besök fluffychat.im och installera appen\n2. Registrera dig eller logga in\n3. Öppna inbjudningslänk:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "skriver…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} anslöt till chatten", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Anslut till rum", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} sparkade ut {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} sparkade och bannade {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Sparka från chatt", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Senast aktiv: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Lämna", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Lämnade chatten", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Licens", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Ljust", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Ladda {count} mer deltagare", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "Laddar... Var god vänta.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Ladda mer…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "login": "Logga in", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Logga in till {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logga ut", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Medlemsändringar", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Nämn", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Meddelanden", + "@messages": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Tysta chatt", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Var medveten om att du behöver Pantalaimon för att använda ändpunktskryptering tillsvidare.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Ny chatt", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Nya meddelanden i FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Ny verifikationsbegäran!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Nästa", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Nej", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ingen anslutning till servern", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Hittade inga dekaler. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "De ser ut som att du inte har google-tjänster på din telefon. Det är ett bra beslut för din integritet! För att få aviseringar i FluffyChat rekommenderar vi att använda https://microg.org/ eller https://unifiedpush.org/ .", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Ingen", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Du har inte lagt till något sätt för att återställa ditt lösenord än.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ingen behörighet", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Hittade inga rum…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Aviseringar", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Aviseringar är påslaget för detta konto", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} användare skriver…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "Stötande", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "OK", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online Nyckel-backup är aktiverad", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Hoppsan, något gick fel…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Öppna app för att lästa meddelanden", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Öppna kamera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "participant": "Deltagare", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "lösenord eller återställningsnyckel", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Lösenord", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Glömt lösenord", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Lösenordet har ändrats", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Återställ lösenord", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Välj en bild", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Nåla fast", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Spela {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChooseAPasscode": "Ange ett lösenord", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Klicka på länken i e-postmeddelandet för att sedan fortsätta.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Ange 4 siffror eller lämna tom för att inaktivera app-lås.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Ange ditt lösenord", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Ange ditt användarnamn", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Följ instruktionerna på hemsidan och tryck på nästa.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Integritet", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Publika Rum", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regler", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Anledning", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Spelar in", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} redigerade en händelse", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Redigera meddelande", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "reject": "Avböj", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} avböjde inbjudan", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Återanslut", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Ta bort", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Ta bort alla andra enheter", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Bortagen av {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Ta bort enhet", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Ta bort chatt-blockering", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Ersätt rum med nyare version", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Svara", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Rapportera meddelande", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Begär behörighet", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Rummet har blivit uppgraderat", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "search": "Sök", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Säkerhet", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Sedd av {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Skicka", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Skicka ett meddelande", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAudio": "Skicka ljud", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Skicka fil", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Skicka bild", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Skickade meddelanden", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Skicka orginal", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Skicka video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} skickade en fil", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} skickade ett ljudklipp", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} skickade en bild", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} skickade ett klistermärke", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} skickade en video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} skickade samtalsinformation", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setCustomEmotes": "Ställ in anpassade dekaler", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setInvitationLink": "Ställ in inbjudningslänk", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Ställ in behörighetsnivå", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Ställ in status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Inställningar", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Dela", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} delade sin position", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "skip": "Hoppa över", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Källkod", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} startade ett samtal", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Hur mår du i dag?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Skicka in", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Dom Matchar Inte", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Dom Matchar", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Växla favorit", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Växla tystad", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Markera läst/oläst", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "För många förfrågningar. Vänligen försök senare!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Försök att skicka igen", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Upptagen", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} avbannade {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Avblockera enhet", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Okänd enhet", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Okänd krypteringsalgoritm", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Okänd händelse '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Slå på ljudet för chatten", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Avnåla", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{en oläst chatt} other{{unreadCount} olästa chattar}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} och {count} andra skriver…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} och {username2} skriver…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} skriver…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} lämnade chatten", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Användarnamn", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} skickade en {type} händelse", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "Verifiera", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Starta verifiering", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Du har lyckats verifiera!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifiera andra konton", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videosamtal", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Chatt-historikens synlighet", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Synlig för alla deltagare", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Synlig för alla", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Röstmeddelande", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Väntar på att deltagaren accepterar begäran…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Väntar på att deltagaren accepterar emojien…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Väntar på att deltagaren accepterar nummer…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Bakgrund:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Varning!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Vi skickade dig ett e-postmeddelande", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Vem kan utföra vilken åtgärd", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Vilka som är tilllåtna att ansluta till denna grupp", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Varför vill du rapportera detta?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Med dessa addresser kan du återställa ditt lösenord.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Skriv ett meddelande…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ja", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Du", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Du deltar inte längre i denna chatt", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Du har blivit bannad från denna chatt", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Din publika nyckel", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Skicka HTML-formatted text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_ban": "Bannlys användaren från detta rum", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "clearArchive": "Rensa arkiv", + "chats": "Chatter", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Chatt har lagts till i detta utrymme", + "chatBackup": "Chatt backup", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Ändra din avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Kan inte öppna URL {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "blocked": "Blockerad", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "Hemma servern stödjer följande inloggnings typer :\n {serverVersions}\nMen denna applikation stödjer enbart:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "autoplayImages": "Automatisk spela upp animerade klistermärken och emoji", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "allChats": "Alla chattar", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Lägg till i utrymme", + "addEmail": "Lägg till e-post", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandHint_myroomavatar": "Sätt din bild för detta rum (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_me": "Beskriv dig själv", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_leave": "Lämna detta rum", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_kick": "Ta bort användare från detta rum", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_join": "Gå med i rum", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_invite": "Bjud in användaren till detta rum", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "locationPermissionDeniedNotice": "Plats åtkomst nekad. Var god godkän detta för att kunna dela din plats.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Platstjänster är inaktiverade. Var god aktivera dom för att kunna dela din plats.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Gå till det nya rummet", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Textstorlek", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Allt är klart!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Fel vid erhållande av plats: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "editRoomAliases": "Redigera rum alias", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Nytt utrymme", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Kopiera till urklipp", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "commandMissing": "{command} är inte ett kommando.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "commandInvalid": "Felaktigt kommando", + "@commandInvalid": { "type": "String" - }, - "server2": { + }, + "commandHint_unban": "Tillåt användare i rummet", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandHint_send": "Skicka text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_react": "Skicka svar som reaktion", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_plain": "Skicka oformaterad text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_op": "Sätt användarens kraft nivå ( standard: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_myroomnick": "Sätt ditt användarnamn för rummet", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "noEncryptionForPublicRooms": "Du kan endast aktivera kryptering när rummet inte längre är publikt tillgängligt.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} är inte en matrix server, använd {server2} istället?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "obtainingLocation": "Erhåller plats…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Var god välj", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "people": "Människor", + "@people": { + "type": "String", + "placeholders": {} + }, + "or": "Eller", + "@or": { + "type": "String", + "placeholders": {} + }, + "openInMaps": "Öppna i karta", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oj! Tyvärr gick inte aviseringar att slå på.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synkroniserar… Var god vänta.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Utrymmes namn", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Utrymme är publikt", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Visa lösenord", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Dela plats", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Sätt som primärt alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Skicka klistermärke", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Skicka som text", + "@sendAsText": { "type": "String" - } - } - }, - "obtainingLocation": "Erhåller plats…", - "@obtainingLocation": { - "type": "String", - "placeholders": {} - }, - "pleaseChoose": "Var god välj", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, - "people": "Människor", - "@people": { - "type": "String", - "placeholders": {} - }, - "or": "Eller", - "@or": { - "type": "String", - "placeholders": {} - }, - "openInMaps": "Öppna i karta", - "@openInMaps": { - "type": "String", - "placeholders": {} - }, - "oopsPushError": "Oj! Tyvärr gick inte aviseringar att slå på.", - "@oopsPushError": { - "type": "String", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synkroniserar… Var god vänta.", - "@synchronizingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "spaceName": "Utrymmes namn", - "@spaceName": { - "type": "String", - "placeholders": {} - }, - "spaceIsPublic": "Utrymme är publikt", - "@spaceIsPublic": { - "type": "String", - "placeholders": {} - }, - "showPassword": "Visa lösenord", - "@showPassword": { - "type": "String", - "placeholders": {} - }, - "shareLocation": "Dela plats", - "@shareLocation": { - "type": "String", - "placeholders": {} - }, - "setAsCanonicalAlias": "Sätt som primärt alias", - "@setAsCanonicalAlias": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Skicka klistermärke", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "sendAsText": "Skicka som text", - "@sendAsText": { - "type": "String" - }, - "saveFile": "Spara fil", - "@saveFile": { - "type": "String", - "placeholders": {} - }, - "roomVersion": "Rum version", - "@roomVersion": { - "type": "String", - "placeholders": {} - }, - "removeYourAvatar": "Ta bort din avatar", - "@removeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "register": "Registrera", - "@register": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourPin": "Ange din pin-kod", - "@pleaseEnterYourPin": { - "type": "String", - "placeholders": {} - }, - "wipeChatBackup": "Radera din chatt-backup för att skapa en ny återställningsnyckel?", - "@wipeChatBackup": { - "type": "String", - "placeholders": {} - }, - "verified": "Verifierad", - "@verified": { - "type": "String", - "placeholders": {} - }, - "transferFromAnotherDevice": "Överför till annan enhet", - "@transferFromAnotherDevice": { - "type": "String", - "placeholders": {} - }, - "chatBackupDescription": "Din chatt backup är skyddad av en säkerhetsnyckel. Se till att du inte förlorar den.", - "@chatBackupDescription": { - "type": "String", - "placeholders": {} - }, - "commandHint_create": "Skapa en tom grupp-chatt\nAnvänd --no-encryption för att inaktivera kryptering", - "@commandHint_create": { - "type": "String", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Kasta bort sessionen", - "@commandHint_discardsession": { - "type": "String", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Starta en direkt-chatt\nAnvänd --no-encryption för att inaktivera kryptering", - "@commandHint_dm": { - "type": "String", - "description": "Usage hint for the command /dm" - }, - "homeserver": "Hemserver", - "@homeserver": {}, - "oneClientLoggedOut": "En av dina klienter har loggats ut", - "@oneClientLoggedOut": {}, - "addAccount": "Lägg till konto", - "@addAccount": {}, - "editBundlesForAccount": "Lägg till paket för detta konto", - "@editBundlesForAccount": {}, - "addToBundle": "Utöka paket", - "@addToBundle": {}, - "bundleName": "Paketnamn", - "@bundleName": {}, - "serverRequiresEmail": "Servern behöver validera din e-postadress för registrering.", - "@serverRequiresEmail": {}, - "singlesignon": "Single Sign On", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "unverified": "Ej verifierad", - "@unverified": {}, - "messageInfo": "Meddelandeinformation", - "@messageInfo": {}, - "messageType": "Meddelandetyp", - "@messageType": {}, - "time": "Tid", - "@time": {}, - "sender": "Avsändare", - "@sender": {}, - "removeFromSpace": "Ta bort från utrymme", - "@removeFromSpace": {}, - "addToSpaceDescription": "Välj ett utrymme som chatten skall läggas till i.", - "@addToSpaceDescription": {}, - "start": "Starta", - "@start": {}, - "openGallery": "Öppna galleri", - "@openGallery": {}, - "repeatPassword": "Upprepa lösenord", - "@repeatPassword": {}, - "markAsRead": "Markera som läst", - "@markAsRead": {}, - "commandHint_clearcache": "Rensa cache", - "@commandHint_clearcache": { - "type": "String", - "description": "Usage hint for the command /clearcache" - }, - "openVideoCamera": "Aktivera kamera för video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "link": "Länk", - "@link": {}, - "publish": "Publicera", - "@publish": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "reportUser": "Rapportera användare", - "@reportUser": {}, - "openChat": "Öppna Chatt", - "@openChat": {}, - "sendOnEnter": "Skicka med Enter", - "@sendOnEnter": {}, - "scanQrCode": "Skanna QR-kod", - "@scanQrCode": {}, - "yourChatBackupHasBeenSetUp": "Din chatt-backup har konfigurerats.", - "@yourChatBackupHasBeenSetUp": {}, - "removeFromBundle": "Ta bort från paket", - "@removeFromBundle": {}, - "enableMultiAccounts": "(BETA) Aktivera multi-konton på denna enhet", - "@enableMultiAccounts": {}, - "emojis": "Uttryckssymboler", - "@emojis": {}, - "placeCall": "Ring", - "@placeCall": {}, - "voiceCall": "Röstsamtal", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Inget stöd för denna version av Android", - "@unsupportedAndroidVersion": {}, - "videoCallsBetaWarning": "Videosamtal är för närvarande under testning. De kanske inte fungerar som det är tänkt eller på alla plattformar.", - "@videoCallsBetaWarning": {}, - "unsupportedAndroidVersionLong": "Denna funktion kräver en senare version av Android.", - "@unsupportedAndroidVersionLong": {}, - "dismiss": "Avfärda", - "@dismiss": {}, - "reactedWith": "{sender} reagerade med {reaction}", - "@reactedWith": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - }, - "reaction": { - "type": "String" - } - } - }, - "pinMessage": "Fäst i rum", - "@pinMessage": {}, - "confirmEventUnpin": "Är du säker på att händelsen inte längre skall vara fastnålad?", - "@confirmEventUnpin": {}, - "experimentalVideoCalls": "Experimentella videosamtal", - "@experimentalVideoCalls": {}, - "switchToAccount": "Byt till konto {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Nästa konto", - "@nextAccount": {}, - "previousAccount": "Föregående konto", - "@previousAccount": {}, - "emailOrUsername": "Användarnamn eller e-postadress", - "@emailOrUsername": {}, - "addWidget": "Lägg till widget", - "@addWidget": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetEtherpad": "Anteckning", - "@widgetEtherpad": {}, - "widgetCustom": "Anpassad", - "@widgetCustom": {}, - "widgetName": "Namn", - "@widgetName": {}, - "widgetUrlError": "Detta är inte en giltig URL.", - "@widgetUrlError": {}, - "errorAddingWidget": "Ett fel uppstod när widgeten skulle läggas till.", - "@errorAddingWidget": {}, - "widgetJitsi": "Jitsi-möte", - "@widgetJitsi": {}, - "widgetNameError": "Vänligen ange ett visningsnamn.", - "@widgetNameError": {}, - "storeSecurlyOnThisDevice": "Lagra säkert på denna enhet", - "@storeSecurlyOnThisDevice": {}, - "youJoinedTheChat": "Du gick med i chatten", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "👍 Du accepterade inbjudan", - "@youAcceptedTheInvitation": {}, - "youKicked": "👞 Du sparkade ut {user}", - "@youKicked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "hugContent": "{senderName} kramar dig", - "@hugContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "commandHint_markasgroup": "Märk som grupp", - "@commandHint_markasgroup": {}, - "recoveryKeyLost": "Borttappad återställningsnyckel?", - "@recoveryKeyLost": {}, - "indexedDbErrorTitle": "Problem med privat läge", - "@indexedDbErrorTitle": {}, - "youHaveWithdrawnTheInvitationFor": "Du har återkallat inbjudan till {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youUnbannedUser": "Du återkallade förbudet för {user}", - "@youUnbannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "unlockOldMessages": "Lås upp äldre meddelanden", - "@unlockOldMessages": {}, - "newSpace": "Nytt utrymme", - "@newSpace": {}, - "googlyEyesContent": "{senderName} skickar dig googly ögon", - "@googlyEyesContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "dehydrate": "Exportera sessionen och rensa enheten", - "@dehydrate": {}, - "dehydrateWarning": "Denna åtgärd kan inte ångras. Försäkra dig om att backupen är i säkert förvar.", - "@dehydrateWarning": {}, - "dehydrateTor": "TOR-användare: Exportera session", - "@dehydrateTor": {}, - "hydrateTor": "TOR-användare: Importera session från tidigare export", - "@hydrateTor": {}, - "hydrateTorLong": "Exporterade du sessionen när du senast använde TOR? Importera den enkelt och fortsätt chatta.", - "@hydrateTorLong": {}, - "recoveryKey": "Återställningsnyckel", - "@recoveryKey": {}, - "separateChatTypes": "Separata direktchattar och grupper", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "startFirstChat": "Starta din första chatt", - "@startFirstChat": {}, - "pleaseEnterRecoveryKeyDescription": "Ange din återställningsnyckel från en tidigare session för att låsa upp äldre meddelanden. Din återställningsnyckel är INTE ditt lösenord.", - "@pleaseEnterRecoveryKeyDescription": {}, - "encryptThisChat": "Kryptera denna chatt", - "@encryptThisChat": {}, - "dehydrateTorLong": "TOR-användare rekommenderas att exportera sessionen innan fönstret stängs.", - "@dehydrateTorLong": {}, - "noBackupWarning": "Varning! Om du inte aktiverar säkerhetskopiering av chattar så tappar du åtkomst till krypterade meddelanden. Det är rekommenderat att du aktiverar säkerhetskopiering innan du loggar ut.", - "@noBackupWarning": {}, - "noOtherDevicesFound": "Inga andra enheter hittades", - "@noOtherDevicesFound": {}, - "disableEncryptionWarning": "Av säkerhetsskäl kan du inte stänga av kryptering i en chatt där det tidigare aktiverats.", - "@disableEncryptionWarning": {}, - "sorryThatsNotPossible": "Det där är inte möjligt", - "@sorryThatsNotPossible": {}, - "confirmMatrixId": "Bekräfta ditt Matrix-ID för att radera ditt konto.", - "@confirmMatrixId": {}, - "supposedMxid": "Detta bör vara {mxid}", - "@supposedMxid": { - "type": "String", - "placeholders": { - "mxid": { - "type": "String" - } - } - }, - "pleaseEnterRecoveryKey": "Ange din återställningsnyckel:", - "@pleaseEnterRecoveryKey": {}, - "commandHint_markasdm": "Märk som rum för direktmeddelanden för det givante Matrix ID", - "@commandHint_markasdm": {}, - "user": "Användare", - "@user": {}, - "indexedDbErrorLong": "Meddelandelagring är tyvärr inte aktiverat i privat läge som standard.\nGå till\n - about:config\n - sätt dom.indexedDB.privateBrowsing.enabled till true\nAnnars går det inte att använda FluffyChat.", - "@indexedDbErrorLong": {}, - "storeInSecureStorageDescription": "Lagra återställningsnyckeln på säker plats på denna enhet.", - "@storeInSecureStorageDescription": {}, - "storeInAppleKeyChain": "Lagra i Apples nyckelkedja (KeyChain)", - "@storeInAppleKeyChain": {}, - "foregroundServiceRunning": "Denna avisering visas när förgrundstjänsten körs.", - "@foregroundServiceRunning": {}, - "custom": "Anpassad", - "@custom": {}, - "countFiles": "{count} filer", - "@countFiles": { - "placeholders": { - "count": { - "type": "int" - } - } - }, - "screenSharingTitle": "skärmdelning", - "@screenSharingTitle": {}, - "noKeyForThisMessage": "Detta kan hända om meddelandet skickades innan du loggade in på ditt konto i den här enheten.\n\nDet kan också vara så att avsändaren har blockerat din enhet eller att något gick fel med internetanslutningen.\n\nKan du läsa meddelandet i en annan session? I sådana fall kan du överföra meddelandet från den sessionen! Gå till Inställningar > Enhet och säkerställ att dina enheter har verifierat varandra. När du öppnar rummet nästa gång och båda sessionerna är i förgrunden, så kommer nycklarna att överföras automatiskt.\n\nVill du inte förlora nycklarna vid utloggning eller när du byter enhet? Säkerställ att du har aktiverat säkerhetskopiering för chatten i inställningarna.", - "@noKeyForThisMessage": {}, - "fileIsTooBigForServer": "Servern informerar om att filen är för stor för att skickas.", - "@fileIsTooBigForServer": {}, - "deviceKeys": "Enhetsnycklar:", - "@deviceKeys": {}, - "enterSpace": "Gå till utrymme", - "@enterSpace": {}, - "commandHint_googly": "Skicka några googly ögon", - "@commandHint_googly": {}, - "commandHint_cuddle": "Skicka en omfamning", - "@commandHint_cuddle": {}, - "commandHint_hug": "Skicka en kram", - "@commandHint_hug": {}, - "users": "Användare", - "@users": {}, - "cuddleContent": "{senderName} omfamnar dig", - "@cuddleContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "hydrate": "Återställ från säkerhetskopia", - "@hydrate": {}, - "screenSharingDetail": "Du delar din skärm i FluffyChat", - "@screenSharingDetail": {}, - "youRejectedTheInvitation": "Du avvisade inbjudan", - "@youRejectedTheInvitation": {}, - "youBannedUser": "Du förbjöd {user}", - "@youBannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youInvitedBy": "📩 Du har blivit inbjuden av {user}", - "@youInvitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youInvitedUser": "📩 Du bjöd in {user}", - "@youInvitedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youKickedAndBanned": "🙅 Du sparkade ut och förbjöd {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "saveKeyManuallyDescription": "Spara nyckeln manuellt genom att aktivera dela-funktionen eller urklippshanteraren på enheten.", - "@saveKeyManuallyDescription": {}, - "storeInAndroidKeystore": "Lagra i Androids nyckellagring (KeyStore)", - "@storeInAndroidKeystore": {}, - "callingPermissions": "Samtalsbehörighet", - "@callingPermissions": {}, - "callingAccount": "Samtalskonto", - "@callingAccount": {}, - "callingAccountDetails": "Tillåt FluffyChat att använda Androids ring-app.", - "@callingAccountDetails": {}, - "appearOnTop": "Visa ovanpå", - "@appearOnTop": {}, - "appearOnTopDetails": "Tillåt att appen visas ovanpå (behövs inte om du redan har FluffyChat konfigurerat som ett samtalskonto)", - "@appearOnTopDetails": {}, - "otherCallingPermissions": "Mikrofon, kamera och andra behörigheter för FluffyChat", - "@otherCallingPermissions": {}, - "whyIsThisMessageEncrypted": "Varför kan inte detta meddelande läsas?", - "@whyIsThisMessageEncrypted": {}, - "newGroup": "Ny grupp", - "@newGroup": {}, - "enterRoom": "Gå till rummet", - "@enterRoom": {}, - "allSpaces": "Alla utrymmen", - "@allSpaces": {}, - "numChats": "{number} chattar", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Göm oviktiga tillståndshändelser", - "@hideUnimportantStateEvents": {}, - "doNotShowAgain": "Visa inte igen", - "@doNotShowAgain": {}, - "wasDirectChatDisplayName": "Tom chatt (var {oldDisplayName})", - "@wasDirectChatDisplayName": { - "type": "String", - "placeholders": { - "oldDisplayName": { - "type": "String" - } - } - }, - "newSpaceDescription": "Utrymmen möjliggör konsolidering av chattar och att bygga privata eller offentliga gemenskaper.", - "@newSpaceDescription": {}, - "reopenChat": "Återöppna chatt", - "@reopenChat": {}, - "jumpToLastReadMessage": "Hoppa till det senast lästa meddelandet", - "@jumpToLastReadMessage": {}, - "readUpToHere": "Läs upp till hit", - "@readUpToHere": {}, - "fileHasBeenSavedAt": "Filen har sparats i {path}", - "@fileHasBeenSavedAt": { - "type": "String", - "placeholders": { - "path": { - "type": "String" - } - } - }, - "allRooms": "Alla gruppchattar", - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "reportErrorDescription": "😭 Åh nej. Något gick fel. Om du vill ian du rapportera denna bugg till utvecklarna.", - "@reportErrorDescription": {}, - "setColorTheme": "Välj färgtema:", - "@setColorTheme": {}, - "banUserDescription": "Användaren kommer bannlysas från chatten och kommer inte kunna gå med i chatten igen tills bannlysningen avslutas.", - "@banUserDescription": {}, - "removeDevicesDescription": "Du kommer att bli utloggad från den här enheten och kommer inte längre kunna få meddelanden.", - "@removeDevicesDescription": {}, - "tryAgain": "Försök igen", - "@tryAgain": {}, - "unbanUserDescription": "Användaren kommer kunna gå med i chatten igen om den försöker.", - "@unbanUserDescription": {}, - "messagesStyle": "Meddelanden:", - "@messagesStyle": {}, - "chatDescription": "Chattbeskrivning", - "@chatDescription": {}, - "pushNotificationsNotAvailable": "Aviseringar är inte tillgängligt", - "@pushNotificationsNotAvailable": {}, - "invalidServerName": "Ogiltigt servernamn", - "@invalidServerName": {}, - "chatPermissions": "Chatt-behörigheter", - "@chatPermissions": {}, - "signInWithPassword": "Logga in med lösenord", - "@signInWithPassword": {}, - "makeAdminDescription": "När du gör denna användare till administratör kommer du inte kunna ångra det eftersom de kommer ha samma behörigheter som du.", - "@makeAdminDescription": {}, - "setChatDescription": "Ändra chattens beskrivning", - "@setChatDescription": {}, - "importFromZipFile": "Importera från .zip-fil", - "@importFromZipFile": {}, - "redactedBy": "Borttaget av {username}", - "@redactedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "signInWith": "Logga in med {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "optionalRedactReason": "(Frivilligt) Anledning till att ta bort det här meddelandet…", - "@optionalRedactReason": {}, - "archiveRoomDescription": "Den här chatten kommer flyttas till arkivet. Andra användare kommer kunna se att du har lämnat chatten.", - "@archiveRoomDescription": {}, - "exportEmotePack": "Exportera Emote-pack som .zip", - "@exportEmotePack": {}, - "inviteContactToGroupQuestion": "Vill du bjuda in {contact} till chatten ”{groupName}”?", - "@inviteContactToGroupQuestion": {}, - "redactedByBecause": "Borttaget av {username} på grund av: ”{reason}”", - "@redactedByBecause": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "reason": { - "type": "String" - } - } - }, - "redactMessageDescription": "Meddelandet kommer tas bort för alla medlemmar i denna konversation. Detta kan inte ångras.", - "@redactMessageDescription": {}, - "invalidInput": "Ogiltig input!", - "@invalidInput": {}, - "report": "rapportera", - "@report": {}, - "addChatDescription": "Lägg till en chattbeskrivning…", - "@addChatDescription": {}, - "hasKnocked": "{user} har knackat", - "@hasKnocked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "openLinkInBrowser": "Öppna länk i webbläsare", - "@openLinkInBrowser": {}, - "directChat": "Direktchatt", - "@directChat": {}, - "wrongPinEntered": "Fel pin-kod inslagen! Försök igen om {seconds} sekunder…", - "@wrongPinEntered": { - "type": "String", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "sendTypingNotifications": "Skicka skrivnotifikationer", - "@sendTypingNotifications": {}, - "inviteGroupChat": "📨 Bjud in gruppchatt", - "@inviteGroupChat": {}, - "invitePrivateChat": "📨 Bjud in privat chatt", - "@invitePrivateChat": {}, - "importEmojis": "Importera emojier", - "@importEmojis": {}, - "noChatDescriptionYet": "Ingen chatt-beskrivning än.", - "@noChatDescriptionYet": {}, - "learnMore": "Lär dig mer", - "@learnMore": {}, - "notAnImage": "Inte en bildfil.", - "@notAnImage": {}, - "chatDescriptionHasBeenChanged": "Chattbeskrivningen ändrades", - "@chatDescriptionHasBeenChanged": {}, - "roomUpgradeDescription": "Chatten kommer då att återskapas med den nya rumversionen. Alla medlemmar kommer bli påminda om att de måste byta till den nya chatten. Du kan läsa mer om rumversioner på https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, - "pleaseEnterANumber": "Vänligen ange ett nummer större än 0", - "@pleaseEnterANumber": {}, - "profileNotFound": "Användaren kunde onte hittas på servern. Kanske är det ett anslutningsproblem eller så finns inte användaren.", - "@profileNotFound": {}, - "jump": "Hoppa", - "@jump": {}, - "shareInviteLink": "Dela inbjudningslänk", - "@shareInviteLink": {}, - "emoteKeyboardNoRecents": "Nyligen använda emotes kommer dyka upp här…", - "@emoteKeyboardNoRecents": { - "type": "String", - "placeholders": {} - }, - "setTheme": "Välj tema:", - "@setTheme": {}, - "replace": "Ersätt", - "@replace": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Vänligen försök igen eller välj en annan server.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "createGroup": "Skapa grupp", - "@createGroup": {}, - "kickUserDescription": "Användaren sparkas ut ur chatten men bannlyses inte. I offentliga chattar kan användaren gå med igen när som helst.", - "@kickUserDescription": {}, - "importNow": "Importera nu", - "@importNow": {}, - "invite": "Bjud in", - "@invite": {}, - "databaseBuildErrorBody": "Kan inte bygga SQlite-databasen. Appen försöker använda den gamla databasen för nu. Vänligen rapportera problemet till utvecklarna här: {url}. Felmeddelandet är: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "blockListDescription": "Du kan blockera användare som stör dig. Du kommer inte få några meddelanden eller rum-inbjudningar från användarna på din personliga blocklista.", - "@blockListDescription": {}, - "createGroupAndInviteUsers": "Skapa en grupp och bjud in användare", - "@createGroupAndInviteUsers": {}, - "initAppError": "Ett problem skedde när appen initierades", - "@initAppError": {}, - "thisDevice": "Denna enhet:", - "@thisDevice": {}, - "startConversation": "Starta konversation", - "@startConversation": {}, - "publicSpaces": "Offentliga utrymmen", - "@publicSpaces": {}, - "blockedUsers": "Blockerade användare", - "@blockedUsers": {}, - "passwordIsWrong": "Det angivna lösenordet är fel", - "@passwordIsWrong": {}, - "pleaseEnterYourCurrentPassword": "Vänligen skriv ditt nuvarande lösenord", - "@pleaseEnterYourCurrentPassword": {}, - "groupCanBeFoundViaSearch": "Gruppen kan hittas genom sökning", - "@groupCanBeFoundViaSearch": {}, - "publicLink": "Offentlig länk", - "@publicLink": {}, - "noUsersFoundWithQuery": "Tyvärr kunde ingen användare hittas med ”{query}”. Vänligen kontrollera om du gjort ett stavfel.", - "@noUsersFoundWithQuery": { - "type": "String", - "placeholders": { - "query": { - "type": "String" - } - } - }, - "block": "blockera", - "@block": {}, - "nothingFound": "Inget hittades…", - "@nothingFound": {}, - "yourGlobalUserIdIs": "Ditt globala användar-ID är: ", - "@yourGlobalUserIdIs": {}, - "decline": "Neka", - "@decline": {}, - "newPassword": "Nytt lösenord", - "@newPassword": {}, - "passwordsDoNotMatch": "Lösenorden passar inte", - "@passwordsDoNotMatch": {}, - "commandHint_sendraw": "Skicka rå json", - "@commandHint_sendraw": {}, - "wrongRecoveryKey": "Tyvärr verkar detta inte vara den korrekta återställningsnyckeln.", - "@wrongRecoveryKey": {}, - "subspace": "Underutrymme", - "@subspace": {}, - "select": "Ange val", - "@select": {}, - "sessionLostBody": "Din session är förlorad. Vänligen rapportera detta fel till utvecklarna här: {url}. Felmeddelandet är: {error}", - "@sessionLostBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "pleaseChooseAStrongPassword": "Vänligen välj ett starkt lösenord", - "@pleaseChooseAStrongPassword": {}, - "blockUsername": "Ignorera användarnamn", - "@blockUsername": {}, - "addChatOrSubSpace": "Lägg till chatt eller underutrymme", - "@addChatOrSubSpace": {}, - "groupName": "Gruppnamn", - "@groupName": {}, - "leaveEmptyToClearStatus": "Lämna tom för att ta bort din status.", - "@leaveEmptyToClearStatus": {}, - "joinSpace": "Gå med i utrymme", - "@joinSpace": {}, - "searchForUsers": "Sök efter @användare…", - "@searchForUsers": {}, - "restoreSessionBody": "Appen försöker nu få tillbaks din session från backupen. Vänligen rapportera detta problem till utvecklarna här: {url}. Felmeddelandet är: {error}", - "@restoreSessionBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "databaseMigrationTitle": "Databasen är optimerad", - "@databaseMigrationTitle": {}, - "searchChatsRooms": "Sök efter #chattar, @användare…", - "@searchChatsRooms": {}, - "databaseMigrationBody": "Var vänlig vänta. Detta kan ta en stund.", - "@databaseMigrationBody": {}, - "youInvitedToBy": "📩 Du har blivit inbjuden via länk till:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "sendTypingNotificationsDescription": "Andra deltagare i en diskussion kan se när du skriver.", - "@sendTypingNotificationsDescription": {}, - "formattedMessagesDescription": "Visa formaterat meddelandeinnehåll som fet stil med markdown.", - "@formattedMessagesDescription": {}, - "verifyOtherUser": "🔐 Verifiera användaren", - "@verifyOtherUser": {}, - "formattedMessages": "Formaterade meddelanden", - "@formattedMessages": {}, - "canceledKeyVerification": "{sender} avbröt nyckelverifieringen", - "@canceledKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "completedKeyVerification": "{sender} fullbordade nyckelverifieringen", - "@completedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "requestedKeyVerification": "{sender} begärde nyckelverifiering", - "@requestedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "transparent": "Transparent", - "@transparent": {}, - "startedKeyVerification": "{sender} påbörjade nyckelverifiering", - "@startedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "presenceStyle": "Närvaro:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, - "presencesToggle": "Visa statusmeddelanden från andra användare", - "@presencesToggle": { - "type": "String", - "placeholders": {} - }, - "hidePresences": "Dölj statuslista?", - "@hidePresences": {}, - "sendReadReceipts": "Skicka läskvitton", - "@sendReadReceipts": {}, - "verifyOtherDevice": "🔐 Verifiera enhet", - "@verifyOtherDevice": {}, - "acceptedKeyVerification": "{sender} accepterade nyckelverifieringen", - "@acceptedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "incomingMessages": "Inkommande meddelanden", - "@incomingMessages": {}, - "forwardMessageTo": "Vidarebefordra meddelandet till {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, - "verifyOtherUserDescription": "Om du verifierar en användare så kan du vara säker på vem du verkligen skriver till. 💪\n\nNär du påbörjar en verifiering så ser du och den andra användaren en popup-ruta i appen. I den rutan ser du ett antal tecken som du jämför med vad den andra användaren ser.\n\nDet bästa sättet att göra detta är att träffas fysiskt, eller genom att starta ett videosamtal. 👭", - "@verifyOtherUserDescription": {}, - "verifyOtherDeviceDescription": "När du verifierar en enhet så kan era enheter utväxla nycklar, vilket förbättrar säkerheten. 💪 När du påbörjar en verifiering så ser du en popup-ruta på båda enheterna. I den rutan ser du ett antal tecken som du jämför med det som visas på den andra enheten. Det är bäst att ha båda enheterna till hands innan du påbörjar verifieringen. 🤳", - "@verifyOtherDeviceDescription": {}, - "isReadyForKeyVerification": "{sender} är redo för nyckelverifiering", - "@isReadyForKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "sendReadReceiptsDescription": "Andra deltagare i en diskussion kan se när du läst ett meddelande.", - "@sendReadReceiptsDescription": {}, - "stickers": "Klistermärken", - "@stickers": {}, - "discover": "Upptäck", - "@discover": {} + }, + "saveFile": "Spara fil", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Rum version", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Ta bort din avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "register": "Registrera", + "@register": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Ange din pin-kod", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Radera din chatt-backup för att skapa en ny återställningsnyckel?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "verified": "Verifierad", + "@verified": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Överför till annan enhet", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Dina meddelanden är skyddad av en säkerhetsnyckel. Se till att du inte förlorar den.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "commandHint_create": "Skapa en tom grupp-chatt\nAnvänd --no-encryption för att inaktivera kryptering", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Kasta bort sessionen", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Starta en direkt-chatt\nAnvänd --no-encryption för att inaktivera kryptering", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "homeserver": "Hemserver", + "oneClientLoggedOut": "En av dina klienter har loggats ut", + "addAccount": "Lägg till konto", + "editBundlesForAccount": "Lägg till paket för detta konto", + "addToBundle": "Utöka paket", + "bundleName": "Paketnamn", + "serverRequiresEmail": "Servern behöver validera din e-postadress för registrering.", + "singlesignon": "Single Sign On", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "unverified": "Ej verifierad", + "messageInfo": "Meddelandeinformation", + "messageType": "Meddelandetyp", + "time": "Tid", + "sender": "Avsändare", + "removeFromSpace": "Ta bort från utrymme", + "addToSpaceDescription": "Välj ett utrymme som chatten skall läggas till i.", + "start": "Starta", + "openGallery": "Öppna galleri", + "repeatPassword": "Upprepa lösenord", + "markAsRead": "Markera som läst", + "commandHint_clearcache": "Rensa cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "openVideoCamera": "Aktivera kamera för video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "link": "Länk", + "publish": "Publicera", + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "reportUser": "Rapportera användare", + "openChat": "Öppna Chatt", + "sendOnEnter": "Skicka med Enter", + "scanQrCode": "Skanna QR-kod", + "yourChatBackupHasBeenSetUp": "Din chatt-backup har konfigurerats.", + "removeFromBundle": "Ta bort från paket", + "enableMultiAccounts": "(BETA) Aktivera multi-konton på denna enhet", + "emojis": "Uttryckssymboler", + "placeCall": "Ring", + "voiceCall": "Röstsamtal", + "unsupportedAndroidVersion": "Inget stöd för denna version av Android", + "videoCallsBetaWarning": "Videosamtal är för närvarande under testning. De kanske inte fungerar som det är tänkt eller på alla plattformar.", + "unsupportedAndroidVersionLong": "Denna funktion kräver en senare version av Android.", + "dismiss": "Avfärda", + "reactedWith": "{sender} reagerade med {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Fäst i rum", + "confirmEventUnpin": "Är du säker på att händelsen inte längre skall vara fastnålad?", + "experimentalVideoCalls": "Experimentella videosamtal", + "switchToAccount": "Byt till konto {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Nästa konto", + "previousAccount": "Föregående konto", + "emailOrUsername": "Användarnamn eller e-postadress", + "addWidget": "Lägg till widget", + "widgetVideo": "Video", + "widgetEtherpad": "Anteckning", + "widgetCustom": "Anpassad", + "widgetName": "Namn", + "widgetUrlError": "Detta är inte en giltig URL.", + "errorAddingWidget": "Ett fel uppstod när widgeten skulle läggas till.", + "widgetJitsi": "Jitsi-möte", + "widgetNameError": "Vänligen ange ett visningsnamn.", + "storeSecurlyOnThisDevice": "Lagra säkert på denna enhet", + "youJoinedTheChat": "Du gick med i chatten", + "youAcceptedTheInvitation": "👍 Du accepterade inbjudan", + "youKicked": "👞 Du sparkade ut {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hugContent": "{senderName} kramar dig", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_markasgroup": "Märk som grupp", + "recoveryKeyLost": "Borttappad återställningsnyckel?", + "indexedDbErrorTitle": "Problem med privat läge", + "youHaveWithdrawnTheInvitationFor": "Du har återkallat inbjudan till {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Du återkallade förbudet för {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unlockOldMessages": "Lås upp äldre meddelanden", + "newSpace": "Nytt utrymme", + "googlyEyesContent": "{senderName} skickar dig googly ögon", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "dehydrate": "Exportera sessionen och rensa enheten", + "dehydrateWarning": "Denna åtgärd kan inte ångras. Försäkra dig om att backupen är i säkert förvar.", + "dehydrateTor": "TOR-användare: Exportera session", + "hydrateTor": "TOR-användare: Importera session från tidigare export", + "hydrateTorLong": "Exporterade du sessionen när du senast använde TOR? Importera den enkelt och fortsätt chatta.", + "recoveryKey": "Återställningsnyckel", + "separateChatTypes": "Separata direktchattar och grupper", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "startFirstChat": "Starta din första chatt", + "pleaseEnterRecoveryKeyDescription": "Ange din återställningsnyckel från en tidigare session för att låsa upp äldre meddelanden. Din återställningsnyckel är INTE ditt lösenord.", + "encryptThisChat": "Kryptera denna chatt", + "dehydrateTorLong": "TOR-användare rekommenderas att exportera sessionen innan fönstret stängs.", + "noBackupWarning": "Varning! Om du inte aktiverar säkerhetskopiering av chattar så tappar du åtkomst till krypterade meddelanden. Det är rekommenderat att du aktiverar säkerhetskopiering innan du loggar ut.", + "noOtherDevicesFound": "Inga andra enheter hittades", + "disableEncryptionWarning": "Av säkerhetsskäl kan du inte stänga av kryptering i en chatt där det tidigare aktiverats.", + "sorryThatsNotPossible": "Det där är inte möjligt", + "confirmMatrixId": "Bekräfta ditt Matrix-ID för att radera ditt konto.", + "supposedMxid": "Detta bör vara {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "pleaseEnterRecoveryKey": "Ange din återställningsnyckel:", + "commandHint_markasdm": "Märk som rum för direktmeddelanden för det givante Matrix ID", + "user": "Användare", + "indexedDbErrorLong": "Meddelandelagring är tyvärr inte aktiverat i privat läge som standard.\nGå till\n - about:config\n - sätt dom.indexedDB.privateBrowsing.enabled till true\nAnnars går det inte att använda FluffyChat.", + "storeInSecureStorageDescription": "Lagra återställningsnyckeln på säker plats på denna enhet.", + "storeInAppleKeyChain": "Lagra i Apples nyckelkedja (KeyChain)", + "foregroundServiceRunning": "Denna avisering visas när förgrundstjänsten körs.", + "custom": "Anpassad", + "countFiles": "{count} filer", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "screenSharingTitle": "skärmdelning", + "noKeyForThisMessage": "Detta kan hända om meddelandet skickades innan du loggade in på ditt konto i den här enheten.\n\nDet kan också vara så att avsändaren har blockerat din enhet eller att något gick fel med internetanslutningen.\n\nKan du läsa meddelandet i en annan session? I sådana fall kan du överföra meddelandet från den sessionen! Gå till Inställningar > Enhet och säkerställ att dina enheter har verifierat varandra. När du öppnar rummet nästa gång och båda sessionerna är i förgrunden, så kommer nycklarna att överföras automatiskt.\n\nVill du inte förlora nycklarna vid utloggning eller när du byter enhet? Säkerställ att du har aktiverat säkerhetskopiering för chatten i inställningarna.", + "fileIsTooBigForServer": "Gick inte att skicka! Servern stödjer endast bilagor upp till{max}.", + "deviceKeys": "Enhetsnycklar:", + "enterSpace": "Gå till utrymme", + "commandHint_googly": "Skicka några googly ögon", + "commandHint_cuddle": "Skicka en omfamning", + "commandHint_hug": "Skicka en kram", + "users": "Användare", + "cuddleContent": "{senderName} omfamnar dig", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hydrate": "Återställ från säkerhetskopia", + "screenSharingDetail": "Du delar din skärm i FluffyChat", + "youRejectedTheInvitation": "Du avvisade inbjudan", + "youBannedUser": "Du förbjöd {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Du har blivit inbjuden av {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Du bjöd in {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Du sparkade ut och förbjöd {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "saveKeyManuallyDescription": "Spara nyckeln manuellt genom att aktivera dela-funktionen eller urklippshanteraren på enheten.", + "storeInAndroidKeystore": "Lagra i Androids nyckellagring (KeyStore)", + "callingPermissions": "Samtalsbehörighet", + "callingAccount": "Samtalskonto", + "callingAccountDetails": "Tillåt FluffyChat att använda Androids ring-app.", + "appearOnTop": "Visa ovanpå", + "appearOnTopDetails": "Tillåt att appen visas ovanpå (behövs inte om du redan har FluffyChat konfigurerat som ett samtalskonto)", + "otherCallingPermissions": "Mikrofon, kamera och andra behörigheter för FluffyChat", + "whyIsThisMessageEncrypted": "Varför kan inte detta meddelande läsas?", + "newGroup": "Ny grupp", + "enterRoom": "Gå till rummet", + "allSpaces": "Alla utrymmen", + "numChats": "{number} chattar", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Göm oviktiga tillståndshändelser", + "doNotShowAgain": "Visa inte igen", + "wasDirectChatDisplayName": "Tom chatt (var {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Utrymmen möjliggör konsolidering av chattar och att bygga privata eller offentliga gemenskaper.", + "reopenChat": "Återöppna chatt", + "jumpToLastReadMessage": "Hoppa till det senast lästa meddelandet", + "readUpToHere": "Läs upp till hit", + "fileHasBeenSavedAt": "Filen har sparats i {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "allRooms": "Alla gruppchattar", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "reportErrorDescription": "😭 Åh nej. Något gick fel. Om du vill ian du rapportera denna bugg till utvecklarna.", + "setColorTheme": "Välj färgtema:", + "banUserDescription": "Användaren kommer bannlysas från chatten och kommer inte kunna gå med i chatten igen tills bannlysningen avslutas.", + "removeDevicesDescription": "Du kommer att bli utloggad från den här enheten och kommer inte längre kunna få meddelanden.", + "tryAgain": "Försök igen", + "unbanUserDescription": "Användaren kommer kunna gå med i chatten igen om den försöker.", + "messagesStyle": "Meddelanden:", + "chatDescription": "Chattbeskrivning", + "pushNotificationsNotAvailable": "Aviseringar är inte tillgängligt", + "invalidServerName": "Ogiltigt servernamn", + "chatPermissions": "Chatt-behörigheter", + "signInWithPassword": "Logga in med lösenord", + "makeAdminDescription": "När du gör denna användare till administratör kommer du inte kunna ångra det eftersom de kommer ha samma behörigheter som du.", + "setChatDescription": "Ändra chattens beskrivning", + "importFromZipFile": "Importera från .zip-fil", + "redactedBy": "Borttaget av {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "signInWith": "Logga in med {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Frivilligt) Anledning till att ta bort det här meddelandet…", + "archiveRoomDescription": "Den här chatten kommer flyttas till arkivet. Andra användare kommer kunna se att du har lämnat chatten.", + "exportEmotePack": "Exportera Emote-pack som .zip", + "inviteContactToGroupQuestion": "Vill du bjuda in {contact} till chatten ”{groupName}”?", + "redactedByBecause": "Borttaget av {username} på grund av: ”{reason}”", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactMessageDescription": "Meddelandet kommer tas bort för alla medlemmar i denna konversation. Detta kan inte ångras.", + "invalidInput": "Ogiltig input!", + "report": "rapportera", + "addChatDescription": "Lägg till en chattbeskrivning…", + "hasKnocked": "{user} har knackat", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "openLinkInBrowser": "Öppna länk i webbläsare", + "directChat": "Direktchatt", + "wrongPinEntered": "Fel pin-kod inslagen! Försök igen om {seconds} sekunder…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Skicka skrivnotifikationer", + "inviteGroupChat": "📨 Gruppchattsinbjudan", + "invitePrivateChat": "📨 Privat chattinbjudan", + "importEmojis": "Importera emojier", + "noChatDescriptionYet": "Ingen chatt-beskrivning än.", + "learnMore": "Lär dig mer", + "notAnImage": "Inte en bildfil.", + "chatDescriptionHasBeenChanged": "Chattbeskrivningen ändrades", + "roomUpgradeDescription": "Chatten kommer då att återskapas med den nya rumversionen. Alla medlemmar kommer bli påminda om att de måste byta till den nya chatten. Du kan läsa mer om rumversioner på https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Vänligen ange ett nummer större än 0", + "profileNotFound": "Användaren kunde onte hittas på servern. Kanske är det ett anslutningsproblem eller så finns inte användaren.", + "jump": "Hoppa", + "shareInviteLink": "Dela inbjudningslänk", + "emoteKeyboardNoRecents": "Nyligen använda emotes kommer dyka upp här…", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Välj tema:", + "replace": "Ersätt", + "pleaseTryAgainLaterOrChooseDifferentServer": "Vänligen försök igen eller välj en annan server.", + "createGroup": "Skapa grupp", + "kickUserDescription": "Användaren sparkas ut ur chatten men bannlyses inte. I offentliga chattar kan användaren gå med igen när som helst.", + "importNow": "Importera nu", + "invite": "Bjud in", + "databaseBuildErrorBody": "Kan inte bygga SQlite-databasen. Appen försöker använda den gamla databasen för nu. Vänligen rapportera problemet till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "blockListDescription": "Du kan blockera användare som stör dig. Du kommer inte få några meddelanden eller rum-inbjudningar från användarna på din personliga blocklista.", + "createGroupAndInviteUsers": "Skapa en grupp och bjud in användare", + "initAppError": "Ett problem skedde när appen initierades", + "thisDevice": "Denna enhet:", + "startConversation": "Starta konversation", + "publicSpaces": "Offentliga utrymmen", + "blockedUsers": "Blockerade användare", + "passwordIsWrong": "Det angivna lösenordet är fel", + "pleaseEnterYourCurrentPassword": "Vänligen skriv ditt nuvarande lösenord", + "groupCanBeFoundViaSearch": "Gruppen kan hittas genom sökning", + "publicLink": "Offentlig länk", + "noUsersFoundWithQuery": "Tyvärr kunde ingen användare hittas med ”{query}”. Vänligen kontrollera om du gjort ett stavfel.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "block": "blockera", + "nothingFound": "Inget hittades…", + "yourGlobalUserIdIs": "Ditt globala användar-ID är: ", + "decline": "Neka", + "newPassword": "Nytt lösenord", + "passwordsDoNotMatch": "Lösenorden passar inte", + "commandHint_sendraw": "Skicka rå json", + "wrongRecoveryKey": "Tyvärr verkar detta inte vara den korrekta återställningsnyckeln.", + "subspace": "Underutrymme", + "select": "Ange val", + "sessionLostBody": "Din session är förlorad. Vänligen rapportera detta fel till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "pleaseChooseAStrongPassword": "Vänligen välj ett starkt lösenord", + "blockUsername": "Ignorera användarnamn", + "addChatOrSubSpace": "Lägg till chatt eller underutrymme", + "groupName": "Gruppnamn", + "leaveEmptyToClearStatus": "Lämna tom för att ta bort din status.", + "joinSpace": "Gå med i utrymme", + "searchForUsers": "Sök efter @användare…", + "restoreSessionBody": "Appen försöker nu få tillbaks din session från backupen. Vänligen rapportera detta problem till utvecklarna här: {url}. Felmeddelandet är: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "databaseMigrationTitle": "Databasen är optimerad", + "searchChatsRooms": "Sök efter #chattar, @användare…", + "databaseMigrationBody": "Var vänlig vänta. Detta kan ta en stund.", + "youInvitedToBy": "📩 Du har blivit inbjuden via länk till:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "Andra deltagare i en diskussion kan se när du skriver.", + "formattedMessagesDescription": "Visa formaterat meddelandeinnehåll som fet stil med markdown.", + "verifyOtherUser": "🔐 Verifiera användaren", + "formattedMessages": "Formaterade meddelanden", + "canceledKeyVerification": "{sender} avbröt nyckelverifieringen", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} fullbordade nyckelverifieringen", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} begärde nyckelverifiering", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Transparent", + "startedKeyVerification": "{sender} påbörjade nyckelverifiering", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "presenceStyle": "Närvaro:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Visa statusmeddelanden från andra användare", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "hidePresences": "Dölj statuslista?", + "sendReadReceipts": "Skicka läskvitton", + "verifyOtherDevice": "🔐 Verifiera enhet", + "acceptedKeyVerification": "{sender} accepterade nyckelverifieringen", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "Inkommande meddelanden", + "forwardMessageTo": "Vidarebefordra meddelandet till {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Om du verifierar en användare så kan du vara säker på vem du verkligen skriver till. 💪\n\nNär du påbörjar en verifiering så ser du och den andra användaren en popup-ruta i appen. I den rutan ser du ett antal tecken som du jämför med vad den andra användaren ser.\n\nDet bästa sättet att göra detta är att träffas fysiskt, eller genom att starta ett videosamtal. 👭", + "verifyOtherDeviceDescription": "När du verifierar en enhet så kan era enheter utväxla nycklar, vilket förbättrar säkerheten. 💪 När du påbörjar en verifiering så ser du en popup-ruta på båda enheterna. I den rutan ser du ett antal tecken som du jämför med det som visas på den andra enheten. Det är bäst att ha båda enheterna till hands innan du påbörjar verifieringen. 🤳", + "isReadyForKeyVerification": "{sender} är redo för nyckelverifiering", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "sendReadReceiptsDescription": "Andra deltagare i en diskussion kan se när du läst ett meddelande.", + "stickers": "Klistermärken", + "discover": "Upptäck", + "ignoreUser": "Ignorera användare", + "normalUser": "Normal användare", + "aboutHomeserver": "Om{homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "commandHint_roomupgrade": "Uppgradera detta rum till den givna rumsversionen", + "appLockDescription": "Lås appen när den inte används med en pin-kod", + "swipeRightToLeftToReply": "Svep från höger till vänster för att svara", + "countChatsAndCountParticipants": "{chats} chattar och {participants} deltagare", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Inga fler chattar hittades...", + "noChatsFoundHere": "Inga chattar kunde hittas här ännu. Starta en ny chatt med någon genom att använda knappen nedan. ⤵️", + "unread": "Olästa", + "space": "Utrymme", + "spaces": "Utrymmen", + "changedTheChatDescription": "{username} ändrade chattens beskrivning", + "changedTheChatName": "{username} ändrade chattens namn", + "checkList": "Att-göra lista", + "countInvited": "{count} inbjudna", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "globalChatId": "Globalt chat-ID", + "accessAndVisibility": "Tillgänglighet och synlighet", + "accessAndVisibilityDescription": "Vem som är tillåten att gå med i chatten och hur chatten kan upptäckas.", + "calls": "Samtal", + "customEmojisAndStickers": "Egna emojis och klistermärken", + "customEmojisAndStickersBody": "Lägg till eller dela egna emojis eller klistermärken som kan användas i alla chattar.", + "setCustomPermissionLevel": "Ställ in särskild behörighetsnivå", + "alwaysUse24HourFormat": "falskt", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "setPermissionsLevelDescription": "Välj en fördefinierad roll nedan eller skriv in en särskild behörighetsnivå mellan 0 och 100.", + "joinedChats": "Anslutna chattar", + "hideRedactedMessages": "Dölj tillbakatagna meddelanden", + "hideRedactedMessagesBody": "Om någon tar tillbaka ett meddelande, kommer meddelandet inte längre vara synligt i chatten.", + "hideInvalidOrUnknownMessageFormats": "Dölj ogiltiga eller okända meddelande-format", + "hideMemberChangesInPublicChats": "Dölj användarändringar i offentliga chattar", + "hideMemberChangesInPublicChatsBody": "Visar inte om någon går med eller lämnar ett offentligt rum i chattens tidslinje för att öka läsbarheten.", + "overview": "Översikt", + "notifyMeFor": "Avisera mig för", + "passwordRecoverySettings": "Lösenordsåterställnings-inställningar", + "sendImages": "Skicka {count} bild", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "synchronizingPleaseWaitCounter": " Synkroniserar… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "invitedBy": "📩Inbjuden av{user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Användare måste knacka", + "noOneCanJoin": "Ingen kan gå med", + "userWouldLikeToChangeTheChat": "{user}vill gå med i chatten.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Ingen offentlig länk har skapats ännu", + "knock": "Knacka", + "knocking": "Knackar", + "chatCanBeDiscoveredViaSearchOnServer": "Chatten kan upptäckas via sökfunktionen på {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "publicChatAddresses": "Offentlig chatt-adress", + "createNewAddress": "Skapa ny adress", + "userRole": "Användarroll", + "searchIn": "Sök i chatten \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Sök mer...", + "gallery": "Galleri", + "files": "Filer", + "commandHint_ignore": "Ignorera det givna matrix-ID:et", + "commandHint_unignore": "Sluta ignorera det givna matrix-ID:et", + "unreadChatsInApp": "{appname}: {unread} olästa chattar", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Databaskryptering stöds inte på denna platform", + "thereAreCountUsersBlocked": "Just nu är {count} användare blockade.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "restricted": "Begränsad", + "knockRestricted": "Knacka begränsade", + "goToSpace": "Gå till utrymme:{space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Markera oläst", + "userLevel": "{level} - Användare", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Ändra allmäna chatt-inställningar", + "inviteOtherUsers": "Bjud in andra användare till chatten", + "changeTheChatPermissions": "Ändra chattbehörigheterna", + "changeTheVisibilityOfChatHistory": "Ändra synligheten på chatt-historiken", + "changeTheCanonicalRoomAlias": "Ändra den huvudsakliga offenliga chatt-adressen", + "sendRoomNotifications": "Skicka en @rum notis", + "changeTheDescriptionOfTheGroup": "Ändra beskrivningen på chatten", + "chatPermissionsDescription": "Definiera vilket tillståndsnivå som krävs för vissa handlingar i chatten. Tillståndsnivåerna 0, 50 och 100 representerar ofta användare, moderatorer och admins, men vilken gradering som helst fungerar.", + "updateInstalled": "🎉 Uppdatering {version} installerad!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Ändringslogg", + "sendCanceled": "Skickande avbröts", + "loginWithMatrixId": "Logga in med Matrix-ID", + "discoverHomeservers": "Upptäck hemservrar", + "whatIsAHomeserver": "Vad är en hemserver?", + "homeserverDescription": "All din data lagras på hemservern, precis som en mailtjänst. Du kan välja vilken hemserver du vill använda, medans du fortfarande kan kommunicera med vemsomhelst. Lär dig met på https://matrix.org.", + "doesNotSeemToBeAValidHomeserver": "Verkar inte vara en kompatibel hemserver. Fel URL?", + "calculatingFileSize": "Beräknar filstorlek...", + "prepareSendingAttachment": "Förbered skickar bilaga...", + "sendingAttachment": "Skickar bilaga...", + "generatingVideoThumbnail": "Genererar förhandsvisning...", + "compressVideo": "Komprimerar video...", + "sendingAttachmentCountOfCount": "Skickar bilaga {index} om {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "Servergräns nådd! Väntar {seconds} sekunder...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "En av dina enheter är inte verifierade", + "noticeChatBackupDeviceVerification": "Notis: När du ansluter alla dina enheter till chatt-backupen, är de automatiskt verifierade.", + "continueText": "Fortsätt", + "welcomeText": "Hej Hej 👋 Det här är FluffyChat. Du kan logga in på vilken hemserver du vill, som är kompatibel med https://matrix.org. Och sen chatta med vemsomhelst. Det är ett enormt decentraliserat chatt-nätverk!", + "blur": "Blurra:", + "opacity": "Opacitet:", + "setWallpaper": "Ställ in bakgrundsbild", + "manageAccount": "Hantera konto", + "noContactInformationProvided": "Servern bistår inte med någon giltig kontaktinformation", + "contactServerAdmin": "Kontakta server-admin", + "contactServerSecurity": "Kontakta server-säkerheten", + "supportPage": "Stödsida", + "serverInformation": "Serverinformation:", + "name": "Namn", + "version": "Version", + "website": "Hemsida", + "compress": "Komprimera", + "boldText": "Fetstilt", + "italicText": "Kursiv", + "strikeThrough": "Genomstryk", + "pleaseFillOut": "Fyll i", + "invalidUrl": "Ogiltig url", + "addLink": "Lägg till länk", + "unableToJoinChat": "Kunde inte gå med i chatten. Kanske har den andra parten redan stängt konversationen.", + "previous": "Föregående", + "otherPartyNotLoggedIn": "Den andra parten är för närvarande inte inloggad, och kan därför inte ta emot meddelanden!", + "appWantsToUseForLogin": "Använd '{server}' för att logga in", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Du tillåter härmed appen och hemsidan att dela information om dig.", + "open": "Öppna", + "waitingForServer": "Väntar på server...", + "appIntroduction": "FluffyChat låter dig chatta med vänner över olika tjänster. Lär dig mer på https://matrix.org eller tryck *Fortsätt*.", + "newChatRequest": "📩 Ny chatt förfrågan", + "contentNotificationSettings": "Innehållsnotis-inställningar", + "generalNotificationSettings": "Allmänna notis-inställningar", + "roomNotificationSettings": "rumsnotis-inställningar", + "userSpecificNotificationSettings": "Användarspecifika notis-inställningar", + "otherNotificationSettings": "Andra notis-inställningar", + "notificationRuleContainsUserName": "Innehåller Användarnamn", + "notificationRuleContainsUserNameDescription": "Avisera användaren när ett meddelande innehåller deras användarnamn.", + "notificationRuleMaster": "Tysta alla notiser", + "notificationRuleMasterDescription": "Åsidosätter alla andra regler och tystar alla notiser." } From 39e7954e0f635f001a50b1ba4efe3150b9ab4e2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98jvind=20Fritjof=20Arnfred?= Date: Tue, 10 Feb 2026 14:55:00 +0100 Subject: [PATCH 075/333] chore(translations): Translated using Weblate (Danish) Currently translated at 4.2% (36 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/da/ --- lib/l10n/intl_da.arb | 168 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 135 insertions(+), 33 deletions(-) diff --git a/lib/l10n/intl_da.arb b/lib/l10n/intl_da.arb index bad7b028..5f9f53f5 100644 --- a/lib/l10n/intl_da.arb +++ b/lib/l10n/intl_da.arb @@ -1,35 +1,137 @@ { - "repeatPassword": "Gentag password", - "@repeatPassword": {}, - "notAnImage": "Ikke en billedfil.", - "@notAnImage": {}, - "setCustomPermissionLevel": "Indstil særligt tilladelsesniveau", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Vælg en prædefineret rolle herunder eller indtaste et særligt tilladelsesniveau mellem 0 og 100.", - "@setPermissionsLevelDescription": {}, - "ignoreUser": "Ignorér bruger", - "@ignoreUser": {}, - "remove": "Fjern", - "@remove": { - "type": "String", - "placeholders": {} - }, - "importNow": "Importer nu", - "@importNow": {}, - "importEmojis": "Importer emojis", - "@importEmojis": {}, - "normalUser": "Normal bruger", - "@normalUser": {}, - "importFromZipFile": "Importer fra .zip fil", - "@importFromZipFile": {}, - "alwaysUse24HourFormat": "true", - "@alwaysUse24HourFormat": { - "description": "Set to true to always display time of day in 24 hour format." - }, - "exportEmotePack": "Eksportér Emote-pakke som .zip-fil", - "@exportEmotePack": {}, - "replace": "Erstat", - "@replace": {}, - "about": "Om", - "@about": {} + "repeatPassword": "Gentag password", + "notAnImage": "Ikke en billedfil.", + "setCustomPermissionLevel": "Indstil særligt tilladelsesniveau", + "setPermissionsLevelDescription": "Vælg en prædefineret rolle herunder eller indtaste et særligt tilladelsesniveau mellem 0 og 100.", + "ignoreUser": "Ignorér bruger", + "remove": "Fjern", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Importer nu", + "importEmojis": "Importer emojis", + "normalUser": "Normal bruger", + "importFromZipFile": "Importer fra .zip fil", + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "exportEmotePack": "Eksportér Emote-pakke som .zip-fil", + "replace": "Erstat", + "about": "Om", + "aboutHomeserver": "Om {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Acceptér", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} accepterede invitationen", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Konto", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} aktiverede end-to-end kryptering", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Tilføj e-mail", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Bekræft din Matrix-ID for at slette din konto.", + "supposedMxid": "Den burde være {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addChatDescription": "Tilføj en beskrivelse af chatten...", + "addToSpace": "Tilføj til gruppe", + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "allChats": "Alle samtaler", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Opgrader dette rum til den givne rumversion", + "commandHint_googly": "Send googly-eyes", + "commandHint_cuddle": "Send et varmt smil", + "commandHint_hug": "Send et kram", + "googlyEyesContent": "{senderName} sender dig googly-eyes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} sender dig et varmt smil", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} krammer dig", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} svarer på dit opkald", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Enhver kan deltage", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + } } From a9ea64d08bcd14c370e97b88c94b7bb23706e1da Mon Sep 17 00:00:00 2001 From: - Date: Tue, 10 Feb 2026 07:59:51 +0100 Subject: [PATCH 076/333] chore(translations): Translated using Weblate (Russian) Currently translated at 97.1% (816 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/ --- lib/l10n/intl_ru.arb | 406 +------------------------------------------ 1 file changed, 2 insertions(+), 404 deletions(-) diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index ad7856b4..31bd9aac 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -402,7 +402,6 @@ "placeholders": {} }, "clearArchive": "Очистить архив", - "@clearArchive": {}, "close": "Закрыть", "@close": { "type": "String", @@ -2065,37 +2064,21 @@ "placeholders": {} }, "chatHasBeenAddedToThisSpace": "Чат был добавлен в это пространство", - "@chatHasBeenAddedToThisSpace": {}, "addToSpace": "Добавить в пространство", - "@addToSpace": {}, "scanQrCode": "Сканировать QR-код", - "@scanQrCode": {}, "sendOnEnter": "Отправлять по Enter", - "@sendOnEnter": {}, "homeserver": "Домашний сервер", - "@homeserver": {}, "serverRequiresEmail": "Этот сервер должен подтвердить ваш адрес электронной почты для регистрации.", - "@serverRequiresEmail": {}, "enableMultiAccounts": "(БЕТА) Включить несколько учетных записей на этом устройстве", - "@enableMultiAccounts": {}, "bundleName": "Название пакета", - "@bundleName": {}, "removeFromBundle": "Удалить из этого пакета", - "@removeFromBundle": {}, "addToBundle": "Добавить в пакет", - "@addToBundle": {}, "editBundlesForAccount": "Изменить пакеты для этой учетной записи", - "@editBundlesForAccount": {}, "addAccount": "Добавить учетную запись", - "@addAccount": {}, "link": "Ссылка", - "@link": {}, "oneClientLoggedOut": "Один из ваших клиентов вышел", - "@oneClientLoggedOut": {}, "yourChatBackupHasBeenSetUp": "Резервное копирование чата настроено.", - "@yourChatBackupHasBeenSetUp": {}, "unverified": "Не проверено", - "@unverified": {}, "commandHint_clearcache": "Очистить кэш", "@commandHint_clearcache": { "type": "String", @@ -2112,28 +2095,19 @@ "description": "Usage hint for the command /dm" }, "messageInfo": "Информация о сообщении", - "@messageInfo": {}, "openGallery": "Открыть галерею", - "@openGallery": {}, "removeFromSpace": "Удалить из пространства", - "@removeFromSpace": {}, "commandHint_create": "Создайте пустой групповой чат\nИспользуйте --no-encryption, чтобы отключить шифрование", "@commandHint_create": { "type": "String", "description": "Usage hint for the command /create" }, "sender": "Отправитель", - "@sender": {}, "addToSpaceDescription": "Выберите пространство, чтобы добавить к нему этот чат.", - "@addToSpaceDescription": {}, "start": "Начать", - "@start": {}, "time": "Время", - "@time": {}, "messageType": "Тип сообщения", - "@messageType": {}, "repeatPassword": "Повторите пароль", - "@repeatPassword": {}, "openVideoCamera": "Открыть камеру для видео", "@openVideoCamera": { "type": "String", @@ -2149,15 +2123,10 @@ } }, "publish": "Опубликовать", - "@publish": {}, "dismiss": "Отклонить", - "@dismiss": {}, "markAsRead": "Отметить как прочитанное", - "@markAsRead": {}, "reportUser": "Сообщить о пользователе", - "@reportUser": {}, "openChat": "Открыть чат", - "@openChat": {}, "reactedWith": "{sender} реагирует с {reaction}", "@reactedWith": { "type": "String", @@ -2171,25 +2140,15 @@ } }, "emojis": "Эмодзи", - "@emojis": {}, "voiceCall": "Голосовой звонок", - "@voiceCall": {}, "unsupportedAndroidVersion": "Неподдерживаемая версия Android", - "@unsupportedAndroidVersion": {}, "unsupportedAndroidVersionLong": "Для этой функции требуется более новая версия Android. Проверьте наличие обновлений или поддержку Lineage OS.", - "@unsupportedAndroidVersionLong": {}, "placeCall": "Совершить звонок", - "@placeCall": {}, "videoCallsBetaWarning": "Обратите внимание, что видеозвонки в настоящее время находятся в бета-версии. Они могут работать не так, как ожидалось, или вообще не работать на всех платформах.", - "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Экспериментальные видеозвонки", - "@experimentalVideoCalls": {}, "emailOrUsername": "Адрес электронной почты или имя пользователя", - "@emailOrUsername": {}, "pinMessage": "Прикрепить к комнате", - "@pinMessage": {}, "confirmEventUnpin": "Вы уверены, что хотите навсегда открепить событие?", - "@confirmEventUnpin": {}, "switchToAccount": "Переключиться на учётную запись {number}", "@switchToAccount": { "type": "number", @@ -2200,36 +2159,23 @@ } }, "nextAccount": "Следующая учётная запись", - "@nextAccount": {}, "previousAccount": "Предыдущая учётная запись", - "@previousAccount": {}, "addWidget": "Добавить виджет", - "@addWidget": {}, "widgetVideo": "Видео", - "@widgetVideo": {}, "widgetEtherpad": "Текстовая записка", - "@widgetEtherpad": {}, "widgetCustom": "Пользовательский", - "@widgetCustom": {}, "widgetJitsi": "Совещание Jitsi", - "@widgetJitsi": {}, "widgetName": "Имя", - "@widgetName": {}, "widgetUrlError": "Этот URL не действителен.", - "@widgetUrlError": {}, "widgetNameError": "Пожалуйста, укажите отображаемое имя.", - "@widgetNameError": {}, "errorAddingWidget": "Ошибка при добавлении виджета.", - "@errorAddingWidget": {}, "separateChatTypes": "Разделять личные чаты и группы", "@separateChatTypes": { "type": "String", "placeholders": {} }, "youRejectedTheInvitation": "Вы отклонили приглашение", - "@youRejectedTheInvitation": {}, "youAcceptedTheInvitation": "👍 Вы приняли приглашение", - "@youAcceptedTheInvitation": {}, "youUnbannedUser": "Вы разблокировали {user}", "@youUnbannedUser": { "placeholders": { @@ -2239,7 +2185,6 @@ } }, "youJoinedTheChat": "Вы присоединились к чату", - "@youJoinedTheChat": {}, "youKickedAndBanned": "🙅 Вы выгнали и заблокировали {user}", "@youKickedAndBanned": { "placeholders": { @@ -2289,31 +2234,18 @@ } }, "recoveryKeyLost": "Ключ восстановления утерян?", - "@recoveryKeyLost": {}, "users": "Пользователи", - "@users": {}, "unlockOldMessages": "Разблокировать старые сообщения", - "@unlockOldMessages": {}, "storeInSecureStorageDescription": "Сохраните ключ восстановления в безопасном хранилище этого устройства.", - "@storeInSecureStorageDescription": {}, "storeSecurlyOnThisDevice": "Сохранить на этом устройстве", - "@storeSecurlyOnThisDevice": {}, "saveKeyManuallyDescription": "Сохраните этот ключ вручную, вызвав диалог общего доступа системы или буфера обмена.", - "@saveKeyManuallyDescription": {}, "recoveryKey": "Ключ восстановления", - "@recoveryKey": {}, "pleaseEnterRecoveryKey": "Введите ключ восстановления:", - "@pleaseEnterRecoveryKey": {}, "pleaseEnterRecoveryKeyDescription": "Чтобы разблокировать старые сообщения, введите ключ восстановления, сгенерированный в предыдущем сеансе. Ваш ключ восстановления НЕ является вашим паролем.", - "@pleaseEnterRecoveryKeyDescription": {}, "storeInAndroidKeystore": "Сохранить в Android KeyStore", - "@storeInAndroidKeystore": {}, "storeInAppleKeyChain": "Сохранить в Apple KeyChain", - "@storeInAppleKeyChain": {}, "user": "Пользователь", - "@user": {}, "confirmMatrixId": "Пожалуйста, подтвердите Matrix ID, чтобы удалить свою учётную запись.", - "@confirmMatrixId": {}, "supposedMxid": "Это должно быть {mxid}", "@supposedMxid": { "type": "String", @@ -2324,61 +2256,33 @@ } }, "dehydrateTor": "Пользователи TOR: Экспорт сеанса", - "@dehydrateTor": {}, "indexedDbErrorLong": "К сожалению, по умолчанию хранилище сообщений не включено в приватном режиме.\nПожалуйста, посетите\n- about:config\n- установите для dom.indexedDB.privateBrowsing.enabled значение true\nВ противном случае запуск FluffyChat будет невозможен.", - "@indexedDbErrorLong": {}, "custom": "Пользовательское", - "@custom": {}, "hydrate": "Восстановить из файла резервной копии", - "@hydrate": {}, "hydrateTor": "Пользователи TOR: Импорт экспорта сессии", - "@hydrateTor": {}, "hydrateTorLong": "В прошлый раз вы экспортировали свою сессию в TOR? Быстро импортируйте его и продолжайте общение.", - "@hydrateTorLong": {}, "dehydrateTorLong": "Для пользователей TOR рекомендуется экспортировать сессию перед закрытием окна.", - "@dehydrateTorLong": {}, "dehydrate": "Экспорт сеанса и очистка устройства", - "@dehydrate": {}, "dehydrateWarning": "Это действие не может быть отменено. Убедитесь, что вы безопасно сохранили файл резервной копии.", - "@dehydrateWarning": {}, "indexedDbErrorTitle": "Проблемы с приватным режимом", - "@indexedDbErrorTitle": {}, "otherCallingPermissions": "Микрофон, камера и другие разрешения FluffyChat", - "@otherCallingPermissions": {}, "enterSpace": "Войти в пространство", - "@enterSpace": {}, "screenSharingDetail": "Вы делитесь своим экраном в FuffyChat", - "@screenSharingDetail": {}, "callingAccountDetails": "Позволяет FluffyChat использовать родное android приложение для звонков.", - "@callingAccountDetails": {}, "newSpace": "Новое пространство", - "@newSpace": {}, "appearOnTop": "Появляться сверху", - "@appearOnTop": {}, "commandHint_markasdm": "Пометить как комнату личных сообщений", - "@commandHint_markasdm": {}, "appearOnTopDetails": "Позволяет приложению отображаться сверху (не требуется, если у вас уже настроен Fluffychat как аккаунт для звонков)", - "@appearOnTopDetails": {}, "foregroundServiceRunning": "Это уведомление появляется, когда запущена основная служба.", - "@foregroundServiceRunning": {}, "newGroup": "Новая группа", - "@newGroup": {}, "enterRoom": "Войти в комнату", - "@enterRoom": {}, "allSpaces": "Все пространства", - "@allSpaces": {}, "callingPermissions": "Разрешения на звонки", - "@callingPermissions": {}, "callingAccount": "Аккаунт для звонков", - "@callingAccount": {}, "commandHint_markasgroup": "Пометить как группу", - "@commandHint_markasgroup": {}, "whyIsThisMessageEncrypted": "Почему это сообщение нечитаемо?", - "@whyIsThisMessageEncrypted": {}, "noKeyForThisMessage": "Это может произойти, если сообщение было отправлено до того, как вы вошли в свою учетную запись на данном устройстве.\n\nТакже возможно, что отправитель заблокировал ваше устройство или что-то пошло не так с интернет-соединением.\n\nВы можете прочитать сообщение на другой сессии? Тогда вы можете перенести сообщение с неё! Перейдите в Настройки > Устройства и убедитесь, что ваши устройства проверили друг друга. Когда вы откроете комнату в следующий раз и обе сессии будут открыты, ключи будут переданы автоматически.\n\nВы не хотите потерять ключи при выходе из системы или переключении устройств? Убедитесь, что вы включили резервное копирование чата в настройках.", - "@noKeyForThisMessage": {}, "screenSharingTitle": "общий доступ к экрану", - "@screenSharingTitle": {}, "numChats": "{number} чатов", "@numChats": { "type": "number", @@ -2389,13 +2293,9 @@ } }, "fileIsTooBigForServer": "Отправка не удалась! Сервер поддерживает только вложения размером до {max}.", - "@fileIsTooBigForServer": {}, "hideUnimportantStateEvents": "Скрыть необязательные события статуса", - "@hideUnimportantStateEvents": {}, "sorryThatsNotPossible": "Извините... это невозможно", - "@sorryThatsNotPossible": {}, "openLinkInBrowser": "Открыть ссылку в браузере", - "@openLinkInBrowser": {}, "fileHasBeenSavedAt": "Файл сохранён в {path}", "@fileHasBeenSavedAt": { "type": "String", @@ -2406,11 +2306,8 @@ } }, "commandHint_cuddle": "Отправить улыбку", - "@commandHint_cuddle": {}, "readUpToHere": "Непрочитанное", - "@readUpToHere": {}, "commandHint_hug": "Отправить обнимашки", - "@commandHint_hug": {}, "cuddleContent": "{senderName} обнимает вас", "@cuddleContent": { "type": "String", @@ -2430,32 +2327,21 @@ } }, "jump": "Перейти", - "@jump": {}, "doNotShowAgain": "Не показывать снова", - "@doNotShowAgain": {}, "newSpaceDescription": "Пространства позволяют объединять Ваши чаты и создавать частные или общедоступные сообщества.", - "@newSpaceDescription": {}, "disableEncryptionWarning": "В целях безопасности Вы не можете отключить шифрование в чате, где оно было включено.", - "@disableEncryptionWarning": {}, "deviceKeys": "Ключи устройств:", - "@deviceKeys": {}, "noBackupWarning": "Внимание! Без резервного копиирования, Вы потеряете доступ к своим зашифрованным сообщениям. Крайне рекомендуется включить резервное копирование перед выходом.", - "@noBackupWarning": {}, "noOtherDevicesFound": "Другие устройства не найдены", - "@noOtherDevicesFound": {}, "reportErrorDescription": "😭 О, нет. Что-то пошло не так. При желании вы можете сообщить об этой ошибке разработчикам.", - "@reportErrorDescription": {}, "report": "пожаловаться", - "@report": {}, "allRooms": "Все группы", "@allRooms": { "type": "String", "placeholders": {} }, "startFirstChat": "Начните Ваш первый чат", - "@startFirstChat": {}, "jumpToLastReadMessage": "Последнее прочитанное сообщение", - "@jumpToLastReadMessage": {}, "wasDirectChatDisplayName": "Пустой чат (был {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2466,11 +2352,8 @@ } }, "encryptThisChat": "Зашифровать этот чат", - "@encryptThisChat": {}, "reopenChat": "Открыть чат заново", - "@reopenChat": {}, "commandHint_googly": "Отправить выпученные глаза", - "@commandHint_googly": {}, "signInWith": "Войти с {provider}", "@signInWith": { "type": "String", @@ -2481,17 +2364,11 @@ } }, "notAnImage": "Это не картинка.", - "@notAnImage": {}, "importNow": "Импортировать сейчас", - "@importNow": {}, "importEmojis": "Импортировать эмодзи", - "@importEmojis": {}, "importFromZipFile": "Импортировать из ZIP-файла", - "@importFromZipFile": {}, "exportEmotePack": "Экспортировать набор эмодзи как ZIP", - "@exportEmotePack": {}, "replace": "Заменить", - "@replace": {}, "googlyEyesContent": "{senderName} выпучил глаза", "@googlyEyesContent": { "type": "String", @@ -2502,37 +2379,21 @@ } }, "signInWithPassword": "Войти с помощью пароля", - "@signInWithPassword": {}, "pleaseTryAgainLaterOrChooseDifferentServer": "Повторите попытку позже или выберите другой сервер.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "sendTypingNotifications": "Отправлять уведомления о наборе текста", - "@sendTypingNotifications": {}, "createGroup": "Создать группу", - "@createGroup": {}, "inviteContactToGroupQuestion": "Вы хотите пригласить {contact} в чат \"{groupName}\"?", - "@inviteContactToGroupQuestion": {}, "tryAgain": "Повторите попытку", - "@tryAgain": {}, "addChatDescription": "Добавить описание чата...", - "@addChatDescription": {}, "chatPermissions": "Права в чате", - "@chatPermissions": {}, "chatDescription": "Описание чата", - "@chatDescription": {}, "chatDescriptionHasBeenChanged": "Описание чата изменено", - "@chatDescriptionHasBeenChanged": {}, "noChatDescriptionYet": "Описание чата не создано.", - "@noChatDescriptionYet": {}, "invalidServerName": "Недопустимое имя сервера", - "@invalidServerName": {}, "optionalRedactReason": "(Необязательно) Причина редактирования...", - "@optionalRedactReason": {}, "redactMessageDescription": "Сообщение будет отредактировано для всех участников. Это необратимо.", - "@redactMessageDescription": {}, "messagesStyle": "Сообщения:", - "@messagesStyle": {}, "shareInviteLink": "Поделиться приглашением", - "@shareInviteLink": {}, "redactedBy": "{username} отредактировал это событие", "@redactedBy": { "type": "String", @@ -2543,11 +2404,8 @@ } }, "directChat": "Личный чат", - "@directChat": {}, "profileNotFound": "Пользователь не найден на сервере. Это может быть проблемой подключения или пользователь не существует.", - "@profileNotFound": {}, "setTheme": "Тема:", - "@setTheme": {}, "redactedByBecause": "{username} отредактировал это событие. Причина: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2561,17 +2419,11 @@ } }, "setChatDescription": "Установить описание чата", - "@setChatDescription": {}, "setColorTheme": "Цветовая тема:", - "@setColorTheme": {}, "invite": "Пригласить", - "@invite": {}, "invitePrivateChat": "📨 Вас пригласили в приватный чат", - "@invitePrivateChat": {}, "inviteGroupChat": "📨 Вас пригласили в групповой чат", - "@inviteGroupChat": {}, "invalidInput": "Недопустимый ввод!", - "@invalidInput": {}, "wrongPinEntered": "Wrong pin entered! Try again in {seconds} seconds...", "@wrongPinEntered": { "type": "String", @@ -2587,17 +2439,11 @@ "placeholders": {} }, "banUserDescription": "Заблокированные в чате пользователи не смогут перезайти в чат, пока они не будут разблокированны.", - "@banUserDescription": {}, "removeDevicesDescription": "Вы выйдете с этого устройства и больше не будете получать сообщения.", - "@removeDevicesDescription": {}, "unbanUserDescription": "Пользователь сможет при желании зайти в чат снова.", - "@unbanUserDescription": {}, "pushNotificationsNotAvailable": "Push-уведомления недоступны", - "@pushNotificationsNotAvailable": {}, "makeAdminDescription": "Как только вы назначите этого пользователя администратором, вы не сможете этого отменить, так как их права доступа и ваши будут одинаковы.", - "@makeAdminDescription": {}, "archiveRoomDescription": "Чат переместится в архив. Другим пользователям будет видно, что вы вышли из чата.", - "@archiveRoomDescription": {}, "hasKnocked": "🚪 {user} постучался", "@hasKnocked": { "placeholders": { @@ -2607,27 +2453,16 @@ } }, "learnMore": "Узнать больше", - "@learnMore": {}, "roomUpgradeDescription": "Затем чат будет воссоздан с новой версией комнаты. Все участники будут уведомлены о необходимости перейти в новый чат. Вы можете узнать больше о версиях комнат на https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, "pleaseEnterANumber": "Пожалуйста введите число больше 0", - "@pleaseEnterANumber": {}, "kickUserDescription": "Пользователь будет изгнан из чата, но не будет заблокирован. В публичных чатах пользователь может перезайти когда угодно.", - "@kickUserDescription": {}, "blockListDescription": "Вы можете заглушить тревожащих вас пользователей. Вы не будете получать сообщения или приглашения в комнату от пользователей из вашего личного чёрного списка.", - "@blockListDescription": {}, "blockedUsers": "Заглушённые пользователи", - "@blockedUsers": {}, "block": "Заглушить", - "@block": {}, "blockUsername": "Игнорировать имя пользователя", - "@blockUsername": {}, "createGroupAndInviteUsers": "Создать и начать приглашать", - "@createGroupAndInviteUsers": {}, "startConversation": "Начать общение", - "@startConversation": {}, "groupCanBeFoundViaSearch": "Группа может быть найдена поиском", - "@groupCanBeFoundViaSearch": {}, "noUsersFoundWithQuery": "К сожалению пользователей с именем \"{query}\" не найдено. Убедитесь, что вы не совершили опечатку.", "@noUsersFoundWithQuery": { "type": "String", @@ -2638,47 +2473,26 @@ } }, "yourGlobalUserIdIs": "Ваш глобальный идентификатор - ", - "@yourGlobalUserIdIs": {}, "commandHint_sendraw": "Отправить сырой json", - "@commandHint_sendraw": {}, "wrongRecoveryKey": "Простите... судя по всему это неверный ключ восстановления.", - "@wrongRecoveryKey": {}, "groupName": "Название группы", - "@groupName": {}, "databaseMigrationTitle": "База данных оптимизированна", - "@databaseMigrationTitle": {}, "searchChatsRooms": "Поиск #чатов, @людей...", - "@searchChatsRooms": {}, "databaseMigrationBody": "Пожалуйста, подождите. Это может занять некоторое время.", - "@databaseMigrationBody": {}, "publicSpaces": "Публичные пространства", - "@publicSpaces": {}, "passwordIsWrong": "Вы ввели неверный пароль", - "@passwordIsWrong": {}, "pleaseEnterYourCurrentPassword": "Пожалуйста, введите свой текущий пароль", - "@pleaseEnterYourCurrentPassword": {}, "publicLink": "Публичная ссылка", - "@publicLink": {}, "nothingFound": "Ничего не найдено...", - "@nothingFound": {}, "newPassword": "Новый пароль", - "@newPassword": {}, "passwordsDoNotMatch": "Пароли не совпадают", - "@passwordsDoNotMatch": {}, "select": "Выбрать", - "@select": {}, "pleaseChooseAStrongPassword": "Пожалуйста, подберите сильный пароль", - "@pleaseChooseAStrongPassword": {}, "leaveEmptyToClearStatus": "Чтобы очистить статус, оставьте поле пустым.", - "@leaveEmptyToClearStatus": {}, "joinSpace": "Присоединиться к пространству", - "@joinSpace": {}, "searchForUsers": "Поиск @пользователей...", - "@searchForUsers": {}, "thisDevice": "Данное устройство:", - "@thisDevice": {}, "decline": "Отклонить", - "@decline": {}, "databaseBuildErrorBody": "Невозможно собрать базу данных SQlite. Приложение пытается использовать старую базу данных. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", "@databaseBuildErrorBody": { "type": "String", @@ -2692,7 +2506,6 @@ } }, "initAppError": "Произошла ошибка при запуске приложения", - "@initAppError": {}, "sessionLostBody": "Ваш сеанс утерян. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", "@sessionLostBody": { "type": "String", @@ -2718,9 +2531,7 @@ } }, "subspace": "Субпространство", - "@subspace": {}, "addChatOrSubSpace": "Добавить чат или субпространство", - "@addChatOrSubSpace": {}, "youInvitedToBy": "📩 Вы были приглашены по ссылке на:\n{alias}", "@youInvitedToBy": { "placeholders": { @@ -2730,11 +2541,8 @@ } }, "sendReadReceipts": "Отправка квитанций о прочтении", - "@sendReadReceipts": {}, "verifyOtherUser": "🔐 Подтвердить другого пользователя", - "@verifyOtherUser": {}, "verifyOtherDevice": "🔐 Подтвердить другое устройство", - "@verifyOtherDevice": {}, "forwardMessageTo": "Переслать сообщение в {roomName}?", "@forwardMessageTo": { "type": "String", @@ -2745,15 +2553,10 @@ } }, "sendReadReceiptsDescription": "Другие участники чата могут видеть, когда вы прочитали сообщение.", - "@sendReadReceiptsDescription": {}, "transparent": "Прозрачный", - "@transparent": {}, "verifyOtherUserDescription": "Если вы подтвердите другого пользователя, то вы можете быть уверены зная, кому вы действительно пишете. 💪\n\nКогда вы начинаете подтверждение, вы и другой пользователь увидите всплывающее окно в приложении. Там вы увидите ряд чисел или эмодзи, которые вы должны сравнить друг с другом.\n\nЛучший способ сделать это - встретиться в реальной жизни или по видео звонку. 👭", - "@verifyOtherUserDescription": {}, "verifyOtherDeviceDescription": "При подтверждении другого устройства эти устройства могут обмениваться ключами, повышая общую безопасность. 💪 При запуске подтверждения в приложении на обоих устройствах появится всплывающее окно. Там вы увидите ряд чисел или эмодзи, которые вы должны сравнить друг с другом. Лучше иметь оба устройства под рукой перед началом проверки. 🤳", - "@verifyOtherDeviceDescription": {}, "formattedMessagesDescription": "Отображать содержимое расширенных сообщений, такой как жирный текст, с помощью Markdown.", - "@formattedMessagesDescription": {}, "acceptedKeyVerification": "{sender} принял(а) подтверждение ключей", "@acceptedKeyVerification": { "type": "String", @@ -2773,9 +2576,7 @@ } }, "sendTypingNotificationsDescription": "Другие участники чата могут видеть, когда вы набираете новое сообщение.", - "@sendTypingNotificationsDescription": {}, "formattedMessages": "Форматированные сообщения", - "@formattedMessages": {}, "startedKeyVerification": "{sender} начал(а) подтверждение ключей", "@startedKeyVerification": { "type": "String", @@ -2813,7 +2614,6 @@ } }, "incomingMessages": "Входящие сообщения", - "@incomingMessages": {}, "presencesToggle": "Показывать сообщения в статусах других пользователей", "@presencesToggle": { "type": "String", @@ -2825,49 +2625,27 @@ "placeholders": {} }, "hidePresences": "Скрыть список статусов?", - "@hidePresences": {}, "stickers": "Стикеры", - "@stickers": {}, "discover": "Исследовать", - "@discover": {}, "globalChatId": "ID глобального чата", - "@globalChatId": {}, "customEmojisAndStickersBody": "Добавить или поделиться пользовательскими эмодзи или стикерами, которые могут быть применены в любом чате.", - "@customEmojisAndStickersBody": {}, "hideMemberChangesInPublicChatsBody": "Для улучшения читаемости не показывать на временной шкале входы и выходы из чата.", - "@hideMemberChangesInPublicChatsBody": {}, "knocking": "Стучаться", - "@knocking": {}, "accessAndVisibility": "Доступность и видимость", - "@accessAndVisibility": {}, "publicChatAddresses": "Адресы публичного чата", - "@publicChatAddresses": {}, "accessAndVisibilityDescription": "Кому разрешено войти в этот чат и как этот чат может быть обнаружен.", - "@accessAndVisibilityDescription": {}, "userRole": "Роль пользователя", - "@userRole": {}, "noDatabaseEncryption": "Шифрование базы данных не поддерживается на этой платформе", - "@noDatabaseEncryption": {}, "appLockDescription": "Заблокировать приложение когда не используется пин код", - "@appLockDescription": {}, "calls": "Звонки", - "@calls": {}, "customEmojisAndStickers": "Пользовательские эмодзи и стикеры", - "@customEmojisAndStickers": {}, "hideRedactedMessages": "Скрыть редактированные сообщения", - "@hideRedactedMessages": {}, "hideInvalidOrUnknownMessageFormats": "Скрыть неправильные или неизвестные форматы сообщения", - "@hideInvalidOrUnknownMessageFormats": {}, "hideRedactedMessagesBody": "Если кто-то редактирует сообщение, оно будет скрыто в чате.", - "@hideRedactedMessagesBody": {}, "hideMemberChangesInPublicChats": "Скрыть изменения участников в публичных чатах", - "@hideMemberChangesInPublicChats": {}, "overview": "Обзор", - "@overview": {}, "notifyMeFor": "Уведомлять меня о", - "@notifyMeFor": {}, "passwordRecoverySettings": "Настройки восстановления пароля", - "@passwordRecoverySettings": {}, "userWouldLikeToChangeTheChat": "{user} желает присоединиться к чату.", "@userWouldLikeToChangeTheChat": { "placeholders": { @@ -2877,13 +2655,9 @@ } }, "knock": "Постучаться", - "@knock": {}, "usersMustKnock": "Пользователи должны постучаться", - "@usersMustKnock": {}, "noOneCanJoin": "Никто не может присоединиться", - "@noOneCanJoin": {}, "noPublicLinkHasBeenCreatedYet": "Публичная ссылка еще не была создана", - "@noPublicLinkHasBeenCreatedYet": {}, "chatCanBeDiscoveredViaSearchOnServer": "Чат может быть обнаружен через поиск в {server}", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2894,7 +2668,6 @@ } }, "createNewAddress": "Создать новый адрес", - "@createNewAddress": {}, "minimumPowerLevel": "{level} является минимальным уровнем.", "@minimumPowerLevel": { "type": "String", @@ -2905,13 +2678,9 @@ } }, "commandHint_ignore": "Игнорировать данный matrix ID", - "@commandHint_ignore": {}, "commandHint_unignore": "Не игнорировать данный matrix ID", - "@commandHint_unignore": {}, "restricted": "Запрещено", - "@restricted": {}, "knockRestricted": "Стук запрещен", - "@knockRestricted": {}, "searchIn": "Поиск в чате \"{chat}\"...", "@searchIn": { "type": "String", @@ -2922,13 +2691,9 @@ } }, "searchMore": "Найти еще...", - "@searchMore": {}, "gallery": "Галерея", - "@gallery": {}, "files": "Файлы", - "@files": {}, "swipeRightToLeftToReply": "Для ответа проведите справа налево", - "@swipeRightToLeftToReply": {}, "userLevel": "{level} - Пользователь", "@userLevel": { "type": "String", @@ -2957,32 +2722,21 @@ } }, "changeGeneralChatSettings": "Изменить общие настройки чата", - "@changeGeneralChatSettings": {}, "changeTheChatPermissions": "Изменить права доступа к чату", - "@changeTheChatPermissions": {}, "changeTheDescriptionOfTheGroup": "Изменить описание чата", - "@changeTheDescriptionOfTheGroup": {}, "inviteOtherUsers": "Пригласить других пользователей в этот чат", - "@inviteOtherUsers": {}, "changeTheVisibilityOfChatHistory": "Изменить видимость истории чата", - "@changeTheVisibilityOfChatHistory": {}, "unread": "Непрочитанные", - "@unread": {}, "space": "Пространство", - "@space": {}, "spaces": "Пространства", - "@spaces": {}, "markAsUnread": "Отметить как непрочитанное", - "@markAsUnread": {}, "goToSpace": "Перейти к пространству: {space}", "@goToSpace": { "type": "String", "space": {} }, "sendCanceled": "Отправка отменена", - "@sendCanceled": {}, "noChatsFoundHere": "Не было найдено ни одного чата. Начать с кем-нибудь новый чат можно, нажав кнопку ниже. ⤵️", - "@noChatsFoundHere": {}, "updateInstalled": "🎉 Обновление {version} успешно установлено!", "@updateInstalled": { "type": "String", @@ -2993,7 +2747,6 @@ } }, "changelog": "Список изменений", - "@changelog": {}, "invitedBy": "📩 Приглашен(а) {user}", "@invitedBy": { "placeholders": { @@ -3003,45 +2756,27 @@ } }, "doesNotSeemToBeAValidHomeserver": "Этот домашний сервер выглядит несовместимым. Нет ли в ссылке опечаток?", - "@doesNotSeemToBeAValidHomeserver": {}, "noMoreChatsFound": "Больше чатов не обнаружено...", - "@noMoreChatsFound": {}, "alwaysUse24HourFormat": "true", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, "compressVideo": "Сжатие видео...", - "@compressVideo": {}, "oneOfYourDevicesIsNotVerified": "Одно из ваших устройств не подтверждено", - "@oneOfYourDevicesIsNotVerified": {}, "chatPermissionsDescription": "Задайте уровень власти, необходимый для совершения определённых действий в этом чате. Уровни власти 0, 50 и 100 обычно означают пользователей, модераторов и администраторов соответственно, но любая градация также возможна.", - "@chatPermissionsDescription": {}, "prepareSendingAttachment": "Подготовка к отправке вложения...", - "@prepareSendingAttachment": {}, "sendRoomNotifications": "Упоминать @room", - "@sendRoomNotifications": {}, "calculatingFileSize": "Вычисление размера файла...", - "@calculatingFileSize": {}, "sendingAttachment": "Отправка вложения...", - "@sendingAttachment": {}, "generatingVideoThumbnail": "Создание превью видео...", - "@generatingVideoThumbnail": {}, "noticeChatBackupDeviceVerification": "Примечание: Если вы подключите все свои устройства к резервному копированию чатов, то они автоматически станут подтверждёнными.", - "@noticeChatBackupDeviceVerification": {}, "changeTheCanonicalRoomAlias": "Изменить основной общедоступный адрес чата", - "@changeTheCanonicalRoomAlias": {}, "loginWithMatrixId": "Войти через Matrix ID", - "@loginWithMatrixId": {}, "whatIsAHomeserver": "Для чего нужен домашний сервер?", - "@whatIsAHomeserver": {}, "homeserverDescription": "Все ваши данные хранятся на домашнем сервере, прямо как у вашего провайдера электронной почты. Вы можете выбрать, какому серверу вы их доверите, при этом сохраняя возможность общаться со всеми. Узнайте больше на https://matrix.org.", - "@homeserverDescription": {}, "discoverHomeservers": "Список домашних серверов", - "@discoverHomeservers": {}, "joinedChats": "Вступленные чаты", - "@joinedChats": {}, "serverInformation": "Информация о сервере:", - "@serverInformation": {}, "sendingAttachmentCountOfCount": "Отправляется вложение {index} из {length}...", "@sendingAttachmentCountOfCount": { "type": "integer", @@ -3055,9 +2790,7 @@ } }, "welcomeText": "Привет. Это FluffyChat. Вы можете подписаться на любой сервер, который совместим с https://matrix.org. А потом поболтать с кем нибудь. Это огромная децентрализованная сеть обмена сообщениями!", - "@welcomeText": {}, "noContactInformationProvided": "Сервер не предоставляет никакой правдивой контактной информации", - "@noContactInformationProvided": {}, "aboutHomeserver": "О сервере {homeserver}", "@aboutHomeserver": { "type": "String", @@ -3068,41 +2801,23 @@ } }, "boldText": "Жирный шрифт", - "@boldText": {}, "strikeThrough": "Перечёркнутый", - "@strikeThrough": {}, "pleaseFillOut": "Пожалуйста, заполните", - "@pleaseFillOut": {}, "invalidUrl": "Не верный URL", - "@invalidUrl": {}, "addLink": "Добавить ссылку", - "@addLink": {}, "italicText": "Italic", - "@italicText": {}, "unableToJoinChat": "Невозможно присоединиться к чату. Возможно, другая сторона уже закончила разговор.", - "@unableToJoinChat": {}, "continueText": "Продолжить", - "@continueText": {}, "blur": "Размытие:", - "@blur": {}, "opacity": "Прозрачность:", - "@opacity": {}, "setWallpaper": "Установить обои", - "@setWallpaper": {}, "manageAccount": "Управление аккаунтом", - "@manageAccount": {}, "contactServerAdmin": "Админ сервера", - "@contactServerAdmin": {}, "contactServerSecurity": "Безопасность контактов сервера", - "@contactServerSecurity": {}, "supportPage": "Поддержка", - "@supportPage": {}, "name": "Имя", - "@name": {}, "version": "Версия", - "@version": {}, "website": "Сайт", - "@website": {}, "sendImages": "Отправить {count} изображение", "@sendImages": { "type": "String", @@ -3113,39 +2828,22 @@ } }, "compress": "Сжатие", - "@compress": {}, "notificationRuleMessage": "Сообщение", - "@notificationRuleMessage": {}, "appWantsToUseForLoginDescription": "Вы позволяете приложению и веб-сайту делиться информацией о вас.", - "@appWantsToUseForLoginDescription": {}, "newChatRequest": "📩 Запрос нового чата", - "@newChatRequest": {}, "allDevices": "Все устройства", - "@allDevices": {}, "roomNotificationSettings": "Настройки уведомлений комнаты", - "@roomNotificationSettings": {}, "notificationRuleContainsUserName": "Содержит имя пользователя", - "@notificationRuleContainsUserName": {}, "notificationRuleMaster": "Отключить все уведомления", - "@notificationRuleMaster": {}, "notificationRuleSuppressNoticesDescription": "Отключить уведомления от автоматизированных клиентов, таких как боты.", - "@notificationRuleSuppressNoticesDescription": {}, "notificationRuleInviteForMe": "Приглашение для меня", - "@notificationRuleInviteForMe": {}, "notificationRuleMemberEventDescription": "Отключить уведомления о событиях о членстве.", - "@notificationRuleMemberEventDescription": {}, "notificationRuleIsRoomMention": "Упоминание комнаты", - "@notificationRuleIsRoomMention": {}, "notificationRuleReactionDescription": "Отключить уведомления о реакциях.", - "@notificationRuleReactionDescription": {}, "notificationRuleCall": "Звонок", - "@notificationRuleCall": {}, "notificationRuleSuppressEditsDescription": "Отключить уведомления о отредактированных сообщениях.", - "@notificationRuleSuppressEditsDescription": {}, "notificationRuleEncrypted": "Зашифровано", - "@notificationRuleEncrypted": {}, "more": "Больше", - "@more": {}, "synchronizingPleaseWaitCounter": " Синхронизация… ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -3165,61 +2863,33 @@ } }, "contentNotificationSettings": "Настройки уведомлений по тексту", - "@contentNotificationSettings": {}, "generalNotificationSettings": "Общие настройки уведомлений", - "@generalNotificationSettings": {}, "userSpecificNotificationSettings": "Настроки уведомлений пользователя", - "@userSpecificNotificationSettings": {}, "otherNotificationSettings": "Другие настройки уведомлений", - "@otherNotificationSettings": {}, "notificationRuleContainsUserNameDescription": "Уведомляет пользователя, когда сообщение содержит его имя пользователя.", - "@notificationRuleContainsUserNameDescription": {}, "notificationRuleMasterDescription": "Перекрывает все другие правила и отключает все уведомления.", - "@notificationRuleMasterDescription": {}, "notificationRuleSuppressNotices": "Отключить автоматические сообщения", - "@notificationRuleSuppressNotices": {}, "notificationRuleIsUserMention": "Упоминание пользователя", - "@notificationRuleIsUserMention": {}, "notificationRuleContainsDisplayName": "Содержит отображаемое имя", - "@notificationRuleContainsDisplayName": {}, "notificationRuleReaction": "Реакция", - "@notificationRuleReaction": {}, "takeAPhoto": "Снять фото", - "@takeAPhoto": {}, "recordAVideo": "Записать видео", - "@recordAVideo": {}, "enterNewChat": "Введите новый чат", - "@enterNewChat": {}, "otherPartyNotLoggedIn": "Другая сторона в настоящее время не вошла в систему и поэтому не может получать сообщения!", - "@otherPartyNotLoggedIn": {}, "open": "Открыть", - "@open": {}, "waitingForServer": "Ожидание сервера...", - "@waitingForServer": {}, "appIntroduction": "FluffyChat позволяет вам общаться с друзьями с разными мессенджерами. Узнайте больше на https://matrix.org или просто нажмите *Продолжить*.", - "@appIntroduction": {}, "previous": "Предыдущий", - "@previous": {}, "notificationRuleCallDescription": "Уведомляет пользователя про звонки.", - "@notificationRuleCallDescription": {}, "notificationRuleEncryptedRoomOneToOne": "Шифрованная комната «Один на один»", - "@notificationRuleEncryptedRoomOneToOne": {}, "notificationRuleEncryptedRoomOneToOneDescription": "Уведомляет пользователя про сообщение в зашифрованных комнатах «Один на один».", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, "notificationRuleRoomOneToOne": "Комната «Один на один»", - "@notificationRuleRoomOneToOne": {}, "setCustomPermissionLevel": "Установить уровень пользовательских разрешений", - "@setCustomPermissionLevel": {}, "setPermissionsLevelDescription": "Выберите одну из стандартных ролей ниже или введите произвольный уровень прав от 0 до 100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Заглушить пользователя", - "@ignoreUser": {}, "normalUser": "Обычный пользователь", - "@normalUser": {}, "commandHint_roomupgrade": "Обновить комнату до указанной версии", - "@commandHint_roomupgrade": {}, "notificationRuleInviteForMeDescription": "Уведомляет пользователя, когда его приглашают в комнату.", - "@notificationRuleInviteForMeDescription": {}, "unknownPushRule": "Неизвестное правило оповещения '{rule}'", "@unknownPushRule": { "type": "String", @@ -3230,47 +2900,26 @@ } }, "checkList": "Контрольный список", - "@checkList": {}, "changedTheChatDescription": "{username} изменил описание чата", - "@changedTheChatDescription": {}, "changedTheChatName": "{username} изменил(а) имя чата", - "@changedTheChatName": {}, "notificationRuleMemberEvent": "Мероприятие участника", - "@notificationRuleMemberEvent": {}, "notificationRuleIsUserMentionDescription": "Уведомляет пользователя, когда он упоминается непосредственно в сообщении.", - "@notificationRuleIsUserMentionDescription": {}, "notificationRuleContainsDisplayNameDescription": "Уведомляет пользователя, когда сообщение содержит его имя отображения.", - "@notificationRuleContainsDisplayNameDescription": {}, "notificationRuleIsRoomMentionDescription": "Уведомляет пользователя о наличии упоминания о комнате.", - "@notificationRuleIsRoomMentionDescription": {}, "notificationRuleRoomnotif": "Уведомление о комнате", - "@notificationRuleRoomnotif": {}, "notificationRuleRoomnotifDescription": "Уведомляет пользователя, когда сообщение содержит '@room'.", - "@notificationRuleRoomnotifDescription": {}, "notificationRuleTombstone": "Надгробный камень", - "@notificationRuleTombstone": {}, "notificationRuleTombstoneDescription": "Уведомляет пользователя о сообщениях о деактивации комнаты.", - "@notificationRuleTombstoneDescription": {}, "notificationRuleRoomServerAcl": "ACL сервера комнаты", - "@notificationRuleRoomServerAcl": {}, "notificationRuleRoomServerAclDescription": "Удаляет уведомления о списках контроля доступа к серверу комнат (ACL).", - "@notificationRuleRoomServerAclDescription": {}, "notificationRuleSuppressEdits": "Подавление правки", - "@notificationRuleSuppressEdits": {}, "notificationRuleRoomOneToOneDescription": "Уведомляет пользователя о сообщениях в разделах один на один.", - "@notificationRuleRoomOneToOneDescription": {}, "notificationRuleMessageDescription": "Уведомляет пользователя об общих сообщениях.", - "@notificationRuleMessageDescription": {}, "notificationRuleEncryptedDescription": "Уведомляет пользователя о сообщениях в зашифрованных комнатах.", - "@notificationRuleEncryptedDescription": {}, "notificationRuleJitsi": "Джици", - "@notificationRuleJitsi": {}, "notificationRuleJitsiDescription": "Уведомляет пользователя о событиях виджета Jitsi.", - "@notificationRuleJitsiDescription": {}, "notificationRuleServerAcl": "Запретить события ACL сервера", - "@notificationRuleServerAcl": {}, "notificationRuleServerAclDescription": "Удаляет уведомления о событиях ACL сервера.", - "@notificationRuleServerAclDescription": {}, "sentVoiceMessage": "️🎙️ {duration} - Голосовое сообщение от {sender}", "@sentVoiceMessage": { "type": "String", @@ -3284,57 +2933,31 @@ } }, "deletePushRuleCanNotBeUndone": "Если вы удалите эту настройку уведомлений, это невозможно отменить.", - "@deletePushRuleCanNotBeUndone": {}, "shareKeysWith": "Поделиться ключами с...", - "@shareKeysWith": {}, "shareKeysWithDescription": "Каким устройствам следует доверять, чтобы они могли читать ваши сообщения в зашифрованных чатах?", - "@shareKeysWithDescription": {}, "crossVerifiedDevicesIfEnabled": "Если включено, перекрестите проверенные устройства", - "@crossVerifiedDevicesIfEnabled": {}, "crossVerifiedDevices": "Кросс-верифицированные устройства", - "@crossVerifiedDevices": {}, "verifiedDevicesOnly": "Только проверенные устройства", - "@verifiedDevicesOnly": {}, "optionalMessage": "(Необязательно) сообщение...", - "@optionalMessage": {}, "notSupportedOnThisDevice": "Не поддерживается на этом устройстве", - "@notSupportedOnThisDevice": {}, "approve": "Утверждать", - "@approve": {}, "youHaveKnocked": "Вы постучали", - "@youHaveKnocked": {}, "pleaseWaitUntilInvited": "Пожалуйста, подождите, пока кто-нибудь из комнаты не пригласит вас.", - "@pleaseWaitUntilInvited": {}, "commandHint_logout": "Выйти из текущего устройства", - "@commandHint_logout": {}, "commandHint_logoutall": "Выйти из всех активных устройств", - "@commandHint_logoutall": {}, "displayNavigationRail": "Показать навигационный рельс на мобильном устройстве", - "@displayNavigationRail": {}, "customReaction": "Пользовательская реакция", - "@customReaction": {}, "moreEvents": "Больше событий", - "@moreEvents": {}, "declineInvitation": "Отказаться от приглашения", - "@declineInvitation": {}, "noMessagesYet": "Пока нет сообщений", - "@noMessagesYet": {}, "longPressToRecordVoiceMessage": "Нажмите длиннее, чтобы записать голосовое сообщение.", - "@longPressToRecordVoiceMessage": {}, "pause": "Пауза", - "@pause": {}, "resume": "Резюмировать", - "@resume": {}, "newSubSpace": "Новое подпространство", - "@newSubSpace": {}, "moveToDifferentSpace": "Переместить в другое пространство", - "@moveToDifferentSpace": {}, "moveUp": "Переместить вверх", - "@moveUp": {}, "moveDown": "Переместить вниз", - "@moveDown": {}, "removeFromSpaceDescription": "Чат будет удален из пространства, но все равно появится в вашем списке чатов.", - "@removeFromSpaceDescription": {}, "countChats": "{chats} чатов", "@countChats": { "type": "String", @@ -3363,7 +2986,6 @@ } }, "donate": "Пожертвовать", - "@donate": {}, "startedAPoll": "{username} начал опрос.", "@startedAPoll": { "type": "String", @@ -3374,55 +2996,31 @@ } }, "poll": "Опрос", - "@poll": {}, "startPoll": "Начать опрос", - "@startPoll": {}, "endPoll": "Завершить опрос", - "@endPoll": {}, "answersVisible": "Ответы видны", - "@answersVisible": {}, "answersHidden": "Ответы скрыты", - "@answersHidden": {}, "pollQuestion": "Вопрос по опросу", - "@pollQuestion": {}, "answerOption": "Вариант ответа", - "@answerOption": {}, "addAnswerOption": "Добавить вариант ответа", - "@addAnswerOption": {}, "allowMultipleAnswers": "Разрешить несколько ответов", - "@allowMultipleAnswers": {}, "pollHasBeenEnded": "Опрос завершен", - "@pollHasBeenEnded": {}, "answersWillBeVisibleWhenPollHasEnded": "Ответы будут видны после завершения опроса", - "@answersWillBeVisibleWhenPollHasEnded": {}, "replyInThread": "Ответить в потоке", - "@replyInThread": {}, "thread": "Нить", - "@thread": {}, "backToMainChat": "Вернуться в основной чат", - "@backToMainChat": {}, "saveChanges": "Сохранить изменения", - "@saveChanges": {}, "createSticker": "Создать стикер или эмоджи", - "@createSticker": {}, "useAsSticker": "Использовать как стикер", - "@useAsSticker": {}, "useAsEmoji": "Использовать в качестве эмоджи", - "@useAsEmoji": {}, "stickerPackNameAlreadyExists": "Имя набора стикеров уже существует", - "@stickerPackNameAlreadyExists": {}, "newStickerPack": "Новая упаковка стикеров", - "@newStickerPack": {}, "stickerPackName": "Имя упаковки стикеров", - "@stickerPackName": {}, "attribution": "Атрибуция", - "@attribution": {}, "skipChatBackup": "Пропустить резервную копию чата", - "@skipChatBackup": {}, "skipChatBackupWarning": "Вы уверены? Без включения резервного копирования чата вы можете потерять доступ к своим сообщениям, если переключите устройство.", - "@skipChatBackupWarning": {}, "loadingMessages": "Загрузка сообщений", - "@loadingMessages": {}, "setupChatBackup": "Настроить резервную копию чата", - "@setupChatBackup": {} + "createNewAccount": "Создать новый аккаунт", + "theProcessWasCanceled": "Процесс был отменен." } From 4d5211820ee0e768c66ce8d774ebea8c3f402f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Caras?= Date: Wed, 11 Feb 2026 14:42:12 +0100 Subject: [PATCH 077/333] chore(translations): Translated using Weblate (Czech) Currently translated at 92.0% (773 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/cs/ --- lib/l10n/intl_cs.arb | 283 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 258 insertions(+), 25 deletions(-) diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb index a2e42f30..4b4660a1 100644 --- a/lib/l10n/intl_cs.arb +++ b/lib/l10n/intl_cs.arb @@ -491,12 +491,12 @@ }, "description": "State that {command} is not a valid /command." }, - "compareEmojiMatch": "Porovnejte a přesvědčete se, že následující emotikony se shodují na obou zařízeních:", + "compareEmojiMatch": "Porovnejte a přesvědčete se, že následující emotikony se shodují na obou zařízeních", "@compareEmojiMatch": { "type": "String", "placeholders": {} }, - "compareNumbersMatch": "Porovnejte a přesvědčete se, že následující čísla se shodují na obou zařízeních:", + "compareNumbersMatch": "Porovnejte a přesvědčete se, že následující čísla se shodují na obou zařízeních", "@compareNumbersMatch": { "type": "String", "placeholders": {} @@ -997,7 +997,7 @@ "type": "String", "placeholders": {} }, - "inviteText": "{username} vás pozvali na FluffyChat.\n1. Navštivte fluffychat.im a nainstalujte si aplikaci.\n2. Zaregistrujte se anebo se přihlašte.\n3. Otevřete pozvánku: \n {link}", + "inviteText": "{username} vás pozval/a na FluffyChat.\n1. Navštivte fluffychat.im a nainstalujte si aplikaci.\n2. Zaregistrujte se nebo se přihlaste.\n3. Otevřte pozvánku: \n {link}", "@inviteText": { "type": "String", "placeholders": { @@ -1014,7 +1014,7 @@ "type": "String", "placeholders": {} }, - "joinedTheChat": "👋 {username} se připojil/a k chatu", + "joinedTheChat": "👋 {username} se připojil/a do konverzace", "@joinedTheChat": { "type": "String", "placeholders": { @@ -1040,7 +1040,7 @@ } } }, - "kickedAndBanned": "{username} vyhodili a zakázali {targetName}", + "kickedAndBanned": "{username} vyhodil/a a zabanoval/a {targetName}", "@kickedAndBanned": { "type": "String", "placeholders": { @@ -1169,7 +1169,7 @@ "type": "String", "placeholders": {} }, - "newMessageInFluffyChat": "Nová zpráva ve FluffyChatu", + "newMessageInFluffyChat": "💬 Nová zpráva ve FluffyChatu", "@newMessageInFluffyChat": { "type": "String", "placeholders": {} @@ -2252,7 +2252,7 @@ "widgetNameError": "Zadejte jméno pro zobrazení.", "errorAddingWidget": "Chyba při přidávání widgetu.", "disableEncryptionWarning": "Z bezpečnostních důvodů nemůžete vypnout šifrování v chatu, kde již bylo dříve zapnuto.", - "confirmMatrixId": "Prosím, potvrďte vaše Matrix ID, abyste mohli smazat váš účet.", + "confirmMatrixId": "Pro smazání svého účtu potvrďte, prosím, své Matrix ID.", "commandHint_googly": "Poslat kroutící se očička", "commandHint_cuddle": "Poslat mazlení", "commandHint_hug": "Poslat obejmutí", @@ -2298,7 +2298,7 @@ } }, "storeInAndroidKeystore": "Uložit v Android KeyStore", - "dehydrateTorLong": "Uživatelům TOR se doporučuje exportovat sezení před zavřením okna.", + "dehydrateTorLong": "Uživatelům TOR se doporučuje exportovat relaci před zavřením okna.", "numChats": "{number} konverzací", "@numChats": { "type": "number", @@ -2308,22 +2308,22 @@ } } }, - "dehydrate": "Exportovat sezení a promazat zařízení", + "dehydrate": "Exportovat relaci a promazat zařízení", "newGroup": "Nová skupina", - "hydrateTor": "TOR uživatelé: Import exportovaného sezení", + "hydrateTor": "TOR uživatelé: Import exportovanou relaci", "doNotShowAgain": "Nezobrazovat znovu", "commandHint_markasdm": "Označit jako místnost přímé konverzace s daným Matrix ID", "recoveryKey": "Klíč k obnovení", - "hydrateTorLong": "Exportovali jste vaše poslední sezení na TOR? Rychle jej importujte a pokračujte v konverzaci.", - "hydrate": "Obnovit ze záložního souboru", + "hydrateTorLong": "Exportovali jste vaši poslední relaci na TOR? Rychle ji importujte a pokračujte v konverzaci.", + "hydrate": "Obnovit ze souboru zálohy", "pleaseEnterRecoveryKey": "Prosím vložte váš klíč pro obnovení:", "createGroup": "Vytvořit skupinu", "shareInviteLink": "Sdílet pozvánku", "pleaseEnterRecoveryKeyDescription": "K odemknutí vašich starých zpráv prosím vložte váš klíč k obnovení vygenerovaný v předchozím sezení. Váš klíč k obnovení NENÍ vaše heslo.", "setColorTheme": "Nastavit barvy:", - "importEmojis": "Importovat Emoji", + "importEmojis": "Importovat emodži", "importFromZipFile": "Importovat ze .zip souboru", - "exportEmotePack": "Exportovat Emoji jako .zip", + "exportEmotePack": "Exportovat emodži jako .zip", "replace": "Nahradit", "users": "Uživatelé", "storeInAppleKeyChain": "Uložit v Apple KeyChain", @@ -2339,7 +2339,7 @@ } }, "inviteContactToGroupQuestion": "Chcete pozvat {contact} do konverzace \"{groupName}\"?", - "dehydrateTor": "TOR uživatelé: Export sezení", + "dehydrateTor": "TOR uživatelé: Export relace", "tryAgain": "Zkuste to znovu", "redactMessageDescription": "Tato zpráva bude smazána pro všechny účastníky konverzace. Tuto akci nelze vzít zpět.", "optionalRedactReason": "(Nepovinné) Důvod smazání této zprávy…", @@ -2422,7 +2422,7 @@ } }, "custom": "Vlastní", - "dehydrateWarning": "Tuto akci nelze vzít zpět. Ujistěte se že záložní soubor máte bezpečně uložen.", + "dehydrateWarning": "Tuto akci nelze vzít zpět. Ujistěte se, že máte bezpečně uložený soubor zálohy.", "storeInSecureStorageDescription": "Klíč k obnovení uložte v zabezpečeném úložišti tohoto zařízení.", "saveKeyManuallyDescription": "Uložte tento klíč manuálně pomocí systémového dialogu sdílení nebo zkopírováním do schránky.", "storeSecurlyOnThisDevice": "Uložit bezpečně na tomto zařízení", @@ -2434,7 +2434,7 @@ } } }, - "emoteKeyboardNoRecents": "Naposledy použité emoce se zobrazí zde...", + "emoteKeyboardNoRecents": "Naposledy použité emodži se zobrazí zde...", "@emoteKeyboardNoRecents": { "type": "String", "placeholders": {} @@ -2443,10 +2443,10 @@ "globalChatId": "Globální ID chatu", "accessAndVisibility": "Přístup a viditelnost", "calls": "Volání", - "customEmojisAndStickers": "Vlastní emoji a nálepky", + "customEmojisAndStickers": "Vlastní emodži a nálepky", "accessAndVisibilityDescription": "Kdo se může připojit a najít tuto konverzaci.", - "customEmojisAndStickersBody": "Přidat nebo sdílet vlastní emoji nebo nálepky, které mohou být použité v konverzaci.", - "swipeRightToLeftToReply": "Potáhněte z prava do leva pro odpověď", + "customEmojisAndStickersBody": "Přidat nebo sdílet vlastní emodži či nálepky, které lze použít v konverzaci.", + "swipeRightToLeftToReply": "Potáhnutím zprava doleva odpovědět na zprávu", "countChatsAndCountParticipants": "{chats} konverzaci a {participants} účastníci", "@countChatsAndCountParticipants": { "type": "String", @@ -2462,7 +2462,7 @@ "noMoreChatsFound": "Žádné další konverzace nalezeny...", "hideRedactedMessages": "Skrýt upravené zprávy", "hideRedactedMessagesBody": "Pokud někdo zprávu zrediguje, nebude tato zpráva v chatu již viditelná.", - "hideInvalidOrUnknownMessageFormats": "Skrytí nesprávných nebo neznámých formátů zpráv", + "hideInvalidOrUnknownMessageFormats": "Skrýt nesprávné nebo neznámé formáty zpráv", "blockUsername": "Ignorovat uživatelské jméno", "hideMemberChangesInPublicChats": "Skrýt změny členů ve veřejných chatech", "hideMemberChangesInPublicChatsBody": "Nezobrazovat na časové ose chatu, pokud se někdo připojí nebo opustí veřejný chat, aby se zlepšila čitelnost.", @@ -2474,7 +2474,7 @@ "type": "String", "placeholders": {} }, - "block": "Blokovat", + "block": "Zablokovat", "indexedDbErrorLong": "Ukládání zpráv bohužel není ve výchozím nastavení v soukromém režimu povoleno.\nNavštivte prosím\n - about:config\n - nastavte dom.indexedDB.privateBrowsing.enabled na true\nV opačném případě nebude možné FluffyChat spustit.", "youInvitedToBy": "📩 Prostřednictvím odkazu jste byli pozváni na:\n{alias}", "@youInvitedToBy": { @@ -2491,7 +2491,7 @@ "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, - "noChatsFoundHere": "Nejsou zde žádné chaty. Začněte nový chat s někým, použitím níže uvedeného tlačítka. ⤵️", + "noChatsFoundHere": "Nejsou zde žádné konverzace. Začněte novou konverzaci s někým pomocí tlačítka níže. ⤵️", "joinedChats": "Připojené chaty", "unread": "Nepřečtené", "space": "Prostor", @@ -2707,7 +2707,7 @@ "verifyOtherUserDescription": "Když ověříte jiného uživatele, můžete si být jistí, že víte, s kým si píšete. 💪\n\nJakmile začnete s ověřením, vy a druhý uživatel uvidíte v aplikaci vyskakovací okno. V něm uvidíte sérii emodži nebo čísel, které musíte společně porovnat.\n\nNejjednodušší je setkat se osobně nebo si udělat videohovor. 👭", "verifyOtherDevice": "🔐 Ověřit jiné zařízení", "verifyOtherDeviceDescription": "Když ověříte jiné zařízení, tato zařízení si mohou vyměnit klíče, čímž zvýšíte vaše zabezpečení. 💪 Jakmile začnete s ověřením, v aplikaci na obou zařízeních se objeví vyskakovací okno. V něm uvidíte sérii emodži nebo čísel, které musíte na zařízeních porovnat mezi sebou. Než začnete s ověřováním, je fajn mít obě zařízení po ruce. 🤳", - "acceptedKeyVerification": "{sender} přijal ověření klíče", + "acceptedKeyVerification": "{sender} přijal/a ověření klíče", "@acceptedKeyVerification": { "type": "String", "placeholders": { @@ -2760,5 +2760,238 @@ "type": "String" } } - } + }, + "prepareSendingAttachment": "Připravuji odeslání přílohy...", + "sendingAttachment": "Posílám přílohu...", + "generatingVideoThumbnail": "Vytvářím náhledový obrázek videa...", + "compressVideo": "Komprimuji video...", + "sendingAttachmentCountOfCount": "Odesílám přílohu {index} z {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "Dosažen limit serveru! Čekám {seconds} sekund...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Jedno z vašich zařízení není ověřeno", + "continueText": "Pokračovat", + "welcomeText": "Ahoj, ahoj 👋 Tohle je FluffyChat. Můžete se přihlásit k jakémukoliv domácímu serveru, který je kompatibilní s https://matrix.org, a začít s kýmkoliv chatovat. Je to obří decentralizovaná chatovací síť!", + "setWallpaper": "Nastavit tapetu", + "manageAccount": "Spravovat účet", + "noContactInformationProvided": "Server neposkytl žádné platné kontaktní informace", + "contactServerAdmin": "Kontaktovat administrátora serveru", + "supportPage": "Podpora", + "serverInformation": "Informace o serveru:", + "name": "Název", + "version": "Verze", + "website": "Webová stránka", + "compress": "Komprimovat", + "boldText": "Tučný text", + "italicText": "Kurzíva", + "strikeThrough": "Přeškrtnutý text", + "pleaseFillOut": "Prosím vyplňte", + "invalidUrl": "Neplatná URL adresa", + "addLink": "Přidat odkaz", + "unableToJoinChat": "Nepodařilo se připojit ke konverzaci. Je možné, že druhá strana ji už uzavřela.", + "previous": "Předchozí", + "otherPartyNotLoggedIn": "Druhá strana aktuálně není přihlášená, takže nemůže přijímat zprávy!", + "appWantsToUseForLogin": "Použít '{server}' k přihlášení", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Pokračováním povolíte aplikaci a webové stránce sdílet mezi sebou informace o vás.", + "open": "Otevřít", + "waitingForServer": "Čekám na server...", + "appIntroduction": "FluffyChat vám umožňuje chatovat s přáteli napříč různými aplikacemi. Zjistěte více na https://matrix.org nebo prostě klepněte na *Pokračovat*.", + "newChatRequest": "📩 Nová žádost o konverzaci", + "generalNotificationSettings": "Obecné nastavení oznámení", + "roomNotificationSettings": "Nastavení oznámení pro místnost", + "userSpecificNotificationSettings": "Nastavení oznámení pro uživatele", + "otherNotificationSettings": "Ostatní nastavení oznámení", + "notificationRuleContainsUserName": "Obsahuje uživatelské jméno", + "notificationRuleContainsUserNameDescription": "Pošle uživateli oznámení, když zpráva obsahuje jeho uživatelské jméno.", + "notificationRuleMaster": "Ztlumit veškerá oznámení", + "notificationRuleMasterDescription": "Přepíše veškerá ostatní pravidla a zakáže všechna oznámení.", + "notificationRuleSuppressNotices": "Ztlumit automatizované zprávy", + "notificationRuleSuppressNoticesDescription": "Ztlumí oznámení od automatizovaných klientů, jako jsou např. roboti.", + "notificationRuleInviteForMe": "Pozvánka adresovaná mně", + "notificationRuleInviteForMeDescription": "Pošle uživateli oznámení, když je pozván do místnosti.", + "notificationRuleMemberEvent": "Události týkající se členství", + "notificationRuleMemberEventDescription": "Ztlumí oznámení týkající se veškerých událostí souvisejících s členstvím.", + "notificationRuleIsUserMention": "Zmínka uživatele", + "notificationRuleIsUserMentionDescription": "Pošle uživateli oznámení, když je někdo přímo zmíní ve zprávě.", + "notificationRuleContainsDisplayName": "Obsahuje přezdívku", + "notificationRuleContainsDisplayNameDescription": "Pošle uživateli oznámení, když zpráva obsahuje jejich přezdívku.", + "notificationRuleIsRoomMention": "Označení místnosti", + "notificationRuleIsRoomMentionDescription": "Pošle uživateli oznámení, když je označena celá místnost.", + "notificationRuleRoomnotif": "Označení místnosti", + "notificationRuleRoomnotifDescription": "Pošle uživateli oznámení, když zpráva obsahuje '@room'.", + "notificationRuleTombstone": "Náhrobek", + "notificationRuleTombstoneDescription": "Pošle uživateli oznámení ohledně zpráv o deaktivaci místnosti.", + "notificationRuleReaction": "Reakce", + "notificationRuleReactionDescription": "Ztlumí oznámení o reakcích.", + "notificationRuleSuppressEdits": "Ztlumit úpravy", + "notificationRuleSuppressEditsDescription": "Ztlumí notifikace týkající se upravených zpráv.", + "notificationRuleCall": "Hovor", + "notificationRuleCallDescription": "Pošle uživateli oznámení ohledně hovorů.", + "sentVoiceMessage": "🎙️ {duration} - Hlasová zpráva od {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "Odstranění tohoto nastavení oznámení nelze vzít zpět.", + "more": "Více", + "shareKeysWith": "Sdílet klíče s...", + "shareKeysWithDescription": "Která zařízení mají být označena jako důvěryhodná, aby mohla současně číst vaše zprávy v šifrovaných konverzacích?", + "allDevices": "Všechna zařízení", + "crossVerifiedDevicesIfEnabled": "Křížově ověřená zařízení, pokud je povoleno", + "crossVerifiedDevices": "Křížově ověřená zařízení", + "verifiedDevicesOnly": "Pouze ověřená zařízení", + "recordAVideo": "Nahrát video", + "optionalMessage": "(Volitelné) zpráva...", + "notSupportedOnThisDevice": "Není na tomto zařízení podporováno", + "approve": "Schválit", + "youHaveKnocked": "Zaklepali jste", + "pleaseWaitUntilInvited": "Nyní musíte počkat, až vás nějaký člen této místnosti pozve dovnitř.", + "commandHint_logout": "Odhlásit se z aktuálního zařízení", + "commandHint_logoutall": "Odhlásit se ze všech aktivních zařízení", + "displayNavigationRail": "Zobrazit navigační lištu na mobilu", + "customReaction": "Vlastní reakce", + "moreEvents": "Více událostí", + "declineInvitation": "Odmítnout pozvánku", + "noMessagesYet": "Zatím tu nejsou žádné zprávy", + "longPressToRecordVoiceMessage": "Podržte pro nahrání hlasové zprávy.", + "pause": "Pozastavit", + "resume": "Pokračovat", + "newSubSpace": "Nový podprostor", + "moveToDifferentSpace": "Přesunout do jiného prostoru", + "removeFromSpaceDescription": "Tato konverzace bude odstraněna z tohoto prostoru, stále však bude dostupná ve vašem seznamu konverzací.", + "countChats": "{chats} konverzací", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Členové prostoru {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Členové prostoru {spaces} mohou zaklepat", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "donate": "Přispět", + "startedAPoll": "{username} spustil/a hlasování.", + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "poll": "Hlasování", + "startPoll": "Spustit hlasování", + "endPoll": "Ukončit hlasování", + "answersVisible": "Odpovědi budou viditelné", + "answersHidden": "Odpovědi budou skryté", + "pollQuestion": "Předmět hlasování", + "answerOption": "Možnost", + "addAnswerOption": "Přidat možnost", + "allowMultipleAnswers": "Povolit více odpovědí", + "pollHasBeenEnded": "Hlasování skončilo", + "answersWillBeVisibleWhenPollHasEnded": "Odpovědi budou viditelné jakmile hlasování skončí", + "replyInThread": "Odpovědět ve vlákně", + "thread": "Vlákno", + "backToMainChat": "Zpátky do hlavního chatu", + "saveChanges": "Uložit změny", + "createSticker": "Vytvořit nálepku nebo emodži", + "useAsSticker": "Použít jako nálepku", + "useAsEmoji": "Použít jako emodži", + "stickerPackNameAlreadyExists": "Balíček nálepek s tímto názvem již existuje", + "newStickerPack": "Nový balíček nálepek", + "stickerPackName": "Název balíčku nálepek", + "attribution": "Zdroj", + "skipChatBackup": "Přeskočit zálohu konverzací", + "skipChatBackupWarning": "Jste si jistí? Pokud nepovolíte zálohu konverzací, můžete ztratit přístup ke svým zprávám v případě změny zařízení.", + "loadingMessages": "Načítám zprávy", + "setupChatBackup": "Nastavit zálohování konverzací", + "noMoreResultsFound": "Žádné další výsledky nenalezeny", + "chatSearchedUntil": "Konverzace prohledána do {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Základní URL pro federování", + "baseUrl": "Základní URL", + "versionWithNumber": "Verze: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Záznamy", + "advancedConfigs": "Pokročilá nastavení", + "signIn": "Přihlásit se", + "createNewAccount": "Vytvořit nový účet", + "signUpGreeting": "FluffyChat je decentralizovaný! Vyberte server, kde si chcete vytvořit účet, a jdeme na věc!", + "signInGreeting": "Již máte účet na Matrixu? Vítejte zpět! Vyberte svůj domácí server a přihlaste se.", + "appIntro": "S FluffyChatem můžeme chatovat s přáteli. Je to decentralizovaná chatovací aplikace pro [matrix]! Zjistěte více na https://matrix.org nebo se zaregistrujte.", + "theProcessWasCanceled": "Proces byl zrušen.", + "sendImages": "Poslat {count} obrazků", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "commandHint_roomupgrade": "Aktualizovat místnost na danou verzi", + "subspace": "Podprostor" } From 9ec8bf5c371841e849142b87c1864f532c8b9140 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 11 Feb 2026 20:45:13 +0100 Subject: [PATCH 078/333] chore(translations): Translated using Weblate (Ukrainian) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/uk/ --- lib/l10n/intl_uk.arb | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/l10n/intl_uk.arb b/lib/l10n/intl_uk.arb index 59dd7ace..fee0cf01 100644 --- a/lib/l10n/intl_uk.arb +++ b/lib/l10n/intl_uk.arb @@ -2778,7 +2778,7 @@ "space": {} }, "markAsUnread": "Позначити непрочитаним", - "alwaysUse24HourFormat": "вимкнено", + "alwaysUse24HourFormat": "false", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, @@ -3021,7 +3021,7 @@ "moreEvents": "Інші події", "declineInvitation": "Відхилити запрошення", "noMessagesYet": "Поки немає повідомлень", - "longPressToRecordVoiceMessage": "Довге натискання, щоби записати голосове повідомлення.", + "longPressToRecordVoiceMessage": "Затисніть, щоб записати голосове повідомлення.", "pause": "Призупинити", "resume": "Продовжити", "newSubSpace": "Новий вкладений простір", @@ -3069,9 +3069,9 @@ "poll": "Опитування", "startPoll": "Розпочати опитування", "endPoll": "Завершити опитування", - "answersVisible": "Публічні відповіді", - "answersHidden": "Приховані відповіді", - "pollQuestion": "Запитання", + "answersVisible": "Відповіді видимі", + "answersHidden": "Відповіді сховано", + "pollQuestion": "Питання опитування", "answerOption": "Варіант відповіді", "addAnswerOption": "Додати варіант відповіді", "allowMultipleAnswers": "Дозволити декілька варіантів відповіді", @@ -3138,5 +3138,11 @@ "identityServer": "Сервер профілів:", "clientWellKnownInformation": "Дані клієнту із .well-known:", "federationBaseUrl": "Основний URL федерації", - "baseUrl": "Основний URL" + "baseUrl": "Основний URL", + "signIn": "Увійти", + "createNewAccount": "Створити новий обліковий запис", + "signUpGreeting": "FluffyChat децентралізований! Виберіть сервер, на якому ви хочете створити свій обліковий запис, і почнімо!", + "signInGreeting": "Ви вже маєте обліковий запис у Matrix? Ласкаво просимо! Виберіть свій домашній сервер і ввійдіть.", + "appIntro": "За допомогою FluffyChat ви можете спілкуватися зі своїми друзями. Це безпечний децентралізований месенджер [matrix]! Дізнайтеся більше на сайті https://matrix.org або просто зареєструйтеся.", + "theProcessWasCanceled": "Процес скасовано." } From 0c670a33990b508cfaa64409821f6900f2ffdaf3 Mon Sep 17 00:00:00 2001 From: Sayaka Halton Date: Wed, 11 Feb 2026 01:08:44 +0100 Subject: [PATCH 079/333] chore(translations): Translated using Weblate (Japanese) Currently translated at 58.5% (492 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ja/ --- lib/l10n/intl_ja.arb | 219 ++++++++++++++++++++++--------------------- 1 file changed, 112 insertions(+), 107 deletions(-) diff --git a/lib/l10n/intl_ja.arb b/lib/l10n/intl_ja.arb index 3cf02e2a..a4f96072 100644 --- a/lib/l10n/intl_ja.arb +++ b/lib/l10n/intl_ja.arb @@ -187,7 +187,7 @@ } } }, - "changedTheChatDescriptionTo": "{username}がチャットの説明を「{description}」に変更しました", + "changedTheChatDescriptionTo": "{username}がチャットの説明を「{description}」に変更した", "@changedTheChatDescriptionTo": { "type": "String", "placeholders": { @@ -199,7 +199,7 @@ } } }, - "changedTheChatNameTo": "{username}がチャットの名前を「{chatname}」に変更しました", + "changedTheChatNameTo": "{username}がチャットの名前を「{chatname}」に変更した", "@changedTheChatNameTo": { "type": "String", "placeholders": { @@ -220,7 +220,7 @@ } } }, - "changedTheDisplaynameTo": "{username}が表示名を「{displayname}」に変更しました", + "changedTheDisplaynameTo": "{username}が表示名を「{displayname}」に変更した", "@changedTheDisplaynameTo": { "type": "String", "placeholders": { @@ -378,7 +378,6 @@ "placeholders": {} }, "clearArchive": "アーカイブを消去", - "@clearArchive": {}, "close": "閉じる", "@close": { "type": "String", @@ -876,7 +875,7 @@ "type": "String", "placeholders": {} }, - "inviteText": "{username}がFluffyChatにあなたを招待しました. \n1. FluffyChatをインストールしてください: https://fluffychat.im \n2. 新しくアカウントを作成するかサインインしてください\n3. 招待リンクを開いてください: {link}", + "inviteText": "{username}があなたをFluffyChatに招待しました。\n1. FluffyChatをインストール: fluffychat.im \n2. アカウントの作成、またはサインインを行う\n3. 招待リンクを開く\n {link}", "@inviteText": { "type": "String", "placeholders": { @@ -1794,7 +1793,7 @@ "type": "String", "placeholders": {} }, - "wallpaper": "壁紙", + "wallpaper": "壁紙:", "@wallpaper": { "type": "String", "placeholders": {} @@ -1870,7 +1869,6 @@ "placeholders": {} }, "addToSpace": "スペースに追加", - "@addToSpace": {}, "cantOpenUri": "URIが開けません {uri}", "@cantOpenUri": { "type": "String", @@ -1881,23 +1879,19 @@ } }, "repeatPassword": "パスワードを繰り返そ", - "@repeatPassword": {}, "autoplayImages": "GIFを自動的に再生する", "@autoplayImages": { "type": "String", "placeholder": {} }, "yourChatBackupHasBeenSetUp": "チャットバックアップを設定ました。", - "@yourChatBackupHasBeenSetUp": {}, "sendOnEnter": "Enterで送信", - "@sendOnEnter": {}, "changeYourAvatar": "アバタるを変化しする", "@changeYourAvatar": { "type": "String", "placeholders": {} }, "chatHasBeenAddedToThisSpace": "このスペースにチャットが追加されました", - "@chatHasBeenAddedToThisSpace": {}, "commandHint_ban": "このユーザーを禁止する", "@commandHint_ban": { "type": "String", @@ -1923,9 +1917,7 @@ "description": "Usage hint for the command /discardsession" }, "confirmMatrixId": "アカウントを削除するには、Matrix IDを確認してください。", - "@confirmMatrixId": {}, "commandHint_markasgroup": "グループとしてマーク", - "@commandHint_markasgroup": {}, "commandHint_join": "指定した部屋に参加", "@commandHint_join": { "type": "String", @@ -1937,7 +1929,6 @@ "description": "Usage hint for the command /send" }, "hydrate": "バックアップファイルから復元", - "@hydrate": {}, "commandHint_html": "HTML形式のテキストを送信", "@commandHint_html": { "type": "String", @@ -1959,43 +1950,24 @@ "description": "State that {command} is not a valid /command." }, "oneClientLoggedOut": "クライアントの 1つがログアウトしました", - "@oneClientLoggedOut": {}, "addAccount": "アカウントを追加", - "@addAccount": {}, "editBundlesForAccount": "このアカウントのバンドルを編集", - "@editBundlesForAccount": {}, "unverified": "未検証", - "@unverified": {}, "sender": "送信者", - "@sender": {}, "placeCall": "電話をかける", - "@placeCall": {}, "voiceCall": "音声通話", - "@voiceCall": {}, "unsupportedAndroidVersionLong": "この機能を利用するには、より新しいAndroidのバージョンが必要です。アップデートまたはLineage OSのサポートをご確認ください。", - "@unsupportedAndroidVersionLong": {}, "widgetVideo": "動画", - "@widgetVideo": {}, "widgetName": "名称", - "@widgetName": {}, "widgetCustom": "カスタム", - "@widgetCustom": {}, "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "dehydrateWarning": "この操作は元に戻せません。バックアップファイルを安全に保存してください。", - "@dehydrateWarning": {}, "dehydrate": "セッションのエクスポートとデバイスの消去", - "@dehydrate": {}, "messageType": "メッセージの種類", - "@messageType": {}, "start": "開始", - "@start": {}, "publish": "公開", - "@publish": {}, "indexedDbErrorTitle": "プライベートモードに関する問題", - "@indexedDbErrorTitle": {}, "addWidget": "ウィジェットを追加", - "@addWidget": {}, "youBannedUser": "{user} を禁止しました", "@youBannedUser": { "placeholders": { @@ -2005,7 +1977,6 @@ } }, "youJoinedTheChat": "チャットに参加しました", - "@youJoinedTheChat": {}, "youHaveWithdrawnTheInvitationFor": "{user} への招待を取り下げました", "@youHaveWithdrawnTheInvitationFor": { "placeholders": { @@ -2015,26 +1986,18 @@ } }, "users": "ユーザー", - "@users": {}, "youRejectedTheInvitation": "招待を拒否しました", - "@youRejectedTheInvitation": {}, "screenSharingDetail": "FuffyChatで画面を共有しています", - "@screenSharingDetail": {}, "homeserver": "ホームサーバー", - "@homeserver": {}, "scanQrCode": "QRコードをスキャン", - "@scanQrCode": {}, "obtainingLocation": "位置情報を取得しています…", "@obtainingLocation": { "type": "String", "placeholders": {} }, "addToBundle": "バンドルに追加", - "@addToBundle": {}, "removeFromBundle": "このバンドルから削除", - "@removeFromBundle": {}, "bundleName": "バンドル名", - "@bundleName": {}, "noMatrixServer": "{server1} はMatrixのサーバーではありません。代わりに {server2} を使用しますか?", "@noMatrixServer": { "type": "String", @@ -2053,7 +2016,6 @@ "placeholders": {} }, "link": "リンク", - "@link": {}, "or": "または", "@or": { "type": "String", @@ -2075,7 +2037,6 @@ "placeholders": {} }, "recoveryKey": "リカバリーキー", - "@recoveryKey": {}, "singlesignon": "シングルサインオン", "@singlesignon": { "type": "String", @@ -2092,17 +2053,11 @@ "placeholders": {} }, "startFirstChat": "最初のチャットを開始する", - "@startFirstChat": {}, "addToSpaceDescription": "このチャットを追加するスペースを選択してください。", - "@addToSpaceDescription": {}, "messageInfo": "メッセージの情報", - "@messageInfo": {}, "openGallery": "ギャラリーを開く", - "@openGallery": {}, "removeFromSpace": "スペースから削除", - "@removeFromSpace": {}, "pleaseEnterRecoveryKeyDescription": "古いメッセージを解除するには、以前のセッションで生成されたリカバリーキーを入力してください。リカバリーキーはパスワードではありません。", - "@pleaseEnterRecoveryKeyDescription": {}, "videoWithSize": "ビデオ ({size})", "@videoWithSize": { "type": "String", @@ -2113,11 +2068,8 @@ } }, "openChat": "チャットを開く", - "@openChat": {}, "experimentalVideoCalls": "実験的なビデオ通話", - "@experimentalVideoCalls": {}, "emailOrUsername": "メールアドレスまたはユーザー名", - "@emailOrUsername": {}, "switchToAccount": "アカウント {number} に切り替える", "@switchToAccount": { "type": "number", @@ -2128,13 +2080,9 @@ } }, "nextAccount": "次のアカウント", - "@nextAccount": {}, "youAcceptedTheInvitation": "👍 招待を承諾しました", - "@youAcceptedTheInvitation": {}, "errorAddingWidget": "ウィジェットの追加中にエラーが発生しました。", - "@errorAddingWidget": {}, "widgetNameError": "表示名を入力してください。", - "@widgetNameError": {}, "youUnbannedUser": "{user} の禁止を解除しました", "@youUnbannedUser": { "placeholders": { @@ -2168,23 +2116,14 @@ } }, "storeInAppleKeyChain": "Apple KeyChainに保存", - "@storeInAppleKeyChain": {}, "storeInAndroidKeystore": "Android KeyStoreに保存する", - "@storeInAndroidKeystore": {}, "storeInSecureStorageDescription": "このデバイスの安全なストレージにリカバリーキーを保存。", - "@storeInSecureStorageDescription": {}, "unlockOldMessages": "古いメッセージのロックを解除する", - "@unlockOldMessages": {}, "callingAccount": "通話アカウント", - "@callingAccount": {}, "callingPermissions": "通話の権限", - "@callingPermissions": {}, "screenSharingTitle": "画面共有", - "@screenSharingTitle": {}, "foregroundServiceRunning": "この通知は、フォアグラウンド サービスの実行中に表示されます。", - "@foregroundServiceRunning": {}, "custom": "カスタム", - "@custom": {}, "countFiles": "{count}個のファイル", "@countFiles": { "placeholders": { @@ -2194,23 +2133,14 @@ } }, "storeSecurlyOnThisDevice": "このデバイスに安全に保管する", - "@storeSecurlyOnThisDevice": {}, "whyIsThisMessageEncrypted": "このメッセージが読めない理由", - "@whyIsThisMessageEncrypted": {}, "otherCallingPermissions": "マイク、カメラ、その他FluffyChatの権限", - "@otherCallingPermissions": {}, "appearOnTopDetails": "アプリをトップに表示できるようにする(すでに通話アカウントとしてFluffychatを設定している場合は必要ありません)", - "@appearOnTopDetails": {}, "dehydrateTorLong": "TOR ユーザーの場合、ウィンドウを閉じる前にセッションをエクスポートすることをお勧めします。", - "@dehydrateTorLong": {}, "hydrateTorLong": "前回、TOR でセッションをエクスポートしましたか?すぐにインポートしてチャットを続けましょう。", - "@hydrateTorLong": {}, "enableMultiAccounts": "(ベータ版) このデバイスで複数のアカウントを有効にする", - "@enableMultiAccounts": {}, "pleaseEnterRecoveryKey": "リカバリーキーを入力してください。", - "@pleaseEnterRecoveryKey": {}, "serverRequiresEmail": "このサーバーは、登録のためにメールアドレスを検証する必要があります。", - "@serverRequiresEmail": {}, "sendSticker": "ステッカーを送る", "@sendSticker": { "type": "String", @@ -2222,23 +2152,14 @@ "placeholders": {} }, "emojis": "絵文字", - "@emojis": {}, "markAsRead": "既読にする", - "@markAsRead": {}, "videoCallsBetaWarning": "ビデオ通話は、現在ベータ版であることにご注意ください。すべてのプラットフォームで期待通りに動作しない、あるいはまったく動作しない可能性があります。", - "@videoCallsBetaWarning": {}, "confirmEventUnpin": "イベントの固定を完全に解除してもよろしいですか?", - "@confirmEventUnpin": {}, "unsupportedAndroidVersion": "サポートされていないAndroidのバージョン", - "@unsupportedAndroidVersion": {}, "user": "ユーザー", - "@user": {}, "newGroup": "新しいグループ", - "@newGroup": {}, "noBackupWarning": "警告!チャットのバックアップを有効にしないと、暗号化されたメッセージにアクセスできなくなります。ログアウトする前に、まずチャットのバックアップを有効にすることを強くお勧めします。", - "@noBackupWarning": {}, "disableEncryptionWarning": "セキュリティ上の理由から、以前は暗号化が有効だったチャットで暗号化を無効にすることはできません。", - "@disableEncryptionWarning": {}, "youInvitedUser": "📩 {user} を招待しました", "@youInvitedUser": { "placeholders": { @@ -2265,9 +2186,7 @@ "placeholders": {} }, "widgetUrlError": "有効なURLではありません。", - "@widgetUrlError": {}, "reportUser": "ユーザーを報告", - "@reportUser": {}, "errorObtainingLocation": "位置情報の取得中にエラーが発生しました: {error}", "@errorObtainingLocation": { "type": "String", @@ -2278,9 +2197,7 @@ } }, "pinMessage": "部屋にピン留めする", - "@pinMessage": {}, "previousAccount": "前のアカウント", - "@previousAccount": {}, "pleaseChoose": "選択してください", "@pleaseChoose": { "type": "String", @@ -2292,28 +2209,21 @@ "placeholders": {} }, "noOtherDevicesFound": "他のデバイスが見つかりません", - "@noOtherDevicesFound": {}, "recoveryKeyLost": "リカバリーキーを紛失した場合", - "@recoveryKeyLost": {}, "shareLocation": "位置情報の共有", "@shareLocation": { "type": "String", "placeholders": {} }, "time": "時間", - "@time": {}, "sendAsText": "テキストとして送信", "@sendAsText": { "type": "String" }, "commandHint_googly": "ぎょろ目を送る", - "@commandHint_googly": {}, "commandHint_hug": "ハグを送る", - "@commandHint_hug": {}, "encryptThisChat": "このチャットを暗号化する", - "@encryptThisChat": {}, "commandHint_markasdm": "ダイレクトメッセージの部屋としてマークする", - "@commandHint_markasdm": {}, "commandHint_dm": "ダイレクトチャットを開始する\n暗号化を無効にするには、--no-encryptionを使用してください", "@commandHint_dm": { "type": "String", @@ -2345,9 +2255,7 @@ "description": "Usage hint for the command /react" }, "dehydrateTor": "TOR ユーザー: セッションをエクスポート", - "@dehydrateTor": {}, "hydrateTor": "TOR ユーザー: セッションのエクスポートをインポート", - "@hydrateTor": {}, "locationDisabledNotice": "位置情報サービスが無効になっています。位置情報を共有できるようにするには、位置情報サービスを有効にしてください。", "@locationDisabledNotice": { "type": "String", @@ -2359,9 +2267,7 @@ "placeholders": {} }, "deviceKeys": "デバイスキー:", - "@deviceKeys": {}, "sorryThatsNotPossible": "申し訳ありません...それは不可能です", - "@sorryThatsNotPossible": {}, "wasDirectChatDisplayName": "空のチャット (以前は {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2372,9 +2278,7 @@ } }, "doNotShowAgain": "今後表示しない", - "@doNotShowAgain": {}, "hideUnimportantStateEvents": "重要でない状態イベントを非表示にする", - "@hideUnimportantStateEvents": {}, "numChats": "{number} チャット", "@numChats": { "type": "number", @@ -2385,15 +2289,10 @@ } }, "allSpaces": "すべてのスペース", - "@allSpaces": {}, "enterRoom": "部屋に入る", - "@enterRoom": {}, "enterSpace": "スペースに入る", - "@enterSpace": {}, "newSpace": "新しいスペース", - "@newSpace": {}, "reopenChat": "チャットを再開する", - "@reopenChat": {}, "signInWith": "{provider}でログイン", "@signInWith": { "type": "String", @@ -2404,5 +2303,111 @@ } }, "signInWithPassword": "パスワードでログイン", - "@signInWithPassword": {} + "notAnImage": "画像ファイルではありません。", + "ignoreUser": "ユーザーを無視する", + "normalUser": "通常のユーザー", + "aboutHomeserver": "{homeserver} について", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "noMoreChatsFound": "これ以上のチャットが見つかりません…", + "unread": "未読", + "space": "スペース", + "spaces": "スペース", + "changedTheChatDescription": "{username}がチャットの説明を変更した", + "changedTheChatName": "{username}がチャットの名前を変更した", + "commandHint_kick": "入力のユーザーをこの部屋からキックする", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "countInvited": "{count}人を招待済み", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "createGroup": "グループを作成する", + "allRooms": "すべてのグループチャット", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "最近使われた絵文字がここに表示されます…", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "グローバルチャットID", + "calls": "通話", + "chatDescription": "チャットの説明", + "chatDescriptionHasBeenChanged": "チャットの説明が変更された", + "block": "ブロック", + "blockedUsers": "ブロック済みのユーザー", + "blockUsername": "ユーザー名を無視する", + "inviteContactToGroupQuestion": "{contact}を「{groupName}」のチャットに招待しますか?", + "noChatDescriptionYet": "チャットの説明はまだ作成されていません。", + "tryAgain": "再試行", + "messagesStyle": "メッセージ:", + "shareInviteLink": "招待リンクを共有", + "openInMaps": "マップで開く", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "hideMemberChangesInPublicChats": "公開チャットでのメンバー変更を非表示にする", + "notifyMeFor": "お知らせを受ける", + "redactedBy": "{username}によって削除済み", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "ダイレクトチャット", + "redactedByBecause": "{username}によって削除済み。理由:「{reason}」", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "sendImages": "{count}つの画像を送信", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "presencesToggle": "他のユーザーからのステータスメッセージを表示する", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " 同期中…({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + } } From a7fb6f976ad077630dbfed3b71a922a9de35b36b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Wed, 11 Feb 2026 15:20:31 +0100 Subject: [PATCH 080/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 24.6% (207 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 149 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 148 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 2577cfab..5b5c40dd 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -13,7 +13,7 @@ "importNow": "Kter tura", "importEmojis": "Kter imujiten", "importFromZipFile": "Kter seg ufaylu .zip", - "exportEmotePack": "Sifeḍ akemmus n Emote am .zip", + "exportEmotePack": "Sifeḍ akemmus n Izamulen uḥulfu am .zip", "replace": "Semselsi", "about": "Ɣef", "aboutHomeserver": "Ɣef {homeserver}", @@ -850,5 +850,152 @@ "@enableEncryptionWarning": { "type": "String", "placeholders": {} + }, + "login": "Anekcam", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Anekcam ɣer {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Tuffɣa", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Ibeddilen n iɛeggalen", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Abdar", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Iznan", + "@messages": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "Iznan:", + "muteChat": "Sgugem adiwenni", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Ttxil-k·m ẓeṛ belli tesriḍ Palaimon akken ad tesqedceḍ awgelhen seg yixef ɣer yixef.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "Adiwenni Amaynut", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Izen amaynut deg FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Asuter amaynut n uselken!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Uḍfir", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "Ala", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Ulac tuqqna ɣer uqeddac", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "Tzemreḍ kan ad tesremdeḍ awgelhen akken kan ara tuɣal taxxamt s war anekcum azayez.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "Ulac izamulen uḥulfu yettwafen. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} ur yelli d aqeddac matriks, seqdec axir {server2} ?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "shareInviteLink": "Bḍu aseɣwen n tinubga", + "none": "Ulac", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Mazal ur terniḍ ara tarrayt akken ad terreḍ awal-ik·im n uɛeddi.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Ulac tasiregt", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "Ulac taxxamt i yettwafen…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Ilɣa", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Ilɣa remden i umiḍan-agi", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} n iseqdacen la yettarun…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Aguccel n wadig…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Tanṭagt", + "@offensive": { + "type": "String", + "placeholders": {} } } From 54300984b4dbc6d753b0a8773c4339463b928836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Thu, 12 Feb 2026 15:06:33 +0100 Subject: [PATCH 081/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 27.0% (227 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 80 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 5b5c40dd..b4f208fa 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -997,5 +997,85 @@ "@offensive": { "type": "String", "placeholders": {} + }, + "editRoomAliases": "Ẓreg tizeẓla n taxxamt", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "link": "Aseɣwen", + "serverRequiresEmail": "Aqeddac-agi ilaq ad isentem tansa imayl i ujerred.", + "or": "Neɣ", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Imttekki", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "tafyirt n uɛeddi neɣ tasarut n tririt", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Awal n uɛeddi", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Awal n uɛeddi yettwattun", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Awal n uɛeddi yettusnifel", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "hideMemberChangesInPublicChats": "Ffer isenfal n iɛeggalen deg udiwenni azayez", + "overview": "Taskant", + "notifyMeFor": "Seɛlem-iyi-d ɣef", + "passwordRecoverySettings": "Iɣewwaṛen n tririt n wawal n uɛeddi", + "passwordRecovery": "Tiririt n wawal n uɛeddi", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "Imdanen", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Fren tugna", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "play": "Ɣeṛ {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Ttxil-k·m fren", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Ttxil-k·m fren tangalt n uɛeddi", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Ma ulac aɣilif, sit ɣef useɣwen yellan deg imayl sakin kemmel.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} } } From d36d3f7cd2055e1c736639206426978bfeacfae6 Mon Sep 17 00:00:00 2001 From: Arif Budiman Date: Fri, 13 Feb 2026 13:12:40 +0100 Subject: [PATCH 082/333] chore(translations): Translated using Weblate (Indonesian) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/id/ --- lib/l10n/intl_id.arb | 492 +++++++++++-------------------------------- 1 file changed, 121 insertions(+), 371 deletions(-) diff --git a/lib/l10n/intl_id.arb b/lib/l10n/intl_id.arb index 6452572a..d0cddc25 100644 --- a/lib/l10n/intl_id.arb +++ b/lib/l10n/intl_id.arb @@ -735,7 +735,6 @@ } }, "sendOnEnter": "Kirim dengan enter", - "@sendOnEnter": {}, "badServerLoginTypesException": "Homeserver ini mendukung tipe masuk ini:\n{serverVersions}\nTetapi aplikasi ini mendukung:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "String", @@ -788,7 +787,6 @@ "placeholders": {} }, "addToSpace": "Tambah ke space", - "@addToSpace": {}, "addEmail": "Tambah email", "@addEmail": { "type": "String", @@ -840,7 +838,6 @@ "placeholders": {} }, "clearArchive": "Bersihkan arsip", - "@clearArchive": {}, "chooseAStrongPassword": "Pilih kata sandi yang kuat", "@chooseAStrongPassword": { "type": "String", @@ -851,7 +848,7 @@ "type": "String", "placeholders": {} }, - "chatBackupDescription": "Pesan lamamu diamankan dengan sebuah kunci pemulihan. Pastikan kamu tidak menghilangkannya.", + "chatBackupDescription": "Pesan Anda diamankan dengan kunci pemulihan. Pastikan Anda tidak kehilangannya.", "@chatBackupDescription": { "type": "String", "placeholders": {} @@ -1719,26 +1716,18 @@ "placeholders": {} }, "serverRequiresEmail": "Server ini harus memvalidasi alamat email kamu untuk registrasi.", - "@serverRequiresEmail": {}, "openInMaps": "Buka di peta", "@openInMaps": { "type": "String", "placeholders": {} }, "enableMultiAccounts": "(BETA) Aktifkan multi-akun di perangkat ini", - "@enableMultiAccounts": {}, "bundleName": "Nama bundel", - "@bundleName": {}, "removeFromBundle": "Hilangkan dari bundel ini", - "@removeFromBundle": {}, "addToBundle": "Tambah ke bundel", - "@addToBundle": {}, "editBundlesForAccount": "Edit bundel untuk akun ini", - "@editBundlesForAccount": {}, "addAccount": "Tambah akun", - "@addAccount": {}, "oneClientLoggedOut": "Salah satu klienmu telah keluar", - "@oneClientLoggedOut": {}, "openCamera": "Buka kamera", "@openCamera": { "type": "String", @@ -1774,7 +1763,6 @@ } }, "scanQrCode": "Pindai kode QR", - "@scanQrCode": {}, "noMatrixServer": "{server1} itu bukan server Matrix, gunakan {server2} saja?", "@noMatrixServer": { "type": "String", @@ -1852,7 +1840,6 @@ } }, "homeserver": "Homeserver", - "@homeserver": {}, "enableEncryption": "Aktifkan enkripsi", "@enableEncryption": { "type": "String", @@ -1978,7 +1965,6 @@ "description": "Usage hint for the command /ban" }, "chatHasBeenAddedToThisSpace": "Obrolan telah ditambahkan ke space ini", - "@chatHasBeenAddedToThisSpace": {}, "changeTheme": "Ubah tema", "@changeTheme": { "type": "String", @@ -2108,29 +2094,17 @@ "placeholders": {} }, "link": "Tautan", - "@link": {}, "yourChatBackupHasBeenSetUp": "Cadangan obrolanmu telah disiapkan.", - "@yourChatBackupHasBeenSetUp": {}, "unverified": "Tidak terverifikasi", - "@unverified": {}, "repeatPassword": "Ulangi kata sandi", - "@repeatPassword": {}, "messageInfo": "Informasi pesan", - "@messageInfo": {}, "time": "Waktu", - "@time": {}, "messageType": "Tipe Pesan", - "@messageType": {}, "sender": "Pengirim", - "@sender": {}, "openGallery": "Buka galeri", - "@openGallery": {}, "addToSpaceDescription": "Pilih sebuah space untuk menambahkan obrolan ke spacenya.", - "@addToSpaceDescription": {}, "start": "Mulai", - "@start": {}, "removeFromSpace": "Hilangkan dari space", - "@removeFromSpace": {}, "commandHint_clearcache": "Bersihkan tembolok", "@commandHint_clearcache": { "type": "String", @@ -2157,7 +2131,6 @@ "placeholders": {} }, "publish": "Publikasi", - "@publish": {}, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "String", @@ -2168,13 +2141,9 @@ } }, "dismiss": "Abaikan", - "@dismiss": {}, "markAsRead": "Tandai sebagai dibaca", - "@markAsRead": {}, "reportUser": "Laporkan pengguna", - "@reportUser": {}, "openChat": "Buka Chat", - "@openChat": {}, "reactedWith": "{sender} bereaksi dengan {reaction}", "@reactedWith": { "type": "String", @@ -2188,27 +2157,16 @@ } }, "emojis": "Emoji", - "@emojis": {}, "pinMessage": "Sematkan ke ruangan", - "@pinMessage": {}, "confirmEventUnpin": "Apakah kamu yakin untuk melepaskan pin peristiwa ini secara permanen?", - "@confirmEventUnpin": {}, "unsupportedAndroidVersionLong": "Fitur ini memerlukan versi Android yang baru. Mohon periksa untuk pembaruan atau dukungan LineageOS.", - "@unsupportedAndroidVersionLong": {}, "unsupportedAndroidVersion": "Versi Android tidak didukung", - "@unsupportedAndroidVersion": {}, "placeCall": "Lakukan panggilan", - "@placeCall": {}, "voiceCall": "Panggilan suara", - "@voiceCall": {}, "videoCallsBetaWarning": "Dicatat bahwa panggilan video sedang dalam beta. Fitur ini mungkin tidak berkerja dengan benar atau tidak berkerja sama sekali pada semua platform.", - "@videoCallsBetaWarning": {}, "emailOrUsername": "Email atau nama pengguna", - "@emailOrUsername": {}, "experimentalVideoCalls": "Panggilan video eksperimental", - "@experimentalVideoCalls": {}, "previousAccount": "Akun sebelumnya", - "@previousAccount": {}, "switchToAccount": "Ganti ke akun {number}", "@switchToAccount": { "type": "number", @@ -2219,25 +2177,15 @@ } }, "nextAccount": "Akun berikutnya", - "@nextAccount": {}, "widgetEtherpad": "Catatan teks", - "@widgetEtherpad": {}, "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "widgetCustom": "Kustom", - "@widgetCustom": {}, "errorAddingWidget": "Terjadi kesalahan menambahkan widget.", - "@errorAddingWidget": {}, "widgetName": "Nama", - "@widgetName": {}, "addWidget": "Tambahkan widget", - "@addWidget": {}, "widgetVideo": "Video", - "@widgetVideo": {}, "widgetUrlError": "Ini bukan URL yang valid.", - "@widgetUrlError": {}, "widgetNameError": "Mohon sediakan sebuah nama tampilan.", - "@widgetNameError": {}, "separateChatTypes": "Pisahkan Pesan Langsung dan Grup", "@separateChatTypes": { "type": "String", @@ -2276,11 +2224,8 @@ } }, "youRejectedTheInvitation": "Kamu menolak undangannya", - "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Kamu bergabung ke obrolan", - "@youJoinedTheChat": {}, "youAcceptedTheInvitation": "👍 Kamu menerima undangannya", - "@youAcceptedTheInvitation": {}, "youBannedUser": "Kamu mencekal {user}", "@youBannedUser": { "placeholders": { @@ -2306,27 +2251,16 @@ } }, "pleaseEnterRecoveryKeyDescription": "Untuk mengakses pesan lamamu, mohon masukkan kunci pemulihanmu yang telah dibuat di sesi sebelumnya. Kunci pemulihanmu BUKAN kata sandimu.", - "@pleaseEnterRecoveryKeyDescription": {}, "users": "Pengguna", - "@users": {}, "storeInSecureStorageDescription": "Simpan kunci pemulihan di penyimpanan aman perangkat ini.", - "@storeInSecureStorageDescription": {}, "saveKeyManuallyDescription": "Simpan kunci ini secara manual dengan memicu dialog pembagian atau papan klip sistem.", - "@saveKeyManuallyDescription": {}, "recoveryKey": "Kunci pemulihan", - "@recoveryKey": {}, "storeInAppleKeyChain": "Simpan di Apple KeyChain", - "@storeInAppleKeyChain": {}, "pleaseEnterRecoveryKey": "Mohon masukkan kunci pemulihanmu:", - "@pleaseEnterRecoveryKey": {}, "unlockOldMessages": "Akses pesan lama", - "@unlockOldMessages": {}, "recoveryKeyLost": "Kunci pemulihan hilang?", - "@recoveryKeyLost": {}, "storeInAndroidKeystore": "Simpan di Android KeyStore", - "@storeInAndroidKeystore": {}, "storeSecurlyOnThisDevice": "Simpan secara aman di perangkat ini", - "@storeSecurlyOnThisDevice": {}, "countFiles": "{count} file", "@countFiles": { "placeholders": { @@ -2336,29 +2270,17 @@ } }, "hydrate": "Pulihkan dari file cadangan", - "@hydrate": {}, "indexedDbErrorTitle": "Masalah dengan mode privat", - "@indexedDbErrorTitle": {}, "indexedDbErrorLong": "Penyimpanan pesan sayangnya tidak diaktifkan dalam mode privat secara default.\nMohon kunjungi\n- about:config\n- tetapkan dom.indexedDB.privateBrowsing.enabled ke true\nJika tidak ditetapkan, FluffyChat tidak akan dapat dijalankan.", - "@indexedDbErrorLong": {}, "dehydrate": "Ekspor sesi dan bersihkan perangkat", - "@dehydrate": {}, "dehydrateWarning": "Tindakan ini tidak dapat diurungkan. Pastikan kamu telah menyimpan file cadangan dengan aman.", - "@dehydrateWarning": {}, "dehydrateTor": "Pengguna Tor: Ekspor sesi", - "@dehydrateTor": {}, "hydrateTorLong": "Apakah kamu mengekspor sesimu terakhir kali di Tor? Impor dengan cepat dan lanjut mengobrol.", - "@hydrateTorLong": {}, "dehydrateTorLong": "Pengguna Tor disarankan untuk mengekspor sesi sebelum menutup jendela.", - "@dehydrateTorLong": {}, "hydrateTor": "Pengguna Tor: Impor eksporan sesi", - "@hydrateTor": {}, "custom": "Kustom", - "@custom": {}, "user": "Pengguna", - "@user": {}, "confirmMatrixId": "Mohon konfirmasi ID Matrix Anda untuk menghapus akun Anda.", - "@confirmMatrixId": {}, "supposedMxid": "Ini seharusnya {mxid}", "@supposedMxid": { "type": "String", @@ -2369,41 +2291,23 @@ } }, "commandHint_markasdm": "Tandai sebagai ruangan pesan langsung untuk ID Matrix yang ditentukan", - "@commandHint_markasdm": {}, "commandHint_markasgroup": "Tandai sebagai grup", - "@commandHint_markasgroup": {}, "screenSharingTitle": "membagikan layar", - "@screenSharingTitle": {}, "appearOnTopDetails": "Memperbolehkan aplikasi untuk ditampilkan di atas (tidak dibutuhkan jika kamu memiliki FluffyChat ditetapkan sebagai akun pemanggilan)", - "@appearOnTopDetails": {}, "callingAccountDetails": "Memperbolehkan FluffyChat untuk menggunakan aplikasi penelepon Android bawaan.", - "@callingAccountDetails": {}, "noKeyForThisMessage": "Hal ini bisa terjadi jika pesan dikirim sebelum kamu masuk ke akunmu di perangkat ini.\n\nMungkin juga pengirim telah memblokir perangkatmu atau ada yang tidak beres dengan koneksi internet.\n\nApakah kamu bisa membaca pesan pada sesi lain? Maka kamu bisa mentransfer pesan dari sesi tersebut! Buka Pengaturan > Perangkat dan pastikan bahwa perangkat Anda telah ditandatangani secara silang. Ketika kamu membuka ruangan di lain waktu dan kedua sesi berada di latar depan, kunci akan ditransmisikan secara otomatis.\n\nApakah kamu tidak mau kehilangan kunci saat keluar atau berpindah perangkat? Pastikan bahwa kamu telah mengaktifkan cadangan obrolan dalam pengaturan.", - "@noKeyForThisMessage": {}, "foregroundServiceRunning": "Notifikasi ini ditampilkan ketika layanan latar depan berjalan.", - "@foregroundServiceRunning": {}, "callingPermissions": "Perizinan panggilan", - "@callingPermissions": {}, "appearOnTop": "Tampilkan di atas", - "@appearOnTop": {}, "callingAccount": "Akun pemanggilan", - "@callingAccount": {}, "otherCallingPermissions": "Mikrofon, kamera dan perizinan FluffyChat lainnya", - "@otherCallingPermissions": {}, "whyIsThisMessageEncrypted": "Mengapa pesan ini tidak bisa dibaca?", - "@whyIsThisMessageEncrypted": {}, "newGroup": "Grup baru", - "@newGroup": {}, "newSpace": "Space baru", - "@newSpace": {}, "enterSpace": "Masuk space", - "@enterSpace": {}, "enterRoom": "Masuk ruangan", - "@enterRoom": {}, "allSpaces": "Semua space", - "@allSpaces": {}, "screenSharingDetail": "Kamu membagikan layarmu di FluffyChat", - "@screenSharingDetail": {}, "numChats": "{number} obrolan", "@numChats": { "type": "number", @@ -2414,9 +2318,7 @@ } }, "hideUnimportantStateEvents": "Sembunyikan peristiwa keadaan yang tidak penting", - "@hideUnimportantStateEvents": {}, "doNotShowAgain": "Jangan tampilkan lagi", - "@doNotShowAgain": {}, "hugContent": "{senderName} memeluk kamu", "@hugContent": { "type": "String", @@ -2445,11 +2347,8 @@ } }, "commandHint_googly": "Kirim mata googly", - "@commandHint_googly": {}, "commandHint_hug": "Kirim pelukan", - "@commandHint_hug": {}, "commandHint_cuddle": "Kirim berpelukan", - "@commandHint_cuddle": {}, "wasDirectChatDisplayName": "Obrolan kosong (sebelumnya {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2460,25 +2359,15 @@ } }, "startFirstChat": "Mulai obrolan pertamamu", - "@startFirstChat": {}, "newSpaceDescription": "Fitur space bisa membantu untuk memisahkan obrolanmu dan membuat komunitas pribadi atau publik.", - "@newSpaceDescription": {}, "sorryThatsNotPossible": "Maaf... itu tidak mungkin", - "@sorryThatsNotPossible": {}, "deviceKeys": "Kunci perangkat:", - "@deviceKeys": {}, "encryptThisChat": "Enkripsi obrolan ini", - "@encryptThisChat": {}, "disableEncryptionWarning": "Demi keamanan kamu tidak bisa menonaktifkan enkripsi dalam sebuah obrolan di mana sebelumbya sudah diaktifkan.", - "@disableEncryptionWarning": {}, "reopenChat": "Buka obrolan lagi", - "@reopenChat": {}, "noBackupWarning": "Peringatan! Tanpa mengaktifkan cadangan percakapan, kamu akan kehilangan akses ke pesan terenkripsimu. Disarankan untuk mengaktifkan cadangan percakapan terlebih dahulu sebelum keluar dari akun.", - "@noBackupWarning": {}, "noOtherDevicesFound": "Tidak ada perangkat lain yang ditemukan", - "@noOtherDevicesFound": {}, "fileIsTooBigForServer": "Tidak dapat mengirim! Server hanya mendukung lampiran sampai dengan {max}.", - "@fileIsTooBigForServer": {}, "fileHasBeenSavedAt": "Berkas telah disimpan di {path}", "@fileHasBeenSavedAt": { "type": "String", @@ -2489,26 +2378,18 @@ } }, "jumpToLastReadMessage": "Pergi ke pesan terakhir dibaca", - "@jumpToLastReadMessage": {}, "readUpToHere": "Baca sampai sini", - "@readUpToHere": {}, "jump": "Lompat", - "@jump": {}, "openLinkInBrowser": "Buka tautan dalam peramban", - "@openLinkInBrowser": {}, "allRooms": "Semua Percakapan Grup", "@allRooms": { "type": "String", "placeholders": {} }, "report": "laporkan", - "@report": {}, "reportErrorDescription": "😭 Aduh. Ada yang salah. Jika kamu mau, kamu bisa melaporkan kutu ini kepada para pengembang.", - "@reportErrorDescription": {}, "signInWithPassword": "Masuk dengan kata sandi", - "@signInWithPassword": {}, "pleaseTryAgainLaterOrChooseDifferentServer": "Silakan coba lagi nanti atau pilih server yang lain.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "signInWith": "Masuk dengan {provider}", "@signInWith": { "type": "String", @@ -2519,47 +2400,26 @@ } }, "notAnImage": "Bukan berkas gambar.", - "@notAnImage": {}, "importNow": "Impor sekarang", - "@importNow": {}, "importFromZipFile": "Impor dari berkas .zip", - "@importFromZipFile": {}, "exportEmotePack": "Ekspor paket Emote sebagai .zip", - "@exportEmotePack": {}, "replace": "Ganti", - "@replace": {}, "importEmojis": "Impor Emoji", - "@importEmojis": {}, "sendTypingNotifications": "Kirim notifikasi pengetikan", - "@sendTypingNotifications": {}, "createGroup": "Buat grup", - "@createGroup": {}, "inviteContactToGroupQuestion": "Apakah kamu ingin mengundang {contact} ke obrolan \"{groupName}\"?", - "@inviteContactToGroupQuestion": {}, "tryAgain": "Coba ulang", - "@tryAgain": {}, "messagesStyle": "Pesan:", - "@messagesStyle": {}, "shareInviteLink": "Bagikan tautan undangan", - "@shareInviteLink": {}, "setTheme": "Atur tema:", - "@setTheme": {}, "invalidServerName": "Nama server tidak valid", - "@invalidServerName": {}, "addChatDescription": "Tambahkan deskripsi obrolan...", - "@addChatDescription": {}, "chatPermissions": "Perizinan obrolan", - "@chatPermissions": {}, "chatDescription": "Deskripsi obrolan", - "@chatDescription": {}, "chatDescriptionHasBeenChanged": "Deskripsi obrolan diubah", - "@chatDescriptionHasBeenChanged": {}, "noChatDescriptionYet": "Deskripsi obrolan belum dibuat.", - "@noChatDescriptionYet": {}, "redactMessageDescription": "Pesan akan dihilangkan untuk semua anggota dalam percakapan ini. Ini tidak dapat diurungkan.", - "@redactMessageDescription": {}, "optionalRedactReason": "(Opsional) Alasan menghilangkan pesan ini...", - "@optionalRedactReason": {}, "redactedBy": "Dihilangkan oleh {username}", "@redactedBy": { "type": "String", @@ -2570,7 +2430,6 @@ } }, "directChat": "Chat langsung", - "@directChat": {}, "redactedByBecause": "Dihilangkan oleh {username} karena: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2584,24 +2443,17 @@ } }, "setChatDescription": "Lihat deskripsi obrolan", - "@setChatDescription": {}, "profileNotFound": "Pengguna ini tidak dapat ditemukan di server. Mungkin ada masalah koneksi atau penggunanya tidak ada.", - "@profileNotFound": {}, "setColorTheme": "Atur tema warna:", - "@setColorTheme": {}, "invite": "Undang", - "@invite": {}, "inviteGroupChat": "📨 Undangan percakapan grup", - "@inviteGroupChat": {}, "invitePrivateChat": "📨 Undangan percakapan privat", - "@invitePrivateChat": {}, "emoteKeyboardNoRecents": "Emote yang telah digunakan akan muncul di sini...", "@emoteKeyboardNoRecents": { "type": "String", "placeholders": {} }, "invalidInput": "Masukan tidak valid!", - "@invalidInput": {}, "wrongPinEntered": "PIN yang dimasukkan salah! Coba lagi dalam {seconds} detik...", "@wrongPinEntered": { "type": "String", @@ -2612,17 +2464,11 @@ } }, "banUserDescription": "Pengguna akan dicekal dari percakapan dan tidak akan dapat memasuki percakapan lagi sampai dibatalkan cekalannya.", - "@banUserDescription": {}, "removeDevicesDescription": "Kamu akan dikeluarkan dari perangkat ini dan tidak akan dapat menerima pesan lagi.", - "@removeDevicesDescription": {}, "unbanUserDescription": "Pengguna akan dapat memasuki percakapannya lagi jika dicoba.", - "@unbanUserDescription": {}, "pushNotificationsNotAvailable": "Notifikasi dorongan tidak tersedia", - "@pushNotificationsNotAvailable": {}, "makeAdminDescription": "Setelah kamu membuat pengguna ini admin, kamu tidak akan dapat mengurungkan ini karena penggunanya akan memiliki perizinan yang sama seperti kamu.", - "@makeAdminDescription": {}, "archiveRoomDescription": "Percakapan akan dipindahkan ke arsip. Pengguna lain akan melihat bahwa kamu telah meninggalkan percakapan.", - "@archiveRoomDescription": {}, "hasKnocked": "🚪 {user} telah dikeluarkan", "@hasKnocked": { "placeholders": { @@ -2632,25 +2478,15 @@ } }, "learnMore": "Pelajari lebih lanjut", - "@learnMore": {}, "roomUpgradeDescription": "Percakapannya akan dibuat ulang dengan versi ruangan yang baru. Semua anggota akan diberi tahu bahwa mereka harus ganti ke percakapan yang baru. Kamu bisa mempelajari lebih lanjut tentang versi ruangan di https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, "pleaseEnterANumber": "Silakan masukkan angka lebih dari 0", - "@pleaseEnterANumber": {}, "kickUserDescription": "Pengguna ini dikeluarkan dari percakapan tetapi tidak dicekal. Dalam percakapan publik, penggunanya dapat bergabung ulang kapan pun.", - "@kickUserDescription": {}, "groupCanBeFoundViaSearch": "Grup dapat dicari melalui pencarian", - "@groupCanBeFoundViaSearch": {}, "groupName": "Nama grup", - "@groupName": {}, "wrongRecoveryKey": "Maaf... ini sepertinya bukan kunci pemulihan yang benar.", - "@wrongRecoveryKey": {}, "addChatOrSubSpace": "Tambahkan percakapan atau subspace", - "@addChatOrSubSpace": {}, "pleaseChooseAStrongPassword": "Silakan pilih kata sandi yang kuat", - "@pleaseChooseAStrongPassword": {}, "joinSpace": "Bergabung ke space", - "@joinSpace": {}, "acceptedKeyVerification": "{sender} menerima verifikasi kunci", "@acceptedKeyVerification": { "type": "String", @@ -2679,7 +2515,6 @@ } }, "verifyOtherDevice": "🔐 Verifikasi perangkat lain", - "@verifyOtherDevice": {}, "requestedKeyVerification": "{sender} meminta verifikasi kunci", "@requestedKeyVerification": { "type": "String", @@ -2699,7 +2534,6 @@ } }, "formattedMessagesDescription": "Tampilkan konten pesan kaya seperti teks tebal menggunakan Markdown.", - "@formattedMessagesDescription": {}, "noUsersFoundWithQuery": "Sayangnya tidak ada pengguna yang dapat ditemukan dengan \"{query}\". Silakan periksa jika ada tipo.", "@noUsersFoundWithQuery": { "type": "String", @@ -2722,19 +2556,12 @@ } }, "passwordIsWrong": "Kata sandi yang kamu masukkan salah", - "@passwordIsWrong": {}, "searchChatsRooms": "Cari #percakapan, @pengguna...", - "@searchChatsRooms": {}, "createGroupAndInviteUsers": "Buat sebuah grup dan undang pengguna", - "@createGroupAndInviteUsers": {}, "pleaseEnterYourCurrentPassword": "Silakan masukkan kata sandimu saat ini", - "@pleaseEnterYourCurrentPassword": {}, "passwordsDoNotMatch": "Kata sandi tidak cocok", - "@passwordsDoNotMatch": {}, "publicLink": "Tautan publik", - "@publicLink": {}, "sendTypingNotificationsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu sedang mengetik sebuah pesan baru.", - "@sendTypingNotificationsDescription": {}, "forwardMessageTo": "Teruskan pesan ke {roomName}?", "@forwardMessageTo": { "type": "String", @@ -2745,11 +2572,8 @@ } }, "sendReadReceipts": "Kirim laporan dibaca", - "@sendReadReceipts": {}, "formattedMessages": "Pesan yang diformat", - "@formattedMessages": {}, "verifyOtherUser": "🔐 Verifikasi pengguna lain", - "@verifyOtherUser": {}, "sessionLostBody": "Sesimu hilang. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", "@sessionLostBody": { "type": "String", @@ -2793,49 +2617,27 @@ } }, "publicSpaces": "Space publik", - "@publicSpaces": {}, "commandHint_sendraw": "Kirim JSON mentah", - "@commandHint_sendraw": {}, "sendReadReceiptsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu membaca sebuah pesan.", - "@sendReadReceiptsDescription": {}, "block": "Blokir", - "@block": {}, "blockedUsers": "Pengguna yang terblokir", - "@blockedUsers": {}, "blockListDescription": "Kamu bisa memblokir pengguna yang sedang menganggumu. Kamu tidak akan mendapatkan pesan atau undangan ruangan dari pengguna dalam daftar blokiran pribadimu.", - "@blockListDescription": {}, "blockUsername": "Abaikan nama pengguna", - "@blockUsername": {}, "hidePresences": "Sembunyikan Daftar Status?", - "@hidePresences": {}, "transparent": "Transparan", - "@transparent": {}, "stickers": "Stiker", - "@stickers": {}, "discover": "Jelajahi", - "@discover": {}, "startConversation": "Mulai percakapan", - "@startConversation": {}, "yourGlobalUserIdIs": "ID pengguna globalmu adalah: ", - "@yourGlobalUserIdIs": {}, "select": "Pilih", - "@select": {}, "subspace": "Subspace", - "@subspace": {}, "decline": "Tolak", - "@decline": {}, "nothingFound": "Tidak ada yang ditemukan...", - "@nothingFound": {}, "thisDevice": "Perangkat ini:", - "@thisDevice": {}, "newPassword": "Kata sandi baru", - "@newPassword": {}, "incomingMessages": "Pesan masuk", - "@incomingMessages": {}, "databaseMigrationTitle": "Basis data sudah dioptimalkan", - "@databaseMigrationTitle": {}, "searchForUsers": "Cari @pengguna...", - "@searchForUsers": {}, "completedKeyVerification": "{sender} menyelesaikan verifikasi kunci", "@completedKeyVerification": { "type": "String", @@ -2846,19 +2648,12 @@ } }, "databaseMigrationBody": "Silakan tunggu. Ini dapat membutuhkan beberapa waktu.", - "@databaseMigrationBody": {}, "leaveEmptyToClearStatus": "Tinggalkan kosong untuk menghapus statusmu.", - "@leaveEmptyToClearStatus": {}, "initAppError": "Terjadi kesalahan saat init aplikasi", - "@initAppError": {}, "verifyOtherDeviceDescription": "Saat kamu memverifikasi perangkat lain, perangkat tersebut dapat bertukar kunci, sehingga meningkatkan keamananmu secara keseluruhan. 💪 Saat Anda memulai verifikasi, sebuah pemberitahuan akan muncul di aplikasi pada kedua perangkat. Di situ kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain. Sebaiknya siapkan kedua perangkat sebelum kamu memulai verifikasi. 🤳", - "@verifyOtherDeviceDescription": {}, "verifyOtherUserDescription": "Jika kamu memverifikasi pengguna lain, kamu bisa yakin bahwa kamu tahu kepada siapa sebenarnya kamu menulis pesan kepadanya. 💪\n\nSaat kamu memulai verifikasi, kamu dan pengguna lain akan melihat pemberitahuan di aplikasi. Di sana kemudian akan melihat serangkaian emoji atau angka yang harus dibandingkan satu sama lain.\n\nCara terbaik untuk melakukannya adalah dengan bertemu secara langsung atau memulai panggilan video. 👭", - "@verifyOtherUserDescription": {}, "commandHint_ignore": "Abaikan ID Matrix yang diberikan", - "@commandHint_ignore": {}, "commandHint_unignore": "Batalkan pengabaian ID Matrix yang diberikan", - "@commandHint_unignore": {}, "unreadChatsInApp": "{appname}: {unread} obrolan belum dibaca", "@unreadChatsInApp": { "type": "String", @@ -2872,41 +2667,23 @@ } }, "noDatabaseEncryption": "Enkripsi basis data tidak didukung di platform ini", - "@noDatabaseEncryption": {}, "customEmojisAndStickersBody": "Tambakan atau bagikan emoji atau stiker kustom yang dapat digunakan dalam obrolan apa pun.", - "@customEmojisAndStickersBody": {}, "hideRedactedMessages": "Sembunyikan pesan yang dihapus", - "@hideRedactedMessages": {}, "appLockDescription": "Kunci aplikasi ketika tidak digunakan dengan kode PIN", - "@appLockDescription": {}, "accessAndVisibility": "Akses dan keterlihatan", - "@accessAndVisibility": {}, "globalChatId": "ID obrolan global", - "@globalChatId": {}, "accessAndVisibilityDescription": "Siapa yang diperbolehkan bergabung ke obrolan ini dan bagaimana obrolannya dapat ditemukan.", - "@accessAndVisibilityDescription": {}, "calls": "Panggilan", - "@calls": {}, "customEmojisAndStickers": "Emoji dan stiker kustom", - "@customEmojisAndStickers": {}, "hideRedactedMessagesBody": "Jika seseorang menghapus pesan, pesannya tidak akan terlihat lagi dalam obrolan.", - "@hideRedactedMessagesBody": {}, "hideMemberChangesInPublicChatsBody": "Jangan tampilkan dalam lini masa obrolan jika seseorang bergabung atau keluar dari obrolan untuk meningkatkan keterlihatan.", - "@hideMemberChangesInPublicChatsBody": {}, "notifyMeFor": "Beri tahu aku untuk", - "@notifyMeFor": {}, "hideInvalidOrUnknownMessageFormats": "Sembunyikan format pesan yang tidak valid atau tidak diketahui", - "@hideInvalidOrUnknownMessageFormats": {}, "hideMemberChangesInPublicChats": "Sembunyikan perubahan anggota dalam obrolan publik", - "@hideMemberChangesInPublicChats": {}, "overview": "Ikhtisar", - "@overview": {}, "passwordRecoverySettings": "Pengaturan pemulihan kata sandi", - "@passwordRecoverySettings": {}, "usersMustKnock": "Pengguna harus mengetuk", - "@usersMustKnock": {}, "noOneCanJoin": "Tidak ada siapa pun yang dapat bergabung", - "@noOneCanJoin": {}, "userWouldLikeToChangeTheChat": "{user} ingin bergabung dengan obrolan.", "@userWouldLikeToChangeTheChat": { "placeholders": { @@ -2916,11 +2693,8 @@ } }, "noPublicLinkHasBeenCreatedYet": "Belum ada tautan publik yang dibuat", - "@noPublicLinkHasBeenCreatedYet": {}, "knock": "Ketuk", - "@knock": {}, "knocking": "Mengetuk", - "@knocking": {}, "chatCanBeDiscoveredViaSearchOnServer": "Obrolan dapat ditemukan melalui pencarian di {server}", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2936,11 +2710,8 @@ "count": {} }, "publicChatAddresses": "Alamat obrolan umum", - "@publicChatAddresses": {}, "createNewAddress": "Buat alamat baru", - "@createNewAddress": {}, "userRole": "Peran pengguna", - "@userRole": {}, "minimumPowerLevel": "{level} adalah tingkat daya minimum.", "@minimumPowerLevel": { "type": "String", @@ -2951,11 +2722,8 @@ } }, "swipeRightToLeftToReply": "Usap dari kanan ke kiri untuk membalas", - "@swipeRightToLeftToReply": {}, "searchMore": "Cari lebih banyak...", - "@searchMore": {}, "gallery": "Galeri", - "@gallery": {}, "searchIn": "Cari dalam obrolan \"{chat}\"...", "@searchIn": { "type": "String", @@ -2966,19 +2734,14 @@ } }, "files": "Berkas", - "@files": {}, "restricted": "Dibatasi", - "@restricted": {}, "knockRestricted": "Ketukan dibatasi", - "@knockRestricted": {}, "alwaysUse24HourFormat": "tidak", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, "sendCanceled": "Pengiriman dibatalkan", - "@sendCanceled": {}, "noChatsFoundHere": "Belum ada chat di sini. Mulai chat baru dengan seseorang menggunakan tombol di bawah. ⤵️", - "@noChatsFoundHere": {}, "invitedBy": "📩 Diundang oleh {user}", "@invitedBy": { "placeholders": { @@ -2988,28 +2751,19 @@ } }, "markAsUnread": "Tandai sebagai belum dibaca", - "@markAsUnread": {}, "goToSpace": "Pergi ke space: {space}", "@goToSpace": { "type": "String", "space": {} }, "changeTheChatPermissions": "Ubah perizinan chat", - "@changeTheChatPermissions": {}, "changeTheCanonicalRoomAlias": "Ubah alamat chat publik utama", - "@changeTheCanonicalRoomAlias": {}, "changeTheVisibilityOfChatHistory": "Ubah keterlihatan riwayat chat", - "@changeTheVisibilityOfChatHistory": {}, "changeTheDescriptionOfTheGroup": "Ubah deskripsi chat", - "@changeTheDescriptionOfTheGroup": {}, "sendingAttachment": "Mengirim lampiran...", - "@sendingAttachment": {}, "compressVideo": "Mengompres video...", - "@compressVideo": {}, "calculatingFileSize": "Menghitung ukuran berkas...", - "@calculatingFileSize": {}, "prepareSendingAttachment": "Menyiapkan pengiriman lampiran...", - "@prepareSendingAttachment": {}, "sendingAttachmentCountOfCount": "Mengirim lampiran {index} dari {length}...", "@sendingAttachmentCountOfCount": { "type": "integer", @@ -3050,13 +2804,9 @@ } }, "changeGeneralChatSettings": "Ubah pengaturan chat umum", - "@changeGeneralChatSettings": {}, "discoverHomeservers": "Jelajahi homeserver", - "@discoverHomeservers": {}, "loginWithMatrixId": "Masuk dengan ID Matrix", - "@loginWithMatrixId": {}, "doesNotSeemToBeAValidHomeserver": "Sepertinya bukan homeserver yang kompatibel. URL salah?", - "@doesNotSeemToBeAValidHomeserver": {}, "countChatsAndCountParticipants": "{chats} chat dan {participants} anggota", "@countChatsAndCountParticipants": { "type": "String", @@ -3070,23 +2820,14 @@ } }, "unread": "Tidak dibaca", - "@unread": {}, "space": "Space", - "@space": {}, "spaces": "Space", - "@spaces": {}, "joinedChats": "Bergabung chat", - "@joinedChats": {}, "noMoreChatsFound": "Tidak ada chat lagi yang ditemukan...", - "@noMoreChatsFound": {}, "generatingVideoThumbnail": "Membuat gambar kecil video...", - "@generatingVideoThumbnail": {}, "changelog": "Catatan perubahan", - "@changelog": {}, "whatIsAHomeserver": "Apa itu homeserver?", - "@whatIsAHomeserver": {}, "sendRoomNotifications": "Kirim notifikasi @room", - "@sendRoomNotifications": {}, "updateInstalled": "🎉 Pembaruan {version} terpasang!", "@updateInstalled": { "type": "String", @@ -3097,7 +2838,6 @@ } }, "inviteOtherUsers": "Undang pengguna lain ke chat ini", - "@inviteOtherUsers": {}, "serverLimitReached": "Batasan server tercapai! Menunggu {seconds} detik...", "@serverLimitReached": { "type": "integer", @@ -3108,17 +2848,11 @@ } }, "chatPermissionsDescription": "Tentukan tingkat kekuasaan yang diperlukan untuk tindakan tertentu dalam chat ini. Tingkat kekuasaan 0, 50 dan 100 biasanya mewakili pengguna, moderator dan admin, tetapi gradasi apa pun dimungkinkan.", - "@chatPermissionsDescription": {}, "homeserverDescription": "Semua data Anda disimpan di dalam server, seperti halnya penyedia email. Anda dapat memilih homeserver mana yang ingin Anda gunakan, sementara Anda masih dapat berkomunikasi dengan semua orang. Pelajari lebih lanjut di https://matrix.org.", - "@homeserverDescription": {}, "oneOfYourDevicesIsNotVerified": "Salah satu perangkat Anda tidak terverifikasi", - "@oneOfYourDevicesIsNotVerified": {}, "noticeChatBackupDeviceVerification": "Catatan: Ketika Anda menghubungkan semua perangkat Anda ke cadangan chat, mereka akan diverifikasi secara otomatis.", - "@noticeChatBackupDeviceVerification": {}, "welcomeText": "Halo 👋 Ini FluffyChat. Kamu bisa masuk ke homeserver mana pun, yang kompatibel dengan https://matrix.org. Lalu, chat dengan siapa pun. Ini merupakan jaringan perpesanan besar yang terdesentralisasi!", - "@welcomeText": {}, "continueText": "Lanjutkan", - "@continueText": {}, "aboutHomeserver": "Tentang {homeserver}", "@aboutHomeserver": { "type": "String", @@ -3129,43 +2863,24 @@ } }, "blur": "Buram:", - "@blur": {}, "contactServerAdmin": "Hubungi admin server", - "@contactServerAdmin": {}, "opacity": "Opasitas:", - "@opacity": {}, "setWallpaper": "Atur later belakang", - "@setWallpaper": {}, "serverInformation": "Informasi server:", - "@serverInformation": {}, "noContactInformationProvided": "Server tidak menyediakan informasi kontak valid apa pun", - "@noContactInformationProvided": {}, "supportPage": "Laman dukungan", - "@supportPage": {}, "version": "Versi", - "@version": {}, "website": "Situs Web", - "@website": {}, "manageAccount": "Kelola akun", - "@manageAccount": {}, "contactServerSecurity": "Hubungi keamanan server", - "@contactServerSecurity": {}, "name": "Nama", - "@name": {}, "strikeThrough": "Coret", - "@strikeThrough": {}, "pleaseFillOut": "Silakan isi", - "@pleaseFillOut": {}, "addLink": "Tambahkan tautan", - "@addLink": {}, "invalidUrl": "URL tidak valid", - "@invalidUrl": {}, "boldText": "Teks tebal", - "@boldText": {}, "italicText": "Teks miring", - "@italicText": {}, "unableToJoinChat": "Tidak dapat bergabung dalam chat. Mungkin pihak lain telah menutup percakapan.", - "@unableToJoinChat": {}, "sendImages": "Kirim {count} gambar", "@sendImages": { "type": "String", @@ -3176,95 +2891,50 @@ } }, "compress": "Kompres", - "@compress": {}, "contentNotificationSettings": "Pengaturan notifikasi konten", - "@contentNotificationSettings": {}, "generalNotificationSettings": "Pengaturan notifikasi umum", - "@generalNotificationSettings": {}, "roomNotificationSettings": "Pengaturan notifikasi ruangan", - "@roomNotificationSettings": {}, "userSpecificNotificationSettings": "Pengaturan notifikasi spesifik pengguna", - "@userSpecificNotificationSettings": {}, "otherNotificationSettings": "Pengaturan notifikasi lainnya", - "@otherNotificationSettings": {}, "notificationRuleContainsUserName": "Berisi Nama Pengguna", - "@notificationRuleContainsUserName": {}, "notificationRuleContainsUserNameDescription": "Memberi tahu pengguna ketika pesan memiliki nama penggunanya.", - "@notificationRuleContainsUserNameDescription": {}, "notificationRuleMaster": "Bisukan semua notifikasi", - "@notificationRuleMaster": {}, "notificationRuleMasterDescription": "Menimpa peraturan lainnya dan menonaktifkan semua notifikasi.", - "@notificationRuleMasterDescription": {}, "notificationRuleSuppressNotices": "Dimakan Pesan Terautomasi", - "@notificationRuleSuppressNotices": {}, "notificationRuleSuppressNoticesDescription": "Mendiamkan notifikasi dari klien terautomasi seperti bot.", - "@notificationRuleSuppressNoticesDescription": {}, "notificationRuleInviteForMe": "Undang untuk Aku", - "@notificationRuleInviteForMe": {}, "notificationRuleInviteForMeDescription": "Memberi tahu pengguna ketika diundang ke ruangan.", - "@notificationRuleInviteForMeDescription": {}, "notificationRuleMemberEvent": "Peristiwa Anggota", - "@notificationRuleMemberEvent": {}, "notificationRuleMemberEventDescription": "Mendiamkan notifikasi peristiwa keanggotaan.", - "@notificationRuleMemberEventDescription": {}, "notificationRuleIsUserMention": "Sebutan Pengguna", - "@notificationRuleIsUserMention": {}, "notificationRuleIsUserMentionDescription": "Memberi tahu pengguna ketika disebut secara langsung dalam pesan.", - "@notificationRuleIsUserMentionDescription": {}, "notificationRuleContainsDisplayName": "Berisi Nama Tampilan", - "@notificationRuleContainsDisplayName": {}, "notificationRuleIsRoomMention": "Sebutan Ruangan", - "@notificationRuleIsRoomMention": {}, "notificationRuleIsRoomMentionDescription": "Memberi tahu pengguna ketika ada sebutan ruangan.", - "@notificationRuleIsRoomMentionDescription": {}, "notificationRuleRoomnotif": "Notifikasi Ruangan", - "@notificationRuleRoomnotif": {}, "notificationRuleRoomnotifDescription": "Memberi tahu pengguna ketika pesan berisi '@room'.", - "@notificationRuleRoomnotifDescription": {}, "notificationRuleTombstone": "Nisan", - "@notificationRuleTombstone": {}, "notificationRuleTombstoneDescription": "Memberi tahu pengguna tentang pesan deaktivasi ruangan.", - "@notificationRuleTombstoneDescription": {}, "notificationRuleReaction": "Reaksi", - "@notificationRuleReaction": {}, "notificationRuleReactionDescription": "Mendiamkan notifikasi reaksi.", - "@notificationRuleReactionDescription": {}, "notificationRuleRoomServerAcl": "ACL Server Ruangan", - "@notificationRuleRoomServerAcl": {}, "notificationRuleRoomServerAclDescription": "Mendiamkan notifikasi daftar kontrol akses server ruangan (ACL).", - "@notificationRuleRoomServerAclDescription": {}, "notificationRuleSuppressEdits": "Diamkan Penyuntingan", - "@notificationRuleSuppressEdits": {}, "notificationRuleSuppressEditsDescription": "Mendiamkan notifikasi pesan tersunting.", - "@notificationRuleSuppressEditsDescription": {}, "notificationRuleCall": "Panggilan", - "@notificationRuleCall": {}, "notificationRuleCallDescription": "Memberi tahu pengguna tentang panggilan.", - "@notificationRuleCallDescription": {}, "notificationRuleEncryptedRoomOneToOne": "Ruangan Terenkripsi Satu ke Satu", - "@notificationRuleEncryptedRoomOneToOne": {}, "notificationRuleEncryptedRoomOneToOneDescription": "Memberi tahu pengguna tentang pesan dalam ruangan satu ke satu.", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, "notificationRuleRoomOneToOne": "Ruangan Satu ke Satu", - "@notificationRuleRoomOneToOne": {}, "notificationRuleRoomOneToOneDescription": "Memberi tahu pengguna tentang pesan dalam ruangan satu ke satu.", - "@notificationRuleRoomOneToOneDescription": {}, "notificationRuleMessage": "Pesan", - "@notificationRuleMessage": {}, "notificationRuleMessageDescription": "Memberi tahu pengguna tentang pesan umum.", - "@notificationRuleMessageDescription": {}, "notificationRuleEncrypted": "Terenkripsi", - "@notificationRuleEncrypted": {}, "notificationRuleEncryptedDescription": "Memberi tahu pengguna tentang pesan dalam ruangan terenkripsi.", - "@notificationRuleEncryptedDescription": {}, "notificationRuleJitsi": "Jitsi", - "@notificationRuleJitsi": {}, "notificationRuleJitsiDescription": "Memberi tahu pengguna tentang peristiwa widget Jitsi.", - "@notificationRuleJitsiDescription": {}, "notificationRuleServerAcl": "Diamkan Peristiwa ACL Server", - "@notificationRuleServerAcl": {}, "notificationRuleServerAclDescription": "Mendiamkan notifikasi peristiwa ACL server.", - "@notificationRuleServerAclDescription": {}, "unknownPushRule": "Aturan dorongan '{rule}' tidak diketahui", "@unknownPushRule": { "type": "String", @@ -3275,23 +2945,14 @@ } }, "deletePushRuleCanNotBeUndone": "Jika kamu menghapus pengaturan notifikasi ini, maka tidak dapat diurungkan.", - "@deletePushRuleCanNotBeUndone": {}, "more": "Tambahan", - "@more": {}, "newChatRequest": "📩 Permintaan pesan baru", - "@newChatRequest": {}, "allDevices": "Semua perangkat", - "@allDevices": {}, "crossVerifiedDevices": "Perangkat terverifikasi silang", - "@crossVerifiedDevices": {}, "waitingForServer": "Menunggu server...", - "@waitingForServer": {}, "appIntroduction": "FluffyChat memungkinkanmu untuk mengobrol dengan teman-temanmu di berbagai perpesanan. Pelajari lebih lanjut di https://matrix.org atau ketuk *Lanjutkan* saja.", - "@appIntroduction": {}, "notificationRuleContainsDisplayNameDescription": "Memberi tahu pengguna ketika pesan berisi nama tampilannya.", - "@notificationRuleContainsDisplayNameDescription": {}, "shareKeysWith": "Bagikan kunci dengan...", - "@shareKeysWith": {}, "synchronizingPleaseWaitCounter": " Sinkronisasi… ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -3302,15 +2963,10 @@ } }, "shareKeysWithDescription": "Perangkat apa saja yang dipercayai supaya mereka bisa membaca bersama dengan pesanmu dalam obrolan terenkripsi?", - "@shareKeysWithDescription": {}, "verifiedDevicesOnly": "Perangkat terverifikasi saja", - "@verifiedDevicesOnly": {}, "crossVerifiedDevicesIfEnabled": "Verifikasi silang perangkat jika diaktifkan", - "@crossVerifiedDevicesIfEnabled": {}, "previous": "Sebelumnya", - "@previous": {}, "otherPartyNotLoggedIn": "Pihak lain belum masuk dan tidak dapat menerima pesan!", - "@otherPartyNotLoggedIn": {}, "appWantsToUseForLogin": "Gunakan '{server}' untuk masuk", "@appWantsToUseForLogin": { "type": "String", @@ -3321,35 +2977,20 @@ } }, "appWantsToUseForLoginDescription": "Anda memperbolehkan aplikasi dan situs web membagikan informasi tentang Anda.", - "@appWantsToUseForLoginDescription": {}, "open": "Buka", - "@open": {}, "takeAPhoto": "Ambil foto", - "@takeAPhoto": {}, "recordAVideo": "Rekam video", - "@recordAVideo": {}, "optionalMessage": "Pesan (opsional)...", - "@optionalMessage": {}, "notSupportedOnThisDevice": "Tidak didukung pada perangkat ini", - "@notSupportedOnThisDevice": {}, "enterNewChat": "Masuk ke obrolan baru", - "@enterNewChat": {}, "commandHint_roomupgrade": "Tingkatkan ruangan ini ke versi ruangan yang ditentukan", - "@commandHint_roomupgrade": {}, "pleaseWaitUntilInvited": "Silakan menunggu sampai seseorang dari ruangan mengundang Anda.", - "@pleaseWaitUntilInvited": {}, "setCustomPermissionLevel": "Atur tingkat perizinan kustom", - "@setCustomPermissionLevel": {}, "setPermissionsLevelDescription": "Silakan pilih peran yang sudah ditentukan di bawah atau masukkan tingkat perizinan kustom antara 0 dan 100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Abaikan pengguna", - "@ignoreUser": {}, "normalUser": "Pengguna biasa", - "@normalUser": {}, "approve": "Terima", - "@approve": {}, "youHaveKnocked": "Anda telah mengetuk", - "@youHaveKnocked": {}, "sentVoiceMessage": "🎙️ {duration} - Pesan suara dari {sender}", "@sentVoiceMessage": { "type": "String", @@ -3363,7 +3004,6 @@ } }, "checkList": "Ceklis", - "@checkList": {}, "countInvited": "{count} diundang", "@countInvited": { "type": "String", @@ -3374,23 +3014,133 @@ } }, "commandHint_logout": "Keluar dari perangkatmu saat ini", - "@commandHint_logout": {}, "commandHint_logoutall": "Keluarkan semua perangkat aktif", - "@commandHint_logoutall": {}, "displayNavigationRail": "Tampilkan jalur navigasi pada ponsel", - "@displayNavigationRail": {}, "customReaction": "Reaksi khusus", - "@customReaction": {}, "moreEvents": "Peristiwa tambahan", - "@moreEvents": {}, "declineInvitation": "Tolak undangan", - "@declineInvitation": {}, "noMessagesYet": "Belum ada pesan", - "@noMessagesYet": {}, "longPressToRecordVoiceMessage": "Tekan lama untuk merekam pesan suara.", - "@longPressToRecordVoiceMessage": {}, "pause": "Jeda", - "@pause": {}, "resume": "Lanjut", - "@resume": {} + "changedTheChatDescription": "{username} mengubah deskripsi obrolan", + "changedTheChatName": "{username} mengubah nama obrolan", + "newSubSpace": "Sub space baru", + "moveToDifferentSpace": "Pindahkan ke space berbeda", + "moveUp": "Pindah ke atas", + "moveDown": "Pindah ke bawah", + "removeFromSpaceDescription": "Obrolan akan dihapus dari space tetapi masih muncul di daftar obrolan Anda.", + "countChats": "{chats} obrolan", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Anggota space dari {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Anggota space dari {spaces} dapat mengetuk", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "donate": "Donasi", + "startedAPoll": "{username} memulai polling.", + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "poll": "Polling", + "startPoll": "Mulai polling", + "endPoll": "Akhiri polling", + "answersVisible": "Jawaban terlihat", + "answersHidden": "Jawaban tersembunyi", + "pollQuestion": "Pertanyaan polling", + "answerOption": "Opsi jawaban", + "addAnswerOption": "Tambah opsi jawaban", + "allowMultipleAnswers": "Izinkan beberapa jawaban", + "pollHasBeenEnded": "Polling telah diakhiri", + "countVotes": "{count, plural, =1{Satu suara} other{{count} suara}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Jawaban akan terlihat saat polling telah diakhiri", + "replyInThread": "Balas dalam thread", + "countReplies": "{count, plural, =1{Satu balasan} other{{count} balasan}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Thread", + "backToMainChat": "Kembali ke obrolan utama", + "saveChanges": "Simpan perubahan", + "createSticker": "Buat stiker atau emoji", + "useAsSticker": "Gunakan sebagai stiker", + "useAsEmoji": "Gunakan sebagai emoji", + "stickerPackNameAlreadyExists": "Nama paket stiker sudah ada", + "newStickerPack": "Paket stiker baru", + "stickerPackName": "Nama paket stiker", + "attribution": "Atribusi", + "skipChatBackup": "Lewati cadangan obrolan", + "skipChatBackupWarning": "Anda yakin? Tanpa mengaktifkan cadangan obrolan, Anda mungkin kehilangan akses ke pesan Anda jika Anda mengganti perangkat.", + "loadingMessages": "Memuat pesan", + "setupChatBackup": "Siapkan cadangan obrolan", + "noMoreResultsFound": "Tidak ada hasil lagi yang ditemukan", + "chatSearchedUntil": "Obrolan dicari hingga {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "URL Dasar Federasi", + "clientWellKnownInformation": "Informasi Client-Well-Known:", + "baseUrl": "URL Dasar", + "identityServer": "Server Identitas:", + "versionWithNumber": "Versi: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Log", + "advancedConfigs": "Konfigurasi Lanjutan", + "advancedConfigurations": "Konfigurasi lanjutan", + "signIn": "Masuk", + "createNewAccount": "Buat akun baru", + "signUpGreeting": "FluffyChat terdesentralisasi! Pilih server tempat Anda ingin membuat akun dan mari kita mulai!", + "signInGreeting": "Anda sudah memiliki akun di Matrix? Selamat datang kembali! Pilih homeserver Anda dan masuk.", + "appIntro": "Dengan FluffyChat Anda dapat mengobrol dengan teman-teman Anda. Ini adalah messenger [matrix] terdesentralisasi yang aman! Pelajari lebih lanjut di https://matrix.org jika Anda suka atau cukup daftar.", + "theProcessWasCanceled": "Proses dibatalkan." } From 1e75aa33854c02ef8f686cac69f4767bdc1b0bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Fri, 13 Feb 2026 16:56:36 +0100 Subject: [PATCH 083/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 30.9% (260 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 190 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index b4f208fa..408c593f 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1077,5 +1077,195 @@ "@pleaseClickOnLink": { "type": "String", "placeholders": {} + }, + "userAndOthersAreTyping": "{username} akked {count} nniḍen la ad ttarun…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} akked {username2} la ad ttarun…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} la yettaru…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪{username} yeffeɣ seg udiwenni", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Isem n useqdac", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} yuzen-d tadyant {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Ur yettwaselken ara", + "verified": "Yettwaselken", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Selken", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Bdu Aselken", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "Yedda uselken-ik·im akken iwata!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Aselken n imiḍanen nniḍen", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Asiwel s tvidyut", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Tawalit n uzray n udiwenni", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Yettban i yimttekkiyen meṛṛa", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Yettban i yal yiwen", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Izen n taɣect", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Araǧu n uneblag ad yeqbel asuter…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Araǧu n uneblag ad yeqbel imujit…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Araǧu n uneblag ad yeqbel uṭṭunen…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Tugna n ugdil:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Ɣur-k·m!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Nuzen-ak-d imayl", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Anwa i izemren ad yexdem anta tigawt", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Anwa i izemren ad yernu ɣer ugraw-agi", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Ayɣer tebɣiḍ ad temleḍ aya?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Sfeḍ aḥraz-ik·im n udiwenni akken ad d-tesnulfuḍ tasarut tamaynut n tririt?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "S tansiwin-agi i tzemreḍ ad terreḍ awal-ik·im n uɛeddi.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Aru izen…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Ih", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "kečč·em", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ur mazal ara tettekkaḍ deg udiwenni-a", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "Tettwagedleḍ seg udiwenni-agi", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} } } From b81b52330aeecbd1652ce75f990d32beefad64c5 Mon Sep 17 00:00:00 2001 From: spinningpaprika Date: Sat, 14 Feb 2026 13:49:15 +0100 Subject: [PATCH 084/333] chore(translations): Translated using Weblate (Swedish) Currently translated at 89.7% (754 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/sv/ --- lib/l10n/intl_sv.arb | 67 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_sv.arb b/lib/l10n/intl_sv.arb index 492a8cd0..1256a644 100644 --- a/lib/l10n/intl_sv.arb +++ b/lib/l10n/intl_sv.arb @@ -2932,5 +2932,70 @@ "notificationRuleContainsUserName": "Innehåller Användarnamn", "notificationRuleContainsUserNameDescription": "Avisera användaren när ett meddelande innehåller deras användarnamn.", "notificationRuleMaster": "Tysta alla notiser", - "notificationRuleMasterDescription": "Åsidosätter alla andra regler och tystar alla notiser." + "notificationRuleMasterDescription": "Åsidosätter alla andra regler och tystar alla notiser.", + "notificationRuleMemberEvent": "Medlemshändelse", + "notificationRuleContainsDisplayName": "Innehåller visningsnamn", + "notificationRuleReaction": "Reaktion", + "notificationRuleCall": "Samtal", + "notificationRuleJitsi": "Jitsi", + "takeAPhoto": "Ta ett foto", + "recordAVideo": "Spela in en video", + "more": "Mer", + "allDevices": "Alla enheter", + "optionalMessage": "(Valfritt) meddelande ...", + "enterNewChat": "Gå med i ny chatt", + "approve": "Godkänn", + "customReaction": "Anpassad reaktion", + "moreEvents": "Fler händelser", + "noMessagesYet": "Inga meddelanden än", + "pause": "Pausa", + "resume": "Fortsätt", + "countChats": "{chats} chattar", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "donate": "Donera", + "answerOption": "Svarsalternativ", + "addAnswerOption": "Lägg till svarsalternativ", + "allowMultipleAnswers": "Tillåt flera svar", + "countVotes": "{count, plural, =1{En röst} other{{count} röster}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replyInThread": "Svara i tråd", + "thread": "Tråd", + "countReplies": "{count, plural, =1{Ett svar} other{{count} svar}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "saveChanges": "Spara ändringar", + "loadingMessages": "Läser in meddelanden", + "noMoreResultsFound": "Inga fler resultat hittades", + "versionWithNumber": "Version: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Loggar", + "signIn": "Logga in", + "createNewAccount": "Skapa nytt konto" } From fda155d95ae36d173885358290b5f4c09aed3a5e Mon Sep 17 00:00:00 2001 From: fadelkon Date: Sat, 14 Feb 2026 20:04:36 +0100 Subject: [PATCH 085/333] chore(translations): Translated using Weblate (Catalan) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ca/ --- lib/l10n/intl_ca.arb | 6475 ++++++++++++++++++++---------------------- 1 file changed, 3141 insertions(+), 3334 deletions(-) diff --git a/lib/l10n/intl_ca.arb b/lib/l10n/intl_ca.arb index 80646eee..05148753 100644 --- a/lib/l10n/intl_ca.arb +++ b/lib/l10n/intl_ca.arb @@ -1,3339 +1,3146 @@ { - "@@last_modified": "2021-08-14 12:41:10.145728", - "about": "Quant a", - "@about": { - "type": "String", - "placeholders": {} - }, - "accept": "Accepta", - "@accept": { - "type": "String", - "placeholders": {} - }, - "acceptedTheInvitation": "👍 {username} ha acceptat la invitació", - "@acceptedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "account": "Compte", - "@account": { - "type": "String", - "placeholders": {} - }, - "activatedEndToEndEncryption": "🔐 {username} ha activat el xifratge d’extrem a extrem", - "@activatedEndToEndEncryption": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "admin": "Administració", - "@admin": { - "type": "String", - "placeholders": {} - }, - "alias": "àlies", - "@alias": { - "type": "String", - "placeholders": {} - }, - "allChats": "Tots els xats", - "@allChats": { - "type": "String", - "placeholders": {} - }, - "answeredTheCall": "{senderName} ha respost a la trucada", - "@answeredTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "anyoneCanJoin": "Qualsevol pot unir-se", - "@anyoneCanJoin": { - "type": "String", - "placeholders": {} - }, - "appLock": "Blocatge de l’aplicació", - "@appLock": { - "type": "String", - "placeholders": {} - }, - "archive": "Arxiu", - "@archive": { - "type": "String", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Es pot entrar al xat com a convidadi", - "@areGuestsAllowedToJoin": { - "type": "String", - "placeholders": {} - }, - "areYouSure": "N’esteu seguri?", - "@areYouSure": { - "type": "String", - "placeholders": {} - }, - "askSSSSSign": "Per a poder donar accés a l’altra persona, introduïu la frase de seguretat o clau de recuperació.", - "@askSSSSSign": { - "type": "String", - "placeholders": {} - }, - "askVerificationRequest": "Voleu acceptar aquesta sol·licitud de verificació de: {username}?", - "@askVerificationRequest": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "banFromChat": "Veta del xat", - "@banFromChat": { - "type": "String", - "placeholders": {} - }, - "banned": "Vetadi", - "@banned": { - "type": "String", - "placeholders": {} - }, - "bannedUser": "{username} ha vetat a {targetName}", - "@bannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "blockDevice": "Bloca el dispositiu", - "@blockDevice": { - "type": "String", - "placeholders": {} - }, - "botMessages": "Missatges del bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, - "cancel": "Cancel·la", - "@cancel": { - "type": "String", - "placeholders": {} - }, - "cantOpenUri": "No es pot obrir l’URI {uri}", - "@cantOpenUri": { - "type": "String", - "placeholders": { - "uri": { - "type": "String" - } - } - }, - "changeDeviceName": "Canvia el nom del dispositiu", - "@changeDeviceName": { - "type": "String", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} ha canviat la imatge del xat", - "@changedTheChatAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheChatDescriptionTo": "{username} ha canviat la descripció del xat a: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "description": { - "type": "String" - } - } - }, - "changedTheChatNameTo": "{username} ha canviat el nom del xat a: '{chatname}'", - "@changedTheChatNameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "chatname": { - "type": "String" - } - } - }, - "changedTheChatPermissions": "{username} ha canviat els permisos del xat", - "@changedTheChatPermissions": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheGuestAccessRules": "{username} ha canviat les normes d’accés dels convidats", - "@changedTheGuestAccessRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheGuestAccessRulesTo": "{username} ha canviat les normes d’accés dels convidats a: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheHistoryVisibility": "{username} ha canviat la visibilitat de l’historial", - "@changedTheHistoryVisibility": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheHistoryVisibilityTo": "{username} ha canviat la visibilitat de l’historial a: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheJoinRules": "{username} ha canviat les normes d’unió", - "@changedTheJoinRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheJoinRulesTo": "{username} ha canviat les normes d’unió a: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "joinRules": { - "type": "String" - } - } - }, - "changedTheProfileAvatar": "{username} ha canviat la seva imatge de perfil", - "@changedTheProfileAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheRoomAliases": "{username} ha canviat l’àlies de la sala", - "@changedTheRoomAliases": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheRoomInvitationLink": "{username} ha canviat l’enllaç per a convidar", - "@changedTheRoomInvitationLink": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changePassword": "Canvia la contrasenya", - "@changePassword": { - "type": "String", - "placeholders": {} - }, - "changeTheHomeserver": "Canvia el servidor", - "@changeTheHomeserver": { - "type": "String", - "placeholders": {} - }, - "changeTheme": "Canvia l’estil", - "@changeTheme": { - "type": "String", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Canvia el nom del grup", - "@changeTheNameOfTheGroup": { - "type": "String", - "placeholders": {} - }, - "channelCorruptedDecryptError": "El xifratge s’ha corromput", - "@channelCorruptedDecryptError": { - "type": "String", - "placeholders": {} - }, - "chat": "Xat", - "@chat": { - "type": "String", - "placeholders": {} - }, - "chatDetails": "Detalls del xat", - "@chatDetails": { - "type": "String", - "placeholders": {} - }, - "chats": "Xats", - "@chats": { - "type": "String", - "placeholders": {} - }, - "chooseAStrongPassword": "Trieu una contrasenya forta", - "@chooseAStrongPassword": { - "type": "String", - "placeholders": {} - }, - "close": "Tanca", - "@close": { - "type": "String", - "placeholders": {} - }, - "commandHint_html": "Envia text en format HTML", - "@commandHint_html": { - "type": "String", - "description": "Usage hint for the command /html" - }, - "commandHint_leave": "Abandona aquesta sala", - "@commandHint_leave": { - "type": "String", - "description": "Usage hint for the command /leave" - }, - "commandHint_op": "Estableix el nivell d'autoritat d'uni usuàriï (per defecte: 50)", - "@commandHint_op": { - "type": "String", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Envia text sense format", - "@commandHint_plain": { - "type": "String", - "description": "Usage hint for the command /plain" - }, - "commandHint_send": "Envia text", - "@commandHint_send": { - "type": "String", - "description": "Usage hint for the command /send" - }, - "compareEmojiMatch": "Compareu aquests emojis", - "@compareEmojiMatch": { - "type": "String", - "placeholders": {} - }, - "compareNumbersMatch": "Compareu aquests números", - "@compareNumbersMatch": { - "type": "String", - "placeholders": {} - }, - "confirm": "Confirma", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Connecta", - "@connect": { - "type": "String", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "El contacte ha estat convidat al grup", - "@contactHasBeenInvitedToTheGroup": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "Conté l'àlies", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Inclou nom d'usuàriï", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "copiedToClipboard": "S’ha copiat al porta-retalls", - "@copiedToClipboard": { - "type": "String", - "placeholders": {} - }, - "copy": "Copia", - "@copy": { - "type": "String", - "placeholders": {} - }, - "couldNotDecryptMessage": "No s'ha pogut desxifrar el missatge: {error}", - "@couldNotDecryptMessage": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "countParticipants": "{count} participants", - "@countParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "create": "Crea", - "@create": { - "type": "String", - "placeholders": {} - }, - "createdTheChat": "💬 {username} ha creat el xat", - "@createdTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "currentlyActive": "Actiu actualment", - "@currentlyActive": { - "type": "String", - "placeholders": {} - }, - "darkTheme": "Fosc", - "@darkTheme": { - "type": "String", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "String", - "placeholders": { - "date": { - "type": "String" - }, - "timeOfDay": { - "type": "String" - } - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "deactivateAccountWarning": "Es desactivarà el vostre compte d’usuàriï. És irreversible! Voleu fer-ho igualment?", - "@deactivateAccountWarning": { - "type": "String", - "placeholders": {} - }, - "delete": "Suprimeix", - "@delete": { - "type": "String", - "placeholders": {} - }, - "deleteAccount": "Suprimeix el compte", - "@deleteAccount": { - "type": "String", - "placeholders": {} - }, - "deleteMessage": "Suprimeix el missatge", - "@deleteMessage": { - "type": "String", - "placeholders": {} - }, - "device": "Dispositiu", - "@device": { - "type": "String", - "placeholders": {} - }, - "deviceId": "Id. de dispositiu", - "@deviceId": { - "type": "String", - "placeholders": {} - }, - "devices": "Dispositius", - "@devices": { - "type": "String", - "placeholders": {} - }, - "directChats": "Xats directes", - "@directChats": { - "type": "String", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Ha canviat l'àlies", - "@displaynameHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "downloadFile": "Baixa el fitxer", - "@downloadFile": { - "type": "String", - "placeholders": {} - }, - "edit": "Edita", - "@edit": { - "type": "String", - "placeholders": {} - }, - "editDisplayname": "Edita l'àlies", - "@editDisplayname": { - "type": "String", - "placeholders": {} - }, - "emoteExists": "L'emoticona ja existeix!", - "@emoteExists": { - "type": "String", - "placeholders": {} - }, - "emoteInvalid": "Codi d'emoticona invàlid!", - "@emoteInvalid": { - "type": "String", - "placeholders": {} - }, - "emotePacks": "Paquet d'emoticones de la sala", - "@emotePacks": { - "type": "String", - "placeholders": {} - }, - "emoteSettings": "Paràmetres de les emoticones", - "@emoteSettings": { - "type": "String", - "placeholders": {} - }, - "emoteShortcode": "Codi d'emoticona", - "@emoteShortcode": { - "type": "String", - "placeholders": {} - }, - "emoteWarnNeedToPick": "Has de seleccionar un codi d'emoticona i una imatge!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, - "emptyChat": "Xat buit", - "@emptyChat": { - "type": "String", - "placeholders": {} - }, - "enableEmotesGlobally": "Activa el paquet d'emoticones global", - "@enableEmotesGlobally": { - "type": "String", - "placeholders": {} - }, - "enableEncryptionWarning": "No podreu desactivar el xifratge mai més. N’esteu segur?", - "@enableEncryptionWarning": { - "type": "String", - "placeholders": {} - }, - "encrypted": "Xifrat", - "@encrypted": { - "type": "String", - "placeholders": {} - }, - "encryption": "Xifratge", - "@encryption": { - "type": "String", - "placeholders": {} - }, - "encryptionNotEnabled": "El xifratge no s’ha activat", - "@encryptionNotEnabled": { - "type": "String", - "placeholders": {} - }, - "endedTheCall": "{senderName} ha finalitzat la trucada", - "@endedTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "enterAnEmailAddress": "Introduïu una adreça electrònica", - "@enterAnEmailAddress": { - "type": "String", - "placeholders": {} - }, - "enterYourHomeserver": "Introdueix el teu servidor", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, - "fileName": "Nom del fitxer", - "@fileName": { - "type": "String", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "String", - "placeholders": {} - }, - "forward": "Reenvia", - "@forward": { - "type": "String", - "placeholders": {} - }, - "fromJoining": "Des de la unió", - "@fromJoining": { - "type": "String", - "placeholders": {} - }, - "fromTheInvitation": "Des de la invitació", - "@fromTheInvitation": { - "type": "String", - "placeholders": {} - }, - "group": "Grup", - "@group": { - "type": "String", - "placeholders": {} - }, - "groupIsPublic": "El grup és públic", - "@groupIsPublic": { - "type": "String", - "placeholders": {} - }, - "groupWith": "Grup amb {displayname}", - "@groupWith": { - "type": "String", - "placeholders": { - "displayname": { - "type": "String" - } - } - }, - "guestsAreForbidden": "Els convidats no poden unir-se", - "@guestsAreForbidden": { - "type": "String", - "placeholders": {} - }, - "guestsCanJoin": "Els convidats es poden unir", - "@guestsCanJoin": { - "type": "String", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} ha retirat la invitació de {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "help": "Ajuda", - "@help": { - "type": "String", - "placeholders": {} - }, - "hideRedactedEvents": "Amaga els esdeveniments estripats", - "@hideRedactedEvents": { - "type": "String", - "placeholders": {} - }, - "hideUnknownEvents": "Amaga els esdeveniments desconeguts", - "@hideUnknownEvents": { - "type": "String", - "placeholders": {} - }, - "id": "Id.", - "@id": { - "type": "String", - "placeholders": {} - }, - "identity": "Identitat", - "@identity": { - "type": "String", - "placeholders": {} - }, - "ignoredUsers": "Usuaris ignorats", - "@ignoredUsers": { - "type": "String", - "placeholders": {} - }, - "iHaveClickedOnLink": "He fet clic a l'enllaç", - "@iHaveClickedOnLink": { - "type": "String", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Frase de seguretat o clau de recuperació incorrecta", - "@incorrectPassphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "inviteContact": "Convida contacte", - "@inviteContact": { - "type": "String", - "placeholders": {} - }, - "inviteContactToGroup": "Convida contacte a {groupName}", - "@inviteContactToGroup": { - "type": "String", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "invited": "Convidat", - "@invited": { - "type": "String", - "placeholders": {} - }, - "invitedUser": "📩 {username} ha convidat a {targetName}", - "@invitedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "invitedUsersOnly": "Només usuàriïs convidadis", - "@invitedUsersOnly": { - "type": "String", - "placeholders": {} - }, - "inviteForMe": "Invitació per a mi", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, - "inviteText": "{username} t'ha convidat a FluffyChat.\n1. Visita fluffychat.im i instaŀla l'app\n2. Registra't o inicia sessió\n3. Obre l'enllaç d'invitació:\n{link}", - "@inviteText": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "isTyping": "escrivint…", - "@isTyping": { - "type": "String", - "placeholders": {} - }, - "joinedTheChat": "👋 {username} s'ha unit al xat", - "@joinedTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "joinRoom": "Uneix-te a la sala", - "@joinRoom": { - "type": "String", - "placeholders": {} - }, - "kicked": "👞 {username} ha expulsat a {targetName}", - "@kicked": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "kickedAndBanned": "🙅 {username} ha expulsat i vetat a {targetName}", - "@kickedAndBanned": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "kickFromChat": "Expulsa del xat", - "@kickFromChat": { - "type": "String", - "placeholders": {} - }, - "lastActiveAgo": "Actiu per última vegada: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "String", - "placeholders": { - "localizedTimeShort": { - "type": "String" - } - } - }, - "leave": "Abandona", - "@leave": { - "type": "String", - "placeholders": {} - }, - "leftTheChat": "Ha marxat del xat", - "@leftTheChat": { - "type": "String", - "placeholders": {} - }, - "license": "Llicència", - "@license": { - "type": "String", - "placeholders": {} - }, - "lightTheme": "Clar", - "@lightTheme": { - "type": "String", - "placeholders": {} - }, - "loadCountMoreParticipants": "Carrega {count} participants més", - "@loadCountMoreParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "loadingPleaseWait": "S’està carregant… Espereu.", - "@loadingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "loadMore": "Carrega’n més…", - "@loadMore": { - "type": "String", - "placeholders": {} - }, - "locationDisabledNotice": "S’han desactivat els serveis d’ubicació. Activeu-los per a compartir la vostra ubicació.", - "@locationDisabledNotice": { - "type": "String", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "S’ha rebutjat el permís d’ubicació. Atorgueu-lo per a poder compartir la vostra ubicació.", - "@locationPermissionDeniedNotice": { - "type": "String", - "placeholders": {} - }, - "login": "Inicia la sessió", - "@login": { - "type": "String", - "placeholders": {} - }, - "logInTo": "Inicia sessió a {homeserver}", - "@logInTo": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "logout": "Finalitza la sessió", - "@logout": { - "type": "String", - "placeholders": {} - }, - "memberChanges": "Canvis de participants", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, - "mention": "Menciona", - "@mention": { - "type": "String", - "placeholders": {} - }, - "moderator": "Moderador", - "@moderator": { - "type": "String", - "placeholders": {} - }, - "muteChat": "Silencia el xat", - "@muteChat": { - "type": "String", - "placeholders": {} - }, - "needPantalaimonWarning": "Tingueu en compte que, ara per ara, us cal el Pantalaimon per a poder utilitzar el xifratge d’extrem a extrem.", - "@needPantalaimonWarning": { - "type": "String", - "placeholders": {} - }, - "newMessageInFluffyChat": "💬 Missatge nou al FluffyChat", - "@newMessageInFluffyChat": { - "type": "String", - "placeholders": {} - }, - "newVerificationRequest": "Nova sol·licitud de verificació!", - "@newVerificationRequest": { - "type": "String", - "placeholders": {} - }, - "no": "No", - "@no": { - "type": "String", - "placeholders": {} - }, - "noConnectionToTheServer": "Sense connexió al servidor", - "@noConnectionToTheServer": { - "type": "String", - "placeholders": {} - }, - "noEmotesFound": "No s’ha trobat cap emoticona. 😕", - "@noEmotesFound": { - "type": "String", - "placeholders": {} - }, - "noGoogleServicesWarning": "Sembla que no teniu els Serveis de Google al telèfon. Això és una bona decisió respecte a la vostra privadesa! Per a rebre notificacions automàtiques del FluffyChat, us recomanem instaŀlar ntfy. Amb ntfy o qualsevol altre proveïdor de Unified Push, pots rebre notificacions de forma segura i lliure. Pots instaŀlar ntfy des de la PlayStore o des de F-Droid.", - "@noGoogleServicesWarning": { - "type": "String", - "placeholders": {} - }, - "none": "Cap", - "@none": { - "type": "String", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "Encara no heu afegit cap mètode per a poder recuperar la contrasenya.", - "@noPasswordRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "noPermission": "Sense permís", - "@noPermission": { - "type": "String", - "placeholders": {} - }, - "noRoomsFound": "No s’ha trobat cap sala…", - "@noRoomsFound": { - "type": "String", - "placeholders": {} - }, - "notifications": "Notificacions", - "@notifications": { - "type": "String", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notificacions activades per a aquest compte", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, - "numUsersTyping": "{count} usuàriïs escrivint…", - "@numUsersTyping": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "offline": "Fora de línia", - "@offline": { - "type": "String", - "placeholders": {} - }, - "ok": "D'acord", - "@ok": { - "type": "String", - "placeholders": {} - }, - "online": "En línia", - "@online": { - "type": "String", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "La còpia de seguretat de claus en línia està activada", - "@onlineKeyBackupEnabled": { - "type": "String", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Alguna cosa ha anat malament…", - "@oopsSomethingWentWrong": { - "type": "String", - "placeholders": {} - }, - "openAppToReadMessages": "Obre l'aplicació per llegir els missatges", - "@openAppToReadMessages": { - "type": "String", - "placeholders": {} - }, - "openCamera": "Obre la càmera", - "@openCamera": { - "type": "String", - "placeholders": {} - }, - "or": "O", - "@or": { - "type": "String", - "placeholders": {} - }, - "passphraseOrKey": "contrasenya o clau de recuperació", - "@passphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "password": "Contrasenya", - "@password": { - "type": "String", - "placeholders": {} - }, - "passwordForgotten": "Contrasenya oblidada", - "@passwordForgotten": { - "type": "String", - "placeholders": {} - }, - "passwordHasBeenChanged": "La contrasenya ha canviat", - "@passwordHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "passwordRecovery": "Recuperació de contrassenya", - "@passwordRecovery": { - "type": "String", - "placeholders": {} - }, - "pickImage": "Selecciona una imatge", - "@pickImage": { - "type": "String", - "placeholders": {} - }, - "pin": "Fixa", - "@pin": { - "type": "String", - "placeholders": {} - }, - "play": "Reproduir {fileName}", - "@play": { - "type": "String", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "pleaseChooseAPasscode": "Tria un codi d'accés", - "@pleaseChooseAPasscode": { - "type": "String", - "placeholders": {} - }, - "pleaseClickOnLink": "Fes clic a l'enllaç del correu i, després, segueix.", - "@pleaseClickOnLink": { - "type": "String", - "placeholders": {} - }, - "pleaseEnter4Digits": "Introdueix 4 dígits o deixa-ho buit per desactivar el bloqueig.", - "@pleaseEnter4Digits": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourPassword": "Introdueix la teva contrasenya", - "@pleaseEnterYourPassword": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Introdueix el teu nom d'usuàriï", - "@pleaseEnterYourUsername": { - "type": "String", - "placeholders": {} - }, - "privacy": "Privadesa", - "@privacy": { - "type": "String", - "placeholders": {} - }, - "publicRooms": "Sales públiques", - "@publicRooms": { - "type": "String", - "placeholders": {} - }, - "pushRules": "Regles push", - "@pushRules": { - "type": "String", - "placeholders": {} - }, - "recording": "Enregistrant", - "@recording": { - "type": "String", - "placeholders": {} - }, - "redactedAnEvent": "{username} ha estripat un esdeveniment", - "@redactedAnEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "reject": "Rebutja", - "@reject": { - "type": "String", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} ha rebutjat la invitació", - "@rejectedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "rejoin": "Torna-t'hi a unir", - "@rejoin": { - "type": "String", - "placeholders": {} - }, - "remove": "Elimina", - "@remove": { - "type": "String", - "placeholders": {} - }, - "removeAllOtherDevices": "Elimina tots els altres dispositius", - "@removeAllOtherDevices": { - "type": "String", - "placeholders": {} - }, - "removedBy": "Eliminat per {username}", - "@removedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "removeDevice": "Elimina dispositiu", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, - "unbanFromChat": "Aixeca el veto", - "@unbanFromChat": { - "type": "String", - "placeholders": {} - }, - "reply": "Respon", - "@reply": { - "type": "String", - "placeholders": {} - }, - "requestPermission": "Sol·licita permís", - "@requestPermission": { - "type": "String", - "placeholders": {} - }, - "roomHasBeenUpgraded": "La sala s'ha actualitzat", - "@roomHasBeenUpgraded": { - "type": "String", - "placeholders": {} - }, - "security": "Seguretat", - "@security": { - "type": "String", - "placeholders": {} - }, - "seenByUser": "Vist per {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "send": "Envia", - "@send": { - "type": "String", - "placeholders": {} - }, - "sendAMessage": "Envia un missatge", - "@sendAMessage": { - "type": "String", - "placeholders": {} - }, - "sendAsText": "Envia com a text", - "@sendAsText": { - "type": "String" - }, - "sendAudio": "Envia un àudio", - "@sendAudio": { - "type": "String", - "placeholders": {} - }, - "sendFile": "Envia un fitxer", - "@sendFile": { - "type": "String", - "placeholders": {} - }, - "sendImage": "Envia una imatge", - "@sendImage": { - "type": "String", - "placeholders": {} - }, - "sendOriginal": "Envia l’original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Envia adhesiu", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "sendVideo": "Envia un vídeo", - "@sendVideo": { - "type": "String", - "placeholders": {} - }, - "sentAFile": "📁 {username} ha enviat un fitxer", - "@sentAFile": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAnAudio": "🎤 {username} ha enviat un àudio", - "@sentAnAudio": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAPicture": "🖼️ {username} ha enviat una imatge", - "@sentAPicture": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentASticker": "😊 {username} ha enviat un adhesiu", - "@sentASticker": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAVideo": "🎥 {username} ha enviat un vídeo", - "@sentAVideo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentCallInformations": "{senderName} ha enviat informació de trucada", - "@sentCallInformations": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "setInvitationLink": "Defineix l’enllaç per a convidar", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Defineix el nivell de permisos", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "setStatus": "Defineix l’estat", - "@setStatus": { - "type": "String", - "placeholders": {} - }, - "settings": "Paràmetres", - "@settings": { - "type": "String", - "placeholders": {} - }, - "share": "Comparteix", - "@share": { - "type": "String", - "placeholders": {} - }, - "sharedTheLocation": "{username} n’ha compartit la ubicació", - "@sharedTheLocation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "singlesignon": "Autenticació única", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "skip": "Omet", - "@skip": { - "type": "String", - "placeholders": {} - }, - "sourceCode": "Codi font", - "@sourceCode": { - "type": "String", - "placeholders": {} - }, - "startedACall": "{senderName} ha iniciat una trucada", - "@startedACall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "statusExampleMessage": "Com us sentiu avui?", - "@statusExampleMessage": { - "type": "String", - "placeholders": {} - }, - "submit": "Envia", - "@submit": { - "type": "String", - "placeholders": {} - }, - "systemTheme": "Sistema", - "@systemTheme": { - "type": "String", - "placeholders": {} - }, - "theyDontMatch": "No coincideixen", - "@theyDontMatch": { - "type": "String", - "placeholders": {} - }, - "theyMatch": "Coincideixen", - "@theyMatch": { - "type": "String", - "placeholders": {} - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Marca com a llegit/sense llegir", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "tooManyRequestsWarning": "Massa sol·licituds. Torna-ho a provar més tard!", - "@tooManyRequestsWarning": { - "type": "String", - "placeholders": {} - }, - "tryToSendAgain": "Intenta tornar a enviar", - "@tryToSendAgain": { - "type": "String", - "placeholders": {} - }, - "unavailable": "No disponible", - "@unavailable": { - "type": "String", - "placeholders": {} - }, - "unbannedUser": "{username} ha aixecat el veto a {targetName}", - "@unbannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "unblockDevice": "Desbloqueja dispositiu", - "@unblockDevice": { - "type": "String", - "placeholders": {} - }, - "unknownDevice": "Dispositiu desconegut", - "@unknownDevice": { - "type": "String", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "L’algorisme de xifratge és desconegut", - "@unknownEncryptionAlgorithm": { - "type": "String", - "placeholders": {} - }, - "unknownEvent": "Esdeveniment desconegut '{type}'", - "@unknownEvent": { - "type": "String", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "unmuteChat": "Deixa de silenciar el xat", - "@unmuteChat": { - "type": "String", - "placeholders": {} - }, - "unpin": "Deixa de fixar", - "@unpin": { - "type": "String", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 xat no llegit} other{{unreadCount} xats no llegits}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, - "userAndOthersAreTyping": "{username} i {count} més estan escrivint…", - "@userAndOthersAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "userAndUserAreTyping": "{username} i {username2} estan escrivint…", - "@userAndUserAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "username2": { - "type": "String" - } - } - }, - "userIsTyping": "{username} està escrivint…", - "@userIsTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "userLeftTheChat": "🚪 {username} ha marxat del xat", - "@userLeftTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "username": "Nom d’usuàriï", - "@username": { - "type": "String", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} ha enviat un esdeveniment {type}", - "@userSentUnknownEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "type": { - "type": "String" - } - } - }, - "verify": "Verifica", - "@verify": { - "type": "String", - "placeholders": {} - }, - "verifyStart": "Inicia la verificació", - "@verifyStart": { - "type": "String", - "placeholders": {} - }, - "verifySuccess": "T'has verificat correctament!", - "@verifySuccess": { - "type": "String", - "placeholders": {} - }, - "verifyTitle": "Verificant un altre compte", - "@verifyTitle": { - "type": "String", - "placeholders": {} - }, - "videoCall": "Videotrucada", - "@videoCall": { - "type": "String", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibilitat de l’historial del xat", - "@visibilityOfTheChatHistory": { - "type": "String", - "placeholders": {} - }, - "visibleForAllParticipants": "Visible per a tots els participants", - "@visibleForAllParticipants": { - "type": "String", - "placeholders": {} - }, - "visibleForEveryone": "Visible per a tothom", - "@visibleForEveryone": { - "type": "String", - "placeholders": {} - }, - "voiceMessage": "Missatge de veu", - "@voiceMessage": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerEmoji": "S’està esperant que l’altre accepti l’emoji…", - "@waitingPartnerEmoji": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerNumbers": "S’està esperant que l’altre accepti els nombres…", - "@waitingPartnerNumbers": { - "type": "String", - "placeholders": {} - }, - "wallpaper": "Fons:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, - "warning": "Atenció!", - "@warning": { - "type": "String", - "placeholders": {} - }, - "weSentYouAnEmail": "Us hem enviat un missatge de correu electrònic", - "@weSentYouAnEmail": { - "type": "String", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Qui pot unir-se a aquest grup", - "@whoIsAllowedToJoinThisGroup": { - "type": "String", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "Amb aquestes adreces, si ho necessiteu, podeu recuperar la vostra contrasenya.", - "@withTheseAddressesRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "writeAMessage": "Escriviu un missatge…", - "@writeAMessage": { - "type": "String", - "placeholders": {} - }, - "yes": "Sí", - "@yes": { - "type": "String", - "placeholders": {} - }, - "you": "Vós", - "@you": { - "type": "String", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "Ja no participeu en aquest xat", - "@youAreNoLongerParticipatingInThisChat": { - "type": "String", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "T'han vetat en aquest xat", - "@youHaveBeenBannedFromThisChat": { - "type": "String", - "placeholders": {} - }, - "yourPublicKey": "La vostra clau pública", - "@yourPublicKey": { - "type": "String", - "placeholders": {} - }, - "all": "Tot", - "@all": { - "type": "String", - "placeholders": {} - }, - "addToSpace": "Afegeix a un espai", - "@addToSpace": {}, - "areYouSureYouWantToLogout": "Segur que voleu finalitzar la sessió?", - "@areYouSureYouWantToLogout": { - "type": "String", - "placeholders": {} - }, - "addEmail": "Afegeix una adreça electrònica", - "@addEmail": { - "type": "String", - "placeholders": {} - }, - "commandInvalid": "L’ordre no és vàlida", - "@commandInvalid": { - "type": "String" - }, - "fontSize": "Mida de la lletra", - "@fontSize": { - "type": "String", - "placeholders": {} - }, - "goToTheNewRoom": "Ves a la sala nova", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, - "next": "Següent", - "@next": { - "type": "String", - "placeholders": {} - }, - "link": "Enllaç", - "@link": {}, - "people": "Gent", - "@people": { - "type": "String", - "placeholders": {} - }, - "redactMessage": "Estripa el missatge", - "@redactMessage": { - "type": "String", - "placeholders": {} - }, - "sendOnEnter": "Envia en prémer Retorn", - "@sendOnEnter": {}, - "clearArchive": "Neteja l’arxiu", - "@clearArchive": {}, - "chatBackupDescription": "Els teus xats antics estan protegits amb una clau de recuperació. Assegureu-vos de no perdre-la.", - "@chatBackupDescription": { - "type": "String", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "El xat s’ha afegit a aquest espai", - "@chatHasBeenAddedToThisSpace": {}, - "autoplayImages": "Reprodueix automàticament enganxines i emoticones animades", - "@autoplayImages": { - "type": "String", - "placeholder": {} - }, - "chatBackup": "Còpia de seguretat del xat", - "@chatBackup": { - "type": "String", - "placeholders": {} - }, - "blocked": "Blocat", - "@blocked": { - "type": "String", - "placeholders": {} - }, - "everythingReady": "Tot és a punt!", - "@everythingReady": { - "type": "String", - "placeholders": {} - }, - "spaceName": "Nom de l’espai", - "@spaceName": { - "type": "String", - "placeholders": {} - }, - "search": "Cerca", - "@search": { - "type": "String", - "placeholders": {} - }, - "verified": "Verificat", - "@verified": { - "type": "String", - "placeholders": {} - }, - "newChat": "Xat nou", - "@newChat": { - "type": "String", - "placeholders": {} - }, - "changeYourAvatar": "Canvia l’avatar", - "@changeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "ignore": "Ignora", - "@ignore": { - "type": "String", - "placeholders": {} - }, - "commandHint_react": "Envia una resposta com a reacció", - "@commandHint_react": { - "type": "String", - "description": "Usage hint for the command /react" - }, - "defaultPermissionLevel": "Nivell de permisos per defecte per nous membres", - "@defaultPermissionLevel": { - "type": "String", - "placeholders": {} - }, - "extremeOffensive": "Extremadament ofensiu", - "@extremeOffensive": { - "type": "String", - "placeholders": {} - }, - "yourChatBackupHasBeenSetUp": "S’ha configurat la còpia de seguretat del xat.", - "@yourChatBackupHasBeenSetUp": {}, - "contentHasBeenReported": "El contingut s’ha denunciat als administradors del servidor", - "@contentHasBeenReported": { - "type": "String", - "placeholders": {} - }, - "enableEncryption": "Activa el xifratge", - "@enableEncryption": { - "type": "String", - "placeholders": {} - }, - "addAccount": "Afegeix un compte", - "@addAccount": {}, - "noEncryptionForPublicRooms": "Només podreu activar el xifratge quan la sala ja no sigui accessible públicament.", - "@noEncryptionForPublicRooms": { - "type": "String", - "placeholders": {} - }, - "roomVersion": "Versió de la sala", - "@roomVersion": { - "type": "String", - "placeholders": {} - }, - "sendMessages": "Envia missatges", - "@sendMessages": { - "type": "String", - "placeholders": {} - }, - "saveFile": "Desa el fitxer", - "@saveFile": { - "type": "String", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Seguiu les instruccions al lloc web i toqueu «Següent».", - "@pleaseFollowInstructionsOnWeb": { - "type": "String", - "placeholders": {} - }, - "reportMessage": "Denuncia el missatge", - "@reportMessage": { - "type": "String", - "placeholders": {} - }, - "setAsCanonicalAlias": "Defineix com a àlies principal", - "@setAsCanonicalAlias": { - "type": "String", - "placeholders": {} - }, - "status": "Estat", - "@status": { - "type": "String", - "placeholders": {} - }, - "toggleFavorite": "Commuta l’estat «preferit»", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Commuta l’estat «silenci»", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transfereix des d’un altre dispositiu", - "@transferFromAnotherDevice": { - "type": "String", - "placeholders": {} - }, - "setCustomEmotes": "Defineix emoticones personalitzades", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Qui pot efectuar quina acció", - "@whoCanPerformWhichAction": { - "type": "String", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Per què voleu denunciar això?", - "@whyDoYouWantToReportThis": { - "type": "String", - "placeholders": {} - }, - "wipeChatBackup": "Voleu suprimir la còpia de seguretat dels xats per a crear una clau de recuperació nova?", - "@wipeChatBackup": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "S’està esperant que l’altre accepti la sol·licitud…", - "@waitingPartnerAcceptRequest": { - "type": "String", - "placeholders": {} - }, - "unverified": "No verificat", - "@unverified": {}, - "commandHint_me": "Descriviu-vos", - "@commandHint_me": { - "type": "String", - "description": "Usage hint for the command /me" - }, - "commandMissing": "{command} no és una ordre.", - "@commandMissing": { - "type": "String", - "placeholders": { - "command": { - "type": "String" - } + "@@last_modified": "2021-08-14 12:41:10.145728", + "about": "Quant a", + "@about": { + "type": "String", + "placeholders": {} }, - "description": "State that {command} is not a valid /command." - }, - "configureChat": "Configura el xat", - "@configureChat": { - "type": "String", - "placeholders": {} - }, - "copyToClipboard": "Copia al porta-retalls", - "@copyToClipboard": { - "type": "String", - "placeholders": {} - }, - "createNewSpace": "Espai nou", - "@createNewSpace": { - "type": "String", - "placeholders": {} - }, - "errorObtainingLocation": "S’ha produït un error en obtenir la ubicació: {error}", - "@errorObtainingLocation": { - "type": "String", - "placeholders": { - "error": { + "accept": "Accepta", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ha acceptat la invitació", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Compte", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ha activat el xifratge d’extrem a extrem", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "admin": "Administració", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "àlies", + "@alias": { + "type": "String", + "placeholders": {} + }, + "allChats": "Tots els xats", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} ha respost a la trucada", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Qualsevol pot unir-se", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "Blocatge de l’aplicació", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "archive": "Arxiu", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Es pot entrar al xat com a convidadi", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "N’esteu seguri?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "Per a poder donar accés a l’altra persona, introduïu la frase de seguretat o clau de recuperació.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Voleu acceptar aquesta sol·licitud de verificació de: {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "banFromChat": "Veta del xat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Vetadi", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} ha vetat a {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Bloca el dispositiu", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Missatges del bot", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancel·la", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "No es pot obrir l’URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Canvia el nom del dispositiu", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} ha canviat la imatge del xat", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescriptionTo": "{username} ha canviat la descripció del xat a: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatNameTo": "{username} ha canviat el nom del xat a: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} ha canviat els permisos del xat", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} ha canviat les normes d’accés dels convidats", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} ha canviat les normes d’accés dels convidats a: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} ha canviat la visibilitat de l’historial", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} ha canviat la visibilitat de l’historial a: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} ha canviat les normes d’unió", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} ha canviat les normes d’unió a: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} ha canviat la seva imatge de perfil", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} ha canviat l’àlies de la sala", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} ha canviat l’enllaç per a convidar", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Canvia la contrasenya", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Canvia el servidor", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Canvia l’estil", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Canvia el nom del grup", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "El xifratge s’ha corromput", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Xat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Detalls del xat", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chats": "Xats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Trieu una contrasenya forta", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "close": "Tanca", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_html": "Envia text en format HTML", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_leave": "Abandona aquesta sala", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_op": "Estableix el nivell d'autoritat d'uni usuàriï (per defecte: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Envia text sense format", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_send": "Envia text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "compareEmojiMatch": "Compareu aquests emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Compareu aquests números", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirma", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Connecta", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "El contacte ha estat convidat al grup", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Conté l'àlies", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Inclou nom d'usuàriï", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "S’ha copiat al porta-retalls", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copia", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "No s'ha pogut desxifrar el missatge: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "countParticipants": "{count} participants", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Crea", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} ha creat el xat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "Actiu actualment", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Fosc", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{day}-{month}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{day}-{month}-{year}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "Es desactivarà el vostre compte d’usuàriï. És irreversible! Voleu fer-ho igualment?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "delete": "Suprimeix", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Suprimeix el compte", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Suprimeix el missatge", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Dispositiu", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Id. de dispositiu", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Dispositius", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Xats directes", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Ha canviat l'àlies", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Baixa el fitxer", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Edita", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editDisplayname": "Edita l'àlies", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "L'emoticona ja existeix!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Codi d'emoticona invàlid!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Paquet d'emoticones de la sala", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Paràmetres de les emoticones", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "emoteShortcode": "Codi d'emoticona", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "Has de seleccionar un codi d'emoticona i una imatge!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Xat buit", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Activa el paquet d'emoticones global", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "No podreu desactivar el xifratge mai més. N’esteu segur?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Xifrat", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Xifratge", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "El xifratge no s’ha activat", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ha finalitzat la trucada", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Introduïu una adreça electrònica", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "enterYourHomeserver": "Introdueix el teu servidor", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "fileName": "Nom del fitxer", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "forward": "Reenvia", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "Des de la unió", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "Des de la invitació", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "group": "Grup", + "@group": { + "type": "String", + "placeholders": {} + }, + "groupIsPublic": "El grup és públic", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Grup amb {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Els convidats no poden unir-se", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Els convidats es poden unir", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} ha retirat la invitació de {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Ajuda", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Amaga els esdeveniments estripats", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideUnknownEvents": "Amaga els esdeveniments desconeguts", + "@hideUnknownEvents": { + "type": "String", + "placeholders": {} + }, + "id": "Id.", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identitat", + "@identity": { + "type": "String", + "placeholders": {} + }, + "ignoredUsers": "Usuaris ignorats", + "@ignoredUsers": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "He fet clic a l'enllaç", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Frase de seguretat o clau de recuperació incorrecta", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Convida contacte", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroup": "Convida contacte a {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "invited": "Convidat", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUser": "📩 {username} ha convidat a {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Només usuàriïs convidadis", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invitació per a mi", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} t'ha convidat a FluffyChat.\n1. Visita fluffychat.im i instaŀla l'app\n2. Registra't o inicia sessió\n3. Obre l'enllaç d'invitació:\n{link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "escrivint…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} s'ha unit al xat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Uneix-te a la sala", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} ha expulsat a {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} ha expulsat i vetat a {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Expulsa del xat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Actiu per última vegada: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Abandona", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Ha marxat del xat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "Llicència", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Clar", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Carrega {count} participants més", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadingPleaseWait": "S’està carregant… Espereu.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Carrega’n més…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "S’han desactivat els serveis d’ubicació. Activeu-los per a compartir la vostra ubicació.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "S’ha rebutjat el permís d’ubicació. Atorgueu-lo per a poder compartir la vostra ubicació.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Inicia la sessió", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Inicia sessió a {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Finalitza la sessió", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Canvis de participants", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Menciona", + "@mention": { + "type": "String", + "placeholders": {} + }, + "moderator": "Moderador", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Silencia el xat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Tingueu en compte que, ara per ara, us cal el Pantalaimon per a poder utilitzar el xifratge d’extrem a extrem.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 Missatge nou al FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "Nova sol·licitud de verificació!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "Sense connexió al servidor", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "No s’ha trobat cap emoticona. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Sembla que no teniu els Serveis de Google al telèfon. Això és una bona decisió respecte a la vostra privadesa! Per a rebre notificacions automàtiques del FluffyChat, us recomanem instaŀlar ntfy. Amb ntfy o qualsevol altre proveïdor de Unified Push, pots rebre notificacions de forma segura i lliure. Pots instaŀlar ntfy des de la PlayStore o des de F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "none": "Cap", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "Encara no heu afegit cap mètode per a poder recuperar la contrasenya.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "Sense permís", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "No s’ha trobat cap sala…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notificacions", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notificacions activades per a aquest compte", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} usuàriïs escrivint…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offline": "Fora de línia", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "D'acord", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "En línia", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "La còpia de seguretat de claus en línia està activada", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Alguna cosa ha anat malament…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Obre l'aplicació per llegir els missatges", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Obre la càmera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "or": "O", + "@or": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "contrasenya o clau de recuperació", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Contrasenya", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Contrasenya oblidada", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "La contrasenya ha canviat", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "passwordRecovery": "Recuperació de contrassenya", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Selecciona una imatge", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Fixa", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Reproduir {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChooseAPasscode": "Tria un codi d'accés", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Fes clic a l'enllaç del correu i, després, segueix.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Introdueix 4 dígits o deixa-ho buit per desactivar el bloqueig.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "Introdueix la teva contrasenya", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Introdueix el teu nom d'usuàriï", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privadesa", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Sales públiques", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Regles push", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "recording": "Enregistrant", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} ha estripat un esdeveniment", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "reject": "Rebutja", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} ha rebutjat la invitació", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Torna-t'hi a unir", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "remove": "Elimina", + "@remove": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Elimina tots els altres dispositius", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Eliminat per {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Elimina dispositiu", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Aixeca el veto", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "reply": "Respon", + "@reply": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Sol·licita permís", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "La sala s'ha actualitzat", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "security": "Seguretat", + "@security": { + "type": "String", + "placeholders": {} + }, + "seenByUser": "Vist per {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Envia", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Envia un missatge", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Envia com a text", + "@sendAsText": { "type": "String" - } - } - }, - "groups": "Grups", - "@groups": { - "type": "String", - "placeholders": {} - }, - "messages": "Missatges", - "@messages": { - "type": "String", - "placeholders": {} - }, - "showPassword": "Mostra la contrasenya", - "@showPassword": { - "type": "String", - "placeholders": {} - }, - "spaceIsPublic": "L’espai és públic", - "@spaceIsPublic": { - "type": "String", - "placeholders": {} - }, - "scanQrCode": "Escaneja un codi QR", - "@scanQrCode": {}, - "obtainingLocation": "S’està obtenint la ubicació…", - "@obtainingLocation": { - "type": "String", - "placeholders": {} - }, - "shareLocation": "Comparteix la ubicació", - "@shareLocation": { - "type": "String", - "placeholders": {} - }, - "synchronizingPleaseWait": "S’està sincronitzant… Espereu.", - "@synchronizingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "reason": "Raó", - "@reason": { - "type": "String", - "placeholders": {} - }, - "changedTheDisplaynameTo": "{username} ha canviat el seu àlies a: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "String", - "placeholders": { - "username": { + }, + "sendAudio": "Envia un àudio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Envia un fitxer", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Envia una imatge", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Envia l’original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Envia adhesiu", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Envia un vídeo", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} ha enviat un fitxer", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} ha enviat un àudio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} ha enviat una imatge", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} ha enviat un adhesiu", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} ha enviat un vídeo", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} ha enviat informació de trucada", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setInvitationLink": "Defineix l’enllaç per a convidar", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Defineix el nivell de permisos", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Defineix l’estat", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Paràmetres", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Comparteix", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} n’ha compartit la ubicació", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "singlesignon": "Autenticació única", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Omet", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Codi font", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} ha iniciat una trucada", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "statusExampleMessage": "Com us sentiu avui?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Envia", + "@submit": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "Sistema", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "No coincideixen", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "Coincideixen", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Marca com a llegit/sense llegir", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Massa sol·licituds. Torna-ho a provar més tard!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Intenta tornar a enviar", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "No disponible", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} ha aixecat el veto a {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Desbloqueja dispositiu", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Dispositiu desconegut", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "L’algorisme de xifratge és desconegut", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Esdeveniment desconegut '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Deixa de silenciar el xat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Deixa de fixar", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 xat no llegit} other{{unreadCount} xats no llegits}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} i {count} més estan escrivint…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} i {username2} estan escrivint…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} està escrivint…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} ha marxat del xat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Nom d’usuàriï", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} ha enviat un esdeveniment {type}", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verify": "Verifica", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Inicia la verificació", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "T'has verificat correctament!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verificant un altre compte", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Videotrucada", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibilitat de l’historial del xat", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible per a tots els participants", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible per a tothom", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Missatge de veu", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "S’està esperant que l’altre accepti l’emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "S’està esperant que l’altre accepti els nombres…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Fons:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Atenció!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "Us hem enviat un missatge de correu electrònic", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Qui pot unir-se a aquest grup", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "Amb aquestes adreces, si ho necessiteu, podeu recuperar la vostra contrasenya.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Escriviu un missatge…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Sí", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "Vós", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "Ja no participeu en aquest xat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "T'han vetat en aquest xat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "La vostra clau pública", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "all": "Tot", + "@all": { + "type": "String", + "placeholders": {} + }, + "addToSpace": "Afegeix a un espai", + "areYouSureYouWantToLogout": "Segur que voleu finalitzar la sessió?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "addEmail": "Afegeix una adreça electrònica", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "commandInvalid": "L’ordre no és vàlida", + "@commandInvalid": { "type": "String" - }, - "displayname": { - "type": "String" - } - } - }, - "howOffensiveIsThisContent": "Com d’ofensiu és aquest contingut?", - "@howOffensiveIsThisContent": { - "type": "String", - "placeholders": {} - }, - "commandHint_clearcache": "Neteja la memòria cau", - "@commandHint_clearcache": { - "type": "String", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_join": "Uneix-te a la sala", - "@commandHint_join": { - "type": "String", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Expulsa uni usuàriï d'aquesta sala", - "@commandHint_kick": { - "type": "String", - "description": "Usage hint for the command /kick" - }, - "commandHint_myroomavatar": "Establiu la imatge per a aquesta sala (per mxc-uri)", - "@commandHint_myroomavatar": { - "type": "String", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_dm": "Inicia un xat directe\nUsa --no-encryption per desactivar l'encriptatge", - "@commandHint_dm": { - "type": "String", - "description": "Usage hint for the command /dm" - }, - "commandHint_invite": "Convida uni usuàriï a aquesta sala", - "@commandHint_invite": { - "type": "String", - "description": "Usage hint for the command /invite" - }, - "commandHint_ban": "Veta uni usuàriï d'aquesta sala", - "@commandHint_ban": { - "type": "String", - "description": "Usage hint for the command /ban" - }, - "commandHint_create": "Crea un xat de grup buit\nUsa --no-encryption per desactivar l'encriptatge", - "@commandHint_create": { - "type": "String", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Descarta la sessió", - "@commandHint_discardsession": { - "type": "String", - "description": "Usage hint for the command /discardsession" - }, - "repeatPassword": "Repetiu la contrasenya", - "@repeatPassword": {}, - "commandHint_myroomnick": "Estableix el teu àlies per a aquesta sala", - "@commandHint_myroomnick": { - "type": "String", - "description": "Usage hint for the command /myroomnick" - }, - "editBlockedServers": "Edita els servidors bloquejats", - "@editBlockedServers": { - "type": "String", - "placeholders": {} - }, - "badServerLoginTypesException": "El servidor admet els inicis de sessió:\n{serverVersions}\nPerò l'aplicació només admet:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "hugContent": "{senderName} t'abraça", - "@hugContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "jumpToLastReadMessage": "Salta a l'últim missatge llegit", - "@jumpToLastReadMessage": {}, - "allRooms": "Tots els xats de grup", - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "commandHint_cuddle": "Envia una carícia", - "@commandHint_cuddle": {}, - "widgetVideo": "Vídeo", - "@widgetVideo": {}, - "dismiss": "Ignora-ho", - "@dismiss": {}, - "reportErrorDescription": "😭 Oh no. Hi ha hagut algun error. Si vols, pots informar d'aquest bug a l'equip de desenvolupament.", - "@reportErrorDescription": {}, - "removeYourAvatar": "Esborra el teu avatar", - "@removeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "unsupportedAndroidVersion": "Aquesta versió d'Android és incompatible", - "@unsupportedAndroidVersion": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "messageType": "Tipus de missatge", - "@messageType": {}, - "indexedDbErrorLong": "L'emmagatzematge de missatges no està disponible per defecte en el mode privat.\nVisita\n - about:config\n - posa a true l'opció dom.indexedDB.privateBrowsing.enabled\nSi no ho fas, no podràs fer servir FluffyChat en mode privat.", - "@indexedDbErrorLong": {}, - "oneClientLoggedOut": "Una de les teves aplicacions ha tancat la sessió", - "@oneClientLoggedOut": {}, - "startFirstChat": "Comença el teu primer xat", - "@startFirstChat": {}, - "callingAccount": "Compte de la trucada", - "@callingAccount": {}, - "setColorTheme": "Tria el color del tema:", - "@setColorTheme": {}, - "nextAccount": "Compte següent", - "@nextAccount": {}, - "allSpaces": "Tots els espais", - "@allSpaces": {}, - "supposedMxid": "Això hauria de ser {mxid}", - "@supposedMxid": { - "type": "String", - "placeholders": { - "mxid": { - "type": "String" - } - } - }, - "user": "Usuàrïi", - "@user": {}, - "youAcceptedTheInvitation": "👍 Has acceptat la invitació", - "@youAcceptedTheInvitation": {}, - "noMatrixServer": "{server1} no és un servidor de matrix, vols fer servir {server2} ?", - "@noMatrixServer": { - "type": "String", - "placeholders": { - "server1": { - "type": "String" - }, - "server2": { - "type": "String" - } - } - }, - "youInvitedBy": "📩 {user} t'ha convidat", - "@youInvitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "banUserDescription": "Es vetarà li usuàriï al xat i no podrà tornar-hi a entrar fins que se li aixequi el veto.", - "@banUserDescription": {}, - "widgetEtherpad": "Nota de text", - "@widgetEtherpad": {}, - "removeDevicesDescription": "Tancaràs la sessió d'aquest dispositiu i no hi podràs rebre més missatges.", - "@removeDevicesDescription": {}, - "separateChatTypes": "Separa xats directes i grups", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "tryAgain": "Torna-ho a provar", - "@tryAgain": {}, - "youKickedAndBanned": "🙅 Has expulsat i vetat a {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "unbanUserDescription": "L'usuàrïi ja pot tornar a entrar al xat.", - "@unbanUserDescription": {}, - "youRejectedTheInvitation": "Has rebutjat la invitació", - "@youRejectedTheInvitation": {}, - "otherCallingPermissions": "Micròfon, càmera i altres permisos del FluffyChat", - "@otherCallingPermissions": {}, - "messagesStyle": "Missatges:", - "@messagesStyle": {}, - "widgetUrlError": "La URL no és vàlida.", - "@widgetUrlError": {}, - "emailOrUsername": "Email o nom d'usuàrïi", - "@emailOrUsername": {}, - "newSpaceDescription": "Els espais et permeten consolidar els teus xats i construir comunitats públiques o privades.", - "@newSpaceDescription": {}, - "chatDescription": "Descripció del xat", - "@chatDescription": {}, - "callingAccountDetails": "Permet al FluffyChat de fer servir l'app de trucades nativa de l'Android.", - "@callingAccountDetails": {}, - "editRoomAliases": "Canvia els àlies de la sala", - "@editRoomAliases": { - "type": "String", - "placeholders": {} - }, - "enterSpace": "Obre l'espai", - "@enterSpace": {}, - "encryptThisChat": "Xifra aquest xat", - "@encryptThisChat": {}, - "previousAccount": "Compte anterior", - "@previousAccount": {}, - "reopenChat": "Reobre el xat", - "@reopenChat": {}, - "pleaseEnterRecoveryKey": "Introdueix la teva clau de recuperació:", - "@pleaseEnterRecoveryKey": {}, - "widgetNameError": "Posa el nom públic.", - "@widgetNameError": {}, - "inoffensive": "Inofensiu", - "@inoffensive": { - "type": "String", - "placeholders": {} - }, - "addToBundle": "Afegeix al pquet", - "@addToBundle": {}, - "addWidget": "Afegeix un giny", - "@addWidget": {}, - "countFiles": "{count} arxius", - "@countFiles": { - "placeholders": { - "count": { - "type": "int" - } - } - }, - "noKeyForThisMessage": "Això pot passar si el missatge es va enviar abans que haguessis iniciat sessió al teu compte des d'aquest dispositiu.\n\nTambé pot ser que l'emissor hagi bloquejat el teu dispositiu o que la connexió a internet anés malament.\n\nQue pots llegir el missatge des d'una altra sessió? Si és així, llavors pots transferir-lo! Ves a Paràmetres → Dispositius i assegura't que els teus dispositius s'ha verificat mútuament. Quan obris la sala la propera vegada i totes dues sessions estiguin executant-se, en primer pla, llavors les claus es trasnsmetran automàticament.\n\nVols evitar perdre les claus en tancar la sessió o en canviar de dispositiu? Llavors assegura't que has activat la còpia de seguretat del xat als paràmetres.", - "@noKeyForThisMessage": {}, - "commandHint_markasgroup": "Marca com un grup", - "@commandHint_markasgroup": {}, - "hydrateTor": "Usuàrïis de Tor: Importa una sessió anterior", - "@hydrateTor": {}, - "pushNotificationsNotAvailable": "Les notificacions push no estan disponibles", - "@pushNotificationsNotAvailable": {}, - "storeInAppleKeyChain": "Desa en la Apple KeyChain", - "@storeInAppleKeyChain": {}, - "replaceRoomWithNewerVersion": "Substitueix la sala amb la versió més recent", - "@replaceRoomWithNewerVersion": { - "type": "String", - "placeholders": {} - }, - "hydrate": "Restaura un arxiu de recuperació", - "@hydrate": {}, - "invalidServerName": "El nom del servidor és invàlid", - "@invalidServerName": {}, - "chatPermissions": "Permisos del xat", - "@chatPermissions": {}, - "sender": "Remitent", - "@sender": {}, - "storeInAndroidKeystore": "Desa en la Android KeyStore", - "@storeInAndroidKeystore": {}, - "signInWithPassword": "Inicia sessió amb contrasenya", - "@signInWithPassword": {}, - "offensive": "Ofensiu", - "@offensive": { - "type": "String", - "placeholders": {} - }, - "makeAdminDescription": "Un cop hagis fet admin aquesta persona ja no podràs desfer-ho, ja que llavors tindrà els mateixos permisos que tu.", - "@makeAdminDescription": {}, - "saveKeyManuallyDescription": "Per desar aquesta clau manualment, pica l'eina de compartir o copia-la al porta-retalls.", - "@saveKeyManuallyDescription": {}, - "editBundlesForAccount": "Edita paquets per aquest compte", - "@editBundlesForAccount": {}, - "whyIsThisMessageEncrypted": "Per què no es pot llegir aquest missatge?", - "@whyIsThisMessageEncrypted": {}, - "setChatDescription": "Posa una descripció de xat", - "@setChatDescription": {}, - "importFromZipFile": "Importa des d'un arxiu zip", - "@importFromZipFile": {}, - "dehydrateWarning": "Aquesta acció és irreversible. Assegura't que deses l'arxiu de recuperació en un lloc segur.", - "@dehydrateWarning": {}, - "noOtherDevicesFound": "No s'han trobat més dispositius", - "@noOtherDevicesFound": {}, - "redactedBy": "Estripat per {username}", - "@redactedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "videoCallsBetaWarning": "Tingues en compte que les trucades de vídeo estan encara en beta. Pot ser que no funcioni bé o que falli en alguna plataforma.", - "@videoCallsBetaWarning": {}, - "participant": "Participant", - "@participant": { - "type": "String", - "placeholders": {} - }, - "signInWith": "Inicia sessió amb {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "fileIsTooBigForServer": "No s'ha pogut enviar! El servidor només accepta adjunts de fins a {max}.", - "@fileIsTooBigForServer": {}, - "homeserver": "Servidor", - "@homeserver": {}, - "callingPermissions": "Permisos de trucada", - "@callingPermissions": {}, - "readUpToHere": "Llegit fins aquí", - "@readUpToHere": {}, - "start": "Comença", - "@start": {}, - "register": "Registra't", - "@register": { - "type": "String", - "placeholders": {} - }, - "unlockOldMessages": "Desbloqueja els missatges antics", - "@unlockOldMessages": {}, - "numChats": "{number} xats", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "optionalRedactReason": "(Opcional) El motiu per estripar el missatge...", - "@optionalRedactReason": {}, - "dehydrate": "Exporta la sessió i neteja el dispositiu", - "@dehydrate": {}, - "archiveRoomDescription": "Aquest xat serà arxivat. Els altres contactes del grup ho veuran com si haguessis abandonat el xat.", - "@archiveRoomDescription": {}, - "exportEmotePack": "Exporta com un pack Emote en .zip", - "@exportEmotePack": {}, - "switchToAccount": "Canvia al compte {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "experimentalVideoCalls": "Trucades de vídeo experimentals", - "@experimentalVideoCalls": {}, - "pleaseEnterRecoveryKeyDescription": "Per desbloquejar els missatges antics, introdueix la clau de recuperació que vas generar en una sessió anterior. La clau de recuperació NO és la teva contrasenya.", - "@pleaseEnterRecoveryKeyDescription": {}, - "openInMaps": "Obre als mapes", - "@openInMaps": { - "type": "String", - "placeholders": {} - }, - "inviteContactToGroupQuestion": "Vols convidar {contact} al xat \"{groupName}\"?", - "@inviteContactToGroupQuestion": {}, - "redactedByBecause": "Estripat per {username} per: \"{reason}\"", - "@redactedByBecause": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "reason": { - "type": "String" - } - } - }, - "youHaveWithdrawnTheInvitationFor": "Has rebutjat la invitació de {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "appearOnTopDetails": "Permet a l'app que aparegui sobre d'altres apps. No cal si ja has afegit FluffyChat com a compte de trucades", - "@appearOnTopDetails": {}, - "enterRoom": "Entra a la sala", - "@enterRoom": {}, - "reportUser": "Denuncia l'usuàrïi", - "@reportUser": {}, - "confirmEventUnpin": "Vols desfixar l'esdeveniment permanentment?", - "@confirmEventUnpin": {}, - "badServerVersionsException": "Aquest servidor suporta aquestes versions de Matrix:\n{serverVersions}\nPerò aquesta aplicación només és compatible amb {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "youInvitedUser": "📩 Has convidat a {user}", - "@youInvitedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "fileHasBeenSavedAt": "S'ha desat l'arxiu a {path}", - "@fileHasBeenSavedAt": { - "type": "String", - "placeholders": { - "path": { - "type": "String" - } - } - }, - "redactMessageDescription": "S'estriparà el missatge per a totser d'aquesta conversa. Aquesta acció és irreversible.", - "@redactMessageDescription": {}, - "recoveryKey": "Clau de recuperació", - "@recoveryKey": {}, - "invalidInput": "L'entrada no és vàlida!", - "@invalidInput": {}, - "dehydrateTorLong": "Per a lis usuàrïis de Tor, es recomana exportar la sessió abans de tancar la finestra.", - "@dehydrateTorLong": {}, - "doNotShowAgain": "No ho tornis a mostrar", - "@doNotShowAgain": {}, - "report": "informa", - "@report": {}, - "serverRequiresEmail": "Aquest servidor necessita validar la teva adreça per registrar-t'hi.", - "@serverRequiresEmail": {}, - "hideUnimportantStateEvents": "Amaga canvis d'estat poc importants", - "@hideUnimportantStateEvents": {}, - "screenSharingTitle": "compartició de pantalla", - "@screenSharingTitle": {}, - "widgetCustom": "Personalització", - "@widgetCustom": {}, - "addToSpaceDescription": "Tria un espai per afegir-hi el xat.", - "@addToSpaceDescription": {}, - "googlyEyesContent": "{senderName} t'ha enviat un parell d'ulls", - "@googlyEyesContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "youBannedUser": "Has vetat a {user}", - "@youBannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "addChatDescription": "Afegeix una descripció al xat...", - "@addChatDescription": {}, - "editRoomAvatar": "Canvia la imatge de la sala", - "@editRoomAvatar": { - "type": "String", - "placeholders": {} - }, - "hasKnocked": "🚪 {user} pica a la porta", - "@hasKnocked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "publish": "Publica", - "@publish": {}, - "openLinkInBrowser": "Obre l'enllaç en un navegador", - "@openLinkInBrowser": {}, - "messageInfo": "Informació del missatge", - "@messageInfo": {}, - "disableEncryptionWarning": "Per motius de seguretat, un cop activat, no es pot desactivar el xifratge.", - "@disableEncryptionWarning": {}, - "directChat": "Xat directe", - "@directChat": {}, - "wrongPinEntered": "Pin incorrecte! Torna-ho a provar en {seconds} segons...", - "@wrongPinEntered": { - "type": "String", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "sendTypingNotifications": "Envia notificacions d'escriptura", - "@sendTypingNotifications": {}, - "inviteGroupChat": "📨 Convida al grup", - "@inviteGroupChat": {}, - "appearOnTop": "Mostra per sobre", - "@appearOnTop": {}, - "invitePrivateChat": "📨 Convida a un xat privat", - "@invitePrivateChat": {}, - "foregroundServiceRunning": "Aquesta notificació apareix quan el servei de primer pla està corrent.", - "@foregroundServiceRunning": {}, - "voiceCall": "Videotrucada", - "@voiceCall": {}, - "commandHint_unban": "Aixeca el veto a aquesti usuàriï per aquesta sala", - "@commandHint_unban": { - "type": "String", - "description": "Usage hint for the command /unban" - }, - "importEmojis": "Importa emojis", - "@importEmojis": {}, - "wasDirectChatDisplayName": "Xat buit ( era {oldDisplayName})", - "@wasDirectChatDisplayName": { - "type": "String", - "placeholders": { - "oldDisplayName": { - "type": "String" - } - } - }, - "noChatDescriptionYet": "No s'ha afegit una descripció de xat.", - "@noChatDescriptionYet": {}, - "removeFromBundle": "Esborra del paquet", - "@removeFromBundle": {}, - "confirmMatrixId": "Confirma la teva ID de Matrix per poder esborrar el compte.", - "@confirmMatrixId": {}, - "learnMore": "Llegeix-ne més", - "@learnMore": {}, - "notAnImage": "No és un arxiu d'image.", - "@notAnImage": {}, - "users": "Usuàrïis", - "@users": {}, - "openGallery": "Obre la galeria", - "@openGallery": {}, - "chatDescriptionHasBeenChanged": "Ha canviat la descripció del xat", - "@chatDescriptionHasBeenChanged": {}, - "newGroup": "Grup nou", - "@newGroup": {}, - "bundleName": "Nom del paquet", - "@bundleName": {}, - "dehydrateTor": "Usuàrïis de Tor: Exporta la sessió", - "@dehydrateTor": {}, - "removeFromSpace": "Esborra de l'espai", - "@removeFromSpace": {}, - "roomUpgradeDescription": "El xat serà recreat amb una versió de sala nova. Totis lis participants seran notificadis que han de canviar al nou xat. Pots llegir més sobre les versions de sala a https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, - "pleaseEnterANumber": "Introdueix un número major que 0", - "@pleaseEnterANumber": {}, - "youKicked": "👞 Has expulsat a {user}", - "@youKicked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "profileNotFound": "No s'ha trobat el compte en aquest servidor. Pot ser un error de connexió, o que realment no existeixi.", - "@profileNotFound": {}, - "jump": "Salta", - "@jump": {}, - "reactedWith": "{sender} ha reaccionat amb {reaction}", - "@reactedWith": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - }, - "reaction": { - "type": "String" - } - } - }, - "sorryThatsNotPossible": "Aquesta acció no és possible", - "@sorryThatsNotPossible": {}, - "videoWithSize": "Vídeo {size}", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "shareInviteLink": "Comparteix un enllaç d'invitació", - "@shareInviteLink": {}, - "commandHint_markasdm": "Marca com a conversa directa la sala amb aquesta ID de Matrix", - "@commandHint_markasdm": {}, - "recoveryKeyLost": "Que has perdut la clau de recuperació?", - "@recoveryKeyLost": {}, - "cuddleContent": "{senderName} et fa una carícia", - "@cuddleContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "deviceKeys": "Claus del dispositiu:", - "@deviceKeys": {}, - "emoteKeyboardNoRecents": "Els últims emotes usats apareixeran aquí...", - "@emoteKeyboardNoRecents": { - "type": "String", - "placeholders": {} - }, - "setTheme": "Tria el tema:", - "@setTheme": {}, - "youJoinedTheChat": "T'has afegit al xat", - "@youJoinedTheChat": {}, - "openVideoCamera": "Obre la càmera per a fer un vídeo", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "markAsRead": "Marca com a llegit", - "@markAsRead": {}, - "widgetName": "Nom", - "@widgetName": {}, - "errorAddingWidget": "S'ha produït un error en afegir el giny.", - "@errorAddingWidget": {}, - "commandHint_hug": "Envia una abraçada", - "@commandHint_hug": {}, - "replace": "Reemplaça", - "@replace": {}, - "oopsPushError": "Ep! Sembla que s'ha produït un error en configurar les notificacions.", - "@oopsPushError": { - "type": "String", - "placeholders": {} - }, - "youUnbannedUser": "Has aixecat el veto a {user}", - "@youUnbannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "newSpace": "Espai nou", - "@newSpace": {}, - "emojis": "Emojis", - "@emojis": {}, - "pleaseEnterYourPin": "Introdueix el teu pin", - "@pleaseEnterYourPin": { - "type": "String", - "placeholders": {} - }, - "pleaseChoose": "Escull", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, - "commandHint_googly": "Envia uns ulls curiosos", - "@commandHint_googly": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Torna-ho a provar més tard o tria un servidor diferent.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "createGroup": "Crea un grup", - "@createGroup": {}, - "hydrateTorLong": "Que vas exportar la teva última sessió a Tor? La pots importar ara i continuar xatejant.", - "@hydrateTorLong": {}, - "time": "Temps", - "@time": {}, - "custom": "Personalitzat", - "@custom": {}, - "noBackupWarning": "Compte! Si no actives la còpia de seguretat dels xats, perdràs accés als teus missatges xifrats. És molt recomanable activar-ho abans de tancar la sessió.", - "@noBackupWarning": {}, - "storeInSecureStorageDescription": "Desa la clau de recuperació en l'emmagatzematge segur d'aquest dispositiu.", - "@storeInSecureStorageDescription": {}, - "openChat": "Obre el xat", - "@openChat": {}, - "kickUserDescription": "Li usuàrïi ha estat expulsadi però no vetadi. Als xats públics, pot tornar-hi a entrar en qualsevol moment.", - "@kickUserDescription": {}, - "importNow": "Importa-ho ara", - "@importNow": {}, - "pinMessage": "Fixa a la sala", - "@pinMessage": {}, - "invite": "Convida", - "@invite": {}, - "enableMultiAccounts": "(Beta) Activa multi-compte en aquest dispositiu", - "@enableMultiAccounts": {}, - "indexedDbErrorTitle": "Problemes amb el mode privat", - "@indexedDbErrorTitle": {}, - "unsupportedAndroidVersionLong": "Aquesta funcionalitat només funciona amb versions d'Android més noves.", - "@unsupportedAndroidVersionLong": {}, - "storeSecurlyOnThisDevice": "Desa de forma segura en aquest dispositiu", - "@storeSecurlyOnThisDevice": {}, - "screenSharingDetail": "Estàs compartint la teva pantalla a FluffyChat", - "@screenSharingDetail": {}, - "placeCall": "Truca", - "@placeCall": {}, - "block": "Bloca", - "@block": {}, - "blockUsername": "Ignora aquesti usuàrïi", - "@blockUsername": {}, - "blockedUsers": "Usuàrïis blocadis", - "@blockedUsers": {}, - "blockListDescription": "Pots bloquejar usuàrïis que et molestin. No rebràs missatges seus ni invitacions de part seva a cap sala.", - "@blockListDescription": {}, - "pleaseChooseAStrongPassword": "Tria una contrasenya forta", - "@pleaseChooseAStrongPassword": {}, - "youInvitedToBy": "📩 T'han enviat un enllaç d'invitació per:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "groupName": "Nom del grup", - "@groupName": {}, - "createGroupAndInviteUsers": "Crea un grup i convida-hi usuàrïis", - "@createGroupAndInviteUsers": {}, - "wrongRecoveryKey": "Malauradament, aquesta clau de recuperació no és la correcta.", - "@wrongRecoveryKey": {}, - "publicLink": "Enllaç públic", - "@publicLink": {}, - "transparent": "Transparent", - "@transparent": {}, - "sendReadReceiptsDescription": "Lis altris participants d'un xat poden veure quan has llegit un missatge.", - "@sendReadReceiptsDescription": {}, - "yourGlobalUserIdIs": "La teva ID global és: ", - "@yourGlobalUserIdIs": {}, - "startConversation": "Comença una conversa", - "@startConversation": {}, - "commandHint_sendraw": "Envia un json pelat", - "@commandHint_sendraw": {}, - "databaseMigrationTitle": "La base de dades ha estat optimitzada", - "@databaseMigrationTitle": {}, - "pleaseEnterYourCurrentPassword": "Fica la teva contrasenya actual", - "@pleaseEnterYourCurrentPassword": {}, - "newPassword": "Contrasenya nova", - "@newPassword": {}, - "restoreSessionBody": "L'aplicació provarà de restaurar la teva sessió des de la còpia de seguretat. Si us plau, comunica aquest error a l'equi pde desenvolupament a {url}. El missatge d'error és {error}", - "@restoreSessionBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "formattedMessages": "Missatges amb format", - "@formattedMessages": {}, - "formattedMessagesDescription": "Mostra contingut amb format enriquit com text en cursiva, fent servir markdown.", - "@formattedMessagesDescription": {}, - "verifyOtherUser": "🔐 Verifica uni altri usuàrïi", - "@verifyOtherUser": {}, - "verifyOtherDevice": "🔐 Verifica un altre dispositiu", - "@verifyOtherDevice": {}, - "databaseBuildErrorBody": "No s'ha pogut construir la base de dades SQLite. L'aplicació provarà de fer servir un format de base de dades antiquat. Si us plau, comunica aquesta situació a la comunitat de desenvolupament a {url}. El missatge d'error és: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "initAppError": "S'ha produït un error mentre s'inicialitzava l'aplicació", - "@initAppError": {}, - "hidePresences": "Amagar la llista de Status?", - "@hidePresences": {}, - "noUsersFoundWithQuery": "No s'ha trobat cap usuàrïi amb \"{query}\". Revisa si ho has escrit malament.", - "@noUsersFoundWithQuery": { - "type": "String", - "placeholders": { - "query": { - "type": "String" - } - } - }, - "leaveEmptyToClearStatus": "Per esborrar el teu estat, deixa-ho en blanc.", - "@leaveEmptyToClearStatus": {}, - "select": "Tria", - "@select": {}, - "searchForUsers": "Cerca @usuariïs...", - "@searchForUsers": {}, - "subspace": "Subespai", - "@subspace": {}, - "addChatOrSubSpace": "Afegeix un xat o un subespai", - "@addChatOrSubSpace": {}, - "decline": "Denega", - "@decline": {}, - "sendReadReceipts": "Envia informes de tecleig", - "@sendReadReceipts": {}, - "sendTypingNotificationsDescription": "Lis altris participants d'un xat poden veure quan estàs teclejant un missatge nou.", - "@sendTypingNotificationsDescription": {}, - "incomingMessages": "Missatge d'entrada", - "@incomingMessages": {}, - "presenceStyle": "Presència:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, - "acceptedKeyVerification": "{sender} ha acceptat la verificació de claus", - "@acceptedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "canceledKeyVerification": "{sender} ha canceŀlat la verificació de claus", - "@canceledKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "completedKeyVerification": "{sender} ha comletat la verificació de claus", - "@completedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "isReadyForKeyVerification": "{sender} està a punt per verificar les claus", - "@isReadyForKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "nothingFound": "No s'ha trobat res...", - "@nothingFound": {}, - "searchChatsRooms": "Cerca #sales, @usuariïs...", - "@searchChatsRooms": {}, - "groupCanBeFoundViaSearch": "El grup es pot trobar per la cerca general", - "@groupCanBeFoundViaSearch": {}, - "databaseMigrationBody": "Espereu un moment, si us plau.", - "@databaseMigrationBody": {}, - "passwordsDoNotMatch": "Les contrasenyes no coincideixen", - "@passwordsDoNotMatch": {}, - "passwordIsWrong": "La contrasenya introduïda és incorrecta", - "@passwordIsWrong": {}, - "joinSpace": "Fica't a l'espai", - "@joinSpace": {}, - "publicSpaces": "Espais públics", - "@publicSpaces": {}, - "thisDevice": "Aquest dispositiu:", - "@thisDevice": {}, - "sessionLostBody": "S'ha perdut la teva sessió. Si us plau, comunica aquest error a l'equip de desenvolupament a {url}. El missatge d'error és: {error}", - "@sessionLostBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "forwardMessageTo": "Vols reenviar el missatge a {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, - "verifyOtherUserDescription": "Si verifiques aquesti usuàrïi, podràs estar seguri de a qui estàs escrivint. . 💪\n\nQuan inicies una verificació, l'altra persona i tu veureu un missatge emergent a l'app. Us sortiran un seguit d'emojis o números a cada pantalla, que haureu de comparar.\n\nLa millor manera de fer-ho és quedar en persona o fer una vídeo-trucada. 👭", - "@verifyOtherUserDescription": {}, - "verifyOtherDeviceDescription": "Quan verifiques un altre dispositiu, aquests poden intercanviar claus, així que es millora la seguretat total. 💪 Quan comences una verificació, apareixerà un missatge emergent a tots dos dispositius. A cadascun hi apareixerà un seguit d'emojis o de números que hauràs de comparar. El millor és tenir tots dos dispositius a mà abans d'iniciar la verificació. 🤳", - "@verifyOtherDeviceDescription": {}, - "requestedKeyVerification": "{sender} ha soŀlicitat verificar claus", - "@requestedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "startedKeyVerification": "{sender} ha iniciat la verificació de claus", - "@startedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "presencesToggle": "Mostra els missatges d'estat d'altres usuàrïis", - "@presencesToggle": { - "type": "String", - "placeholders": {} - }, - "stickers": "Enganxines", - "@stickers": {}, - "discover": "Descobreix", - "@discover": {}, - "commandHint_ignore": "Ignora el compte de matrix especificat", - "@commandHint_ignore": {}, - "commandHint_unignore": "Deixa d'ignorar el compt de matrix especificat", - "@commandHint_unignore": {}, - "sendCanceled": "S'ha canceŀlat l'enviament", - "@sendCanceled": {}, - "noChatsFoundHere": "Encara no hi ha xats. Obre una conversa amb algú picant al botó de sota. ⤵️", - "@noChatsFoundHere": {}, - "hideMemberChangesInPublicChatsBody": "No mostres a l'històric de conversa de les sales públiques quan algú hi entra o surt. Això facilita la lectura.", - "@hideMemberChangesInPublicChatsBody": {}, - "invitedBy": "📩 Convidadi per {user}", - "@invitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "knock": "Pica", - "@knock": {}, - "knocking": "S'està picant", - "@knocking": {}, - "restricted": "Restringit", - "@restricted": {}, - "knockRestricted": "No es pot picar a la porta", - "@knockRestricted": {}, - "goToSpace": "Ves a l'espai {space}", - "@goToSpace": { - "type": "String", - "space": {} - }, - "adminLevel": "{level} - Admin", - "@adminLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "changeGeneralChatSettings": "Canvia les opcions generals de xat", - "@changeGeneralChatSettings": {}, - "sendRoomNotifications": "Envia notificacions @room", - "@sendRoomNotifications": {}, - "changeTheDescriptionOfTheGroup": "Canvia la descripció del xat", - "@changeTheDescriptionOfTheGroup": {}, - "changelog": "Registre de canvis", - "@changelog": {}, - "userLevel": "{level} - Usuàriï", - "@userLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "moderatorLevel": "{level} - Moderadori", - "@moderatorLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "inviteOtherUsers": "Convida més gent a la conversa", - "@inviteOtherUsers": {}, - "changeTheChatPermissions": "Canvia els permisos del xat", - "@changeTheChatPermissions": {}, - "changeTheVisibilityOfChatHistory": "Canvia la visibilitat de l'historial de conversa", - "@changeTheVisibilityOfChatHistory": {}, - "changeTheCanonicalRoomAlias": "Canvia l'adreça principal del xat", - "@changeTheCanonicalRoomAlias": {}, - "accessAndVisibilityDescription": "Qui pot entrar a aquesta conversa i com pot ser descoberta.", - "@accessAndVisibilityDescription": {}, - "customEmojisAndStickers": "Emojis i stickers propis", - "@customEmojisAndStickers": {}, - "accessAndVisibility": "Accés i visibilitat", - "@accessAndVisibility": {}, - "calls": "Trucades", - "@calls": {}, - "hideRedactedMessages": "Amaga els missatges estripats", - "@hideRedactedMessages": {}, - "hideInvalidOrUnknownMessageFormats": "Amaga els missatges que tinguin un format desconegut", - "@hideInvalidOrUnknownMessageFormats": {}, - "hideMemberChangesInPublicChats": "Amaga els canvis d'estat de lis membres a les sales públiques", - "@hideMemberChangesInPublicChats": {}, - "notifyMeFor": "Nofica'm que", - "@notifyMeFor": {}, - "overview": "Resum", - "@overview": {}, - "passwordRecoverySettings": "Recuperació de contrasenya", - "@passwordRecoverySettings": {}, - "userRole": "Rol d'usuàriï", - "@userRole": {}, - "minimumPowerLevel": "El nivell mínim de permisos és {level}.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, - "gallery": "Galeria", - "@gallery": {}, - "noDatabaseEncryption": "No es pot xifrar la base de dades en aquesta plataforma", - "@noDatabaseEncryption": {}, - "usersMustKnock": "Lis membres han de picar a la porta", - "@usersMustKnock": {}, - "noOneCanJoin": "Ningú s'hi pot ficar", - "@noOneCanJoin": {}, - "userWouldLikeToChangeTheChat": "{user} vol entrar al xat.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "customEmojisAndStickersBody": "Afegeix o comparteix emojis o stickers. Els podràs fer servir en qualsevol conversa.", - "@customEmojisAndStickersBody": {}, - "hideRedactedMessagesBody": "Si algú estripa un missatge, ja no apareixerà a l'historial de la conversa.", - "@hideRedactedMessagesBody": {}, - "searchIn": "Cerca al xat \"{chat}\"...", - "@searchIn": { - "type": "String", - "placeholders": { - "chat": { - "type": "String" - } - } - }, - "markAsUnread": "Marca com a no llegit", - "@markAsUnread": {}, - "chatPermissionsDescription": "Defineix quin nivell de permisos cal per cada acció en aquest xat. Els nivells 0, 50 i 100 normalment representen usuàriïs, mods i admins, però es pot canviar.", - "@chatPermissionsDescription": {}, - "updateInstalled": "🎉 S'ha actualitzat a la versió {version}!", - "@updateInstalled": { - "type": "String", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "alwaysUse24HourFormat": "true", - "@alwaysUse24HourFormat": { - "description": "Set to true to always display time of day in 24 hour format." - }, - "appLockDescription": "Bloca l'app amb un pin quan no la facis servir", - "@appLockDescription": {}, - "swipeRightToLeftToReply": "Llisca de dreta esquerra per respondre", - "@swipeRightToLeftToReply": {}, - "globalChatId": "Identificador global de xat", - "@globalChatId": {}, - "createNewAddress": "Crea una adreça nova", - "@createNewAddress": {}, - "searchMore": "Cerca més...", - "@searchMore": {}, - "files": "Arxius", - "@files": {}, - "publicChatAddresses": "Adreces públiques del xat", - "@publicChatAddresses": {}, - "unreadChatsInApp": "{appname}: {unread} converses pendents", - "@unreadChatsInApp": { - "type": "String", - "placeholders": { - "appname": { - "type": "String" - }, - "unread": { - "type": "String" - } - } - }, - "thereAreCountUsersBlocked": "Ara mateix hi ha {count} usuàriïs bloquejadis.", - "@thereAreCountUsersBlocked": { - "type": "String", - "count": {} - }, - "loginWithMatrixId": "Entra amb l'id de Matrix", - "@loginWithMatrixId": {}, - "discoverHomeservers": "Descobreix servidors", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "Què és un servidor de Matrix?", - "@whatIsAHomeserver": {}, - "homeserverDescription": "Totes les teves dades s'emmagatzemen al servidor, com passa amb el e-mail. Pots triar quin servidor vols fer servir sense témer a no poder comunicar gent d'altres servidors. Llegeix-ne més a https://matrix.org.", - "@homeserverDescription": {}, - "doesNotSeemToBeAValidHomeserver": "No sembla un servidor compatible. Pot ser que la URL estigui malament?", - "@doesNotSeemToBeAValidHomeserver": {}, - "countChatsAndCountParticipants": "{chats} xats i {participants} participants", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, - "noMoreChatsFound": "No hi ha més xats...", - "@noMoreChatsFound": {}, - "space": "Espai", - "@space": {}, - "joinedChats": "Xats on has entrat", - "@joinedChats": {}, - "unread": "Sense llegir", - "@unread": {}, - "spaces": "Espais", - "@spaces": {}, - "noPublicLinkHasBeenCreatedYet": "No s'ha creat cap enllaç públic", - "@noPublicLinkHasBeenCreatedYet": {}, - "chatCanBeDiscoveredViaSearchOnServer": "El xat es pot descobrir amb la cerca de {server}", - "@chatCanBeDiscoveredViaSearchOnServer": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "calculatingFileSize": "S'està calculant la mida de l'arxiu...", - "@calculatingFileSize": {}, - "prepareSendingAttachment": "S'està preparant per enviar l'adjunt...", - "@prepareSendingAttachment": {}, - "generatingVideoThumbnail": "S'està generant la miniatura del vídeo...", - "@generatingVideoThumbnail": {}, - "noticeChatBackupDeviceVerification": "Nota: quan connectes tots els dispositius al backup del xat, es verifiquen automàticament.", - "@noticeChatBackupDeviceVerification": {}, - "continueText": "Continua", - "@continueText": {}, - "strikeThrough": "Text ratllat", - "@strikeThrough": {}, - "addLink": "Afegeix un enllaç", - "@addLink": {}, - "noContactInformationProvided": "El servidor no ofereix cap informació de contacte vàlida", - "@noContactInformationProvided": {}, - "setWallpaper": "Tria imatge de fons", - "@setWallpaper": {}, - "sendImages": "Envia {count} imatge", - "@sendImages": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "sendingAttachment": "S'està enviant l'adjunt...", - "@sendingAttachment": {}, - "compressVideo": "S'està comprimint el vídeo...", - "@compressVideo": {}, - "sendingAttachmentCountOfCount": "S'està enviant l'adjunt {index} de {length}...", - "@sendingAttachmentCountOfCount": { - "type": "integer", - "placeholders": { - "index": { - "type": "int" - }, - "length": { - "type": "int" - } - } - }, - "serverLimitReached": "S'ha arribat al límit del servidor! Esperant {seconds} segons...", - "@serverLimitReached": { - "type": "integer", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "oneOfYourDevicesIsNotVerified": "Un dels teus dispositius no està verificat", - "@oneOfYourDevicesIsNotVerified": {}, - "welcomeText": "Hola hola! 👋 Això és FluffyChat. Pots iniciar sessió en qualsevol servidor compatible amb https://matrix.org. I llavors xatejar amb qualsevol. És una xarxa enorme de missatgeria descentralitzada !", - "@welcomeText": {}, - "blur": "Difumina:", - "@blur": {}, - "opacity": "Opacitat:", - "@opacity": {}, - "manageAccount": "Gestiona el compte", - "@manageAccount": {}, - "contactServerAdmin": "Contacta l'admin del servidor", - "@contactServerAdmin": {}, - "contactServerSecurity": "Contacta l'equip de seguretat del servidor", - "@contactServerSecurity": {}, - "version": "Versió", - "@version": {}, - "website": "Lloc web", - "@website": {}, - "compress": "Comprimeix", - "@compress": {}, - "pleaseFillOut": "Emplena", - "@pleaseFillOut": {}, - "invalidUrl": "URL invàlida", - "@invalidUrl": {}, - "unableToJoinChat": "No s'ha pogut entrar al xat. Pot ser que l'altri participant hagi tancat la conversa.", - "@unableToJoinChat": {}, - "aboutHomeserver": "Quant a {homeserver}", - "@aboutHomeserver": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "supportPage": "Pàgina de suport", - "@supportPage": {}, - "serverInformation": "Informació del servidor:", - "@serverInformation": {}, - "name": "Nom", - "@name": {}, - "boldText": "Text en negreta", - "@boldText": {}, - "italicText": "Text en cursiva", - "@italicText": {}, - "contentNotificationSettings": "Opcions de notificació de continguts", - "@contentNotificationSettings": {}, - "roomNotificationSettings": "Opcions de notificacions de sales", - "@roomNotificationSettings": {}, - "notificationRuleContainsUserName": "Conté el nom d'usuàriï", - "@notificationRuleContainsUserName": {}, - "notificationRuleContainsUserNameDescription": "Notifica l'usuàriï quan un missatge contingui el seu nom.", - "@notificationRuleContainsUserNameDescription": {}, - "notificationRuleMaster": "Silencia totes les notificacions", - "@notificationRuleMaster": {}, - "notificationRuleSuppressNotices": "Elimina els missatges automàtics", - "@notificationRuleSuppressNotices": {}, - "notificationRuleInviteForMe": "Invitació per a mi", - "@notificationRuleInviteForMe": {}, - "notificationRuleInviteForMeDescription": "Notifica l'usuàriï quan és convidadi a una sala.", - "@notificationRuleInviteForMeDescription": {}, - "notificationRuleMemberEventDescription": "Ignora les notificacions quan entra o surt algú d'una sala.", - "@notificationRuleMemberEventDescription": {}, - "notificationRuleIsUserMention": "Mencions", - "@notificationRuleIsUserMention": {}, - "notificationRuleContainsDisplayName": "Conté el nom visible", - "@notificationRuleContainsDisplayName": {}, - "notificationRuleIsRoomMention": "Menció de sala", - "@notificationRuleIsRoomMention": {}, - "notificationRuleIsRoomMentionDescription": "Notifica l'usuàriï quan es s'esmenti la sala.", - "@notificationRuleIsRoomMentionDescription": {}, - "notificationRuleRoomnotifDescription": "Notifica l'usuàriï quan un missatge contingui '@room'.", - "@notificationRuleRoomnotifDescription": {}, - "notificationRuleTombstone": "Làpida", - "@notificationRuleTombstone": {}, - "notificationRuleTombstoneDescription": "Notifica l'usuàriï dels missatges de desactivació de sales.", - "@notificationRuleTombstoneDescription": {}, - "notificationRuleReaction": "Reacció", - "@notificationRuleReaction": {}, - "notificationRuleReactionDescription": "Ignora les notificacions sobre reaccions.", - "@notificationRuleReactionDescription": {}, - "notificationRuleRoomServerAcl": "Regles ACL del servidor d'una sala", - "@notificationRuleRoomServerAcl": {}, - "notificationRuleRoomServerAclDescription": "Ignora les notificacions sobre les regles d'accés (ACL) del servidor d'una sala.", - "@notificationRuleRoomServerAclDescription": {}, - "notificationRuleSuppressEdits": "Elimina les edicions", - "@notificationRuleSuppressEdits": {}, - "notificationRuleSuppressEditsDescription": "Ignora les notificacions per missatges editats.", - "@notificationRuleSuppressEditsDescription": {}, - "notificationRuleCall": "Trucada", - "@notificationRuleCall": {}, - "notificationRuleCallDescription": "Notifica l'usuàriï de trucades.", - "@notificationRuleCallDescription": {}, - "notificationRuleEncryptedRoomOneToOneDescription": "Notifica l'usuàriï de missatges en sales xifrades un a un, converses de dues persones.", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, - "notificationRuleEncryptedRoomOneToOne": "Converses xifrades", - "@notificationRuleEncryptedRoomOneToOne": {}, - "notificationRuleRoomOneToOne": "Converses", - "@notificationRuleRoomOneToOne": {}, - "notificationRuleMessageDescription": "Notifica l'usuàriï sobre missatges generals.", - "@notificationRuleMessageDescription": {}, - "notificationRuleEncrypted": "Xifrat", - "@notificationRuleEncrypted": {}, - "notificationRuleEncryptedDescription": "Notifica l'usuàriï de missatges en sales xifrades.", - "@notificationRuleEncryptedDescription": {}, - "notificationRuleJitsi": "Jitsi", - "@notificationRuleJitsi": {}, - "notificationRuleServerAcl": "Ignora canvis en ACL de servidor", - "@notificationRuleServerAcl": {}, - "unknownPushRule": "No es coneix la regla push '{rule}'", - "@unknownPushRule": { - "type": "String", - "placeholders": { - "rule": { - "type": "String" - } - } - }, - "more": "Més", - "@more": {}, - "notificationRuleSuppressNoticesDescription": "No envia notificacions relacionades amb usuàriïs automàtics com els bots.", - "@notificationRuleSuppressNoticesDescription": {}, - "otherNotificationSettings": "Altres opcions de notificacions", - "@otherNotificationSettings": {}, - "notificationRuleIsUserMentionDescription": "Notifica quan mencionin l'usuàriï en un missatge.", - "@notificationRuleIsUserMentionDescription": {}, - "notificationRuleContainsDisplayNameDescription": "Notifica l'usuàriï quan un missatge contingui el seu nom per mostrar.", - "@notificationRuleContainsDisplayNameDescription": {}, - "notificationRuleJitsiDescription": "Notifica l'usuàriï sobre activitat del giny de Jitsi.", - "@notificationRuleJitsiDescription": {}, - "notificationRuleRoomnotif": "Notificació de sala", - "@notificationRuleRoomnotif": {}, - "deletePushRuleCanNotBeUndone": "Si esborres aquesta opció de notificació no ho podràs tornar a canviar.", - "@deletePushRuleCanNotBeUndone": {}, - "notificationRuleRoomOneToOneDescription": "Notifica l'usuàriï de missatges en converses de dues persones, sales un a un.", - "@notificationRuleRoomOneToOneDescription": {}, - "notificationRuleMemberEvent": "Canvis de membres", - "@notificationRuleMemberEvent": {}, - "otherPartyNotLoggedIn": "L'altra persona no està en línia ara mateix i per tant no pot rebre missatges!", - "@otherPartyNotLoggedIn": {}, - "userSpecificNotificationSettings": "Opcions de notificacions d'usuàriï", - "@userSpecificNotificationSettings": {}, - "generalNotificationSettings": "Opcions de notificacions generals", - "@generalNotificationSettings": {}, - "notificationRuleMessage": "Missatge", - "@notificationRuleMessage": {}, - "notificationRuleServerAclDescription": "Ignora les notificacions per canvis en les regles d'accés (ACL) de servidor.", - "@notificationRuleServerAclDescription": {}, - "shareKeysWithDescription": "Quins dispositius vols que puguin llegir els teus missatges xifrats?", - "@shareKeysWithDescription": {}, - "previous": "Anterior", - "@previous": {}, - "notificationRuleMasterDescription": "Ignora totes les altres regles i deshabilita totes les notificacions.", - "@notificationRuleMasterDescription": {}, - "newChatRequest": "📩 Soŀlicitud de missatge", - "@newChatRequest": {}, - "allDevices": "Tots els dispositius", - "@allDevices": {}, - "crossVerifiedDevices": "Els dispositius verificats mútuament", - "@crossVerifiedDevices": {}, - "verifiedDevicesOnly": "Només els dispositius verificats", - "@verifiedDevicesOnly": {}, - "synchronizingPleaseWaitCounter": " S'està sincronitzant... ({percentage}%)", - "@synchronizingPleaseWaitCounter": { - "type": "String", - "placeholders": { - "percentage": { - "type": "String" - } - } - }, - "appWantsToUseForLogin": "Fes servir '{server}' per iniciar sessió", - "@appWantsToUseForLogin": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "appWantsToUseForLoginDescription": "Consenteixes que l'app i la web comparteixen informació sobre tu.", - "@appWantsToUseForLoginDescription": {}, - "open": "Obre", - "@open": {}, - "appIntroduction": "El FluffyChat et permet xatejar amb amiguis entre diverses aplicacions. Llegeix-ne més a https://matrix.org o pica \"Continua\".", - "@appIntroduction": {}, - "waitingForServer": "S'està esperant el servidor...", - "@waitingForServer": {}, - "shareKeysWith": "Comparteix les claus amb...", - "@shareKeysWith": {}, - "crossVerifiedDevicesIfEnabled": "Els dispositius verificats mútuament, si està activat", - "@crossVerifiedDevicesIfEnabled": {}, - "commandHint_roomupgrade": "Actualitza aquesta sala a la versió indicada", - "@commandHint_roomupgrade": {}, - "takeAPhoto": "Fes una foto", - "@takeAPhoto": {}, - "recordAVideo": "Grava un vídeo", - "@recordAVideo": {}, - "optionalMessage": "(Opcional) missatge...", - "@optionalMessage": {}, - "enterNewChat": "Entra al nou xat", - "@enterNewChat": {}, - "notSupportedOnThisDevice": "No suportat en aquest dispositiu", - "@notSupportedOnThisDevice": {} + }, + "fontSize": "Mida de la lletra", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Ves a la sala nova", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "next": "Següent", + "@next": { + "type": "String", + "placeholders": {} + }, + "link": "Enllaç", + "people": "Gent", + "@people": { + "type": "String", + "placeholders": {} + }, + "redactMessage": "Estripa el missatge", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Envia en prémer Retorn", + "clearArchive": "Neteja l’arxiu", + "chatBackupDescription": "Els teus xats estan protegits amb una clau de recuperació. Assegura't de no perdre-la.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "El xat s’ha afegit a aquest espai", + "autoplayImages": "Reprodueix automàticament enganxines i emoticones animades", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "chatBackup": "Còpia de seguretat del xat", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blocat", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "everythingReady": "Tot és a punt!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Nom de l’espai", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "search": "Cerca", + "@search": { + "type": "String", + "placeholders": {} + }, + "verified": "Verificat", + "@verified": { + "type": "String", + "placeholders": {} + }, + "newChat": "Xat nou", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Canvia l’avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "ignore": "Ignora", + "@ignore": { + "type": "String", + "placeholders": {} + }, + "commandHint_react": "Envia una resposta com a reacció", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "defaultPermissionLevel": "Nivell de permisos per defecte per nous membres", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremadament ofensiu", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "S’ha configurat la còpia de seguretat del xat.", + "contentHasBeenReported": "El contingut s’ha denunciat als administradors del servidor", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Activa el xifratge", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "addAccount": "Afegeix un compte", + "noEncryptionForPublicRooms": "Només podreu activar el xifratge quan la sala ja no sigui accessible públicament.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Versió de la sala", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "Envia missatges", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Desa el fitxer", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Seguiu les instruccions al lloc web i toqueu «Següent».", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Denuncia el missatge", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Defineix com a àlies principal", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "status": "Estat", + "@status": { + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Commuta l’estat «preferit»", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Commuta l’estat «silenci»", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transfereix des d’un altre dispositiu", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Defineix emoticones personalitzades", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Qui pot efectuar quina acció", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Per què voleu denunciar això?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Voleu suprimir la còpia de seguretat dels xats per a crear una clau de recuperació nova?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "S’està esperant que l’altre accepti la sol·licitud…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "unverified": "No verificat", + "commandHint_me": "Descriviu-vos", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandMissing": "{command} no és una ordre.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "configureChat": "Configura el xat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copia al porta-retalls", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "Espai nou", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "S’ha produït un error en obtenir la ubicació: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "groups": "Grups", + "@groups": { + "type": "String", + "placeholders": {} + }, + "messages": "Missatges", + "@messages": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Mostra la contrasenya", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "L’espai és públic", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Escaneja un codi QR", + "obtainingLocation": "S’està obtenint la ubicació…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Comparteix la ubicació", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "S’està sincronitzant… Espereu.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "reason": "Raó", + "@reason": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} ha canviat el seu àlies a: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "howOffensiveIsThisContent": "Com d’ofensiu és aquest contingut?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "commandHint_clearcache": "Neteja la memòria cau", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_join": "Uneix-te a la sala", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Expulsa uni usuàriï d'aquesta sala", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_myroomavatar": "Establiu la imatge per a aquesta sala (per mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_dm": "Inicia un xat directe\nUsa --no-encryption per desactivar l'encriptatge", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_invite": "Convida uni usuàriï a aquesta sala", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_ban": "Veta uni usuàriï d'aquesta sala", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_create": "Crea un xat de grup buit\nUsa --no-encryption per desactivar l'encriptatge", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Descarta la sessió", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "repeatPassword": "Repetiu la contrasenya", + "commandHint_myroomnick": "Estableix el teu àlies per a aquesta sala", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "editBlockedServers": "Edita els servidors bloquejats", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "badServerLoginTypesException": "El servidor admet els inicis de sessió:\n{serverVersions}\nPerò l'aplicació només admet:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "hugContent": "{senderName} t'abraça", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Salta a l'últim missatge llegit", + "allRooms": "Tots els xats de grup", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "commandHint_cuddle": "Envia una carícia", + "widgetVideo": "Vídeo", + "dismiss": "Ignora-ho", + "reportErrorDescription": "😭 Oh no. Hi ha hagut algun error. Si vols, pots informar d'aquest bug a l'equip de desenvolupament.", + "removeYourAvatar": "Esborra el teu avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Aquesta versió d'Android és incompatible", + "widgetJitsi": "Jitsi Meet", + "messageType": "Tipus de missatge", + "indexedDbErrorLong": "L'emmagatzematge de missatges no està disponible per defecte en el mode privat.\nVisita\n - about:config\n - posa a true l'opció dom.indexedDB.privateBrowsing.enabled\nSi no ho fas, no podràs fer servir FluffyChat en mode privat.", + "oneClientLoggedOut": "Una de les teves aplicacions ha tancat la sessió", + "startFirstChat": "Comença el teu primer xat", + "callingAccount": "Compte de la trucada", + "setColorTheme": "Tria el color del tema:", + "nextAccount": "Compte següent", + "allSpaces": "Tots els espais", + "supposedMxid": "Això hauria de ser {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "user": "Usuàrïi", + "youAcceptedTheInvitation": "👍 Has acceptat la invitació", + "noMatrixServer": "{server1} no és un servidor de matrix, vols fer servir {server2} ?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 {user} t'ha convidat", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "banUserDescription": "Es vetarà li usuàriï al xat i no podrà tornar-hi a entrar fins que se li aixequi el veto.", + "widgetEtherpad": "Nota de text", + "removeDevicesDescription": "Tancaràs la sessió d'aquest dispositiu i no hi podràs rebre més missatges.", + "separateChatTypes": "Separa xats directes i grups", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "tryAgain": "Torna-ho a provar", + "youKickedAndBanned": "🙅 Has expulsat i vetat a {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "unbanUserDescription": "L'usuàrïi ja pot tornar a entrar al xat.", + "youRejectedTheInvitation": "Has rebutjat la invitació", + "otherCallingPermissions": "Micròfon, càmera i altres permisos del FluffyChat", + "messagesStyle": "Missatges:", + "widgetUrlError": "La URL no és vàlida.", + "emailOrUsername": "Email o nom d'usuàrïi", + "newSpaceDescription": "Els espais et permeten consolidar els teus xats i construir comunitats públiques o privades.", + "chatDescription": "Descripció del xat", + "callingAccountDetails": "Permet al FluffyChat de fer servir l'app de trucades nativa de l'Android.", + "editRoomAliases": "Canvia els àlies de la sala", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "enterSpace": "Obre l'espai", + "encryptThisChat": "Xifra aquest xat", + "previousAccount": "Compte anterior", + "reopenChat": "Reobre el xat", + "pleaseEnterRecoveryKey": "Introdueix la teva clau de recuperació:", + "widgetNameError": "Posa el nom públic.", + "inoffensive": "Inofensiu", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "addToBundle": "Afegeix al pquet", + "addWidget": "Afegeix un giny", + "countFiles": "{count} arxius", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "noKeyForThisMessage": "Això pot passar si el missatge es va enviar abans que haguessis iniciat sessió al teu compte des d'aquest dispositiu.\n\nTambé pot ser que l'emissor hagi bloquejat el teu dispositiu o que la connexió a internet anés malament.\n\nQue pots llegir el missatge des d'una altra sessió? Si és així, llavors pots transferir-lo! Ves a Paràmetres → Dispositius i assegura't que els teus dispositius s'ha verificat mútuament. Quan obris la sala la propera vegada i totes dues sessions estiguin executant-se, en primer pla, llavors les claus es trasnsmetran automàticament.\n\nVols evitar perdre les claus en tancar la sessió o en canviar de dispositiu? Llavors assegura't que has activat la còpia de seguretat del xat als paràmetres.", + "commandHint_markasgroup": "Marca com un grup", + "hydrateTor": "Usuàrïis de Tor: Importa una sessió anterior", + "pushNotificationsNotAvailable": "Les notificacions push no estan disponibles", + "storeInAppleKeyChain": "Desa en la Apple KeyChain", + "replaceRoomWithNewerVersion": "Substitueix la sala amb la versió més recent", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "hydrate": "Restaura un arxiu de recuperació", + "invalidServerName": "El nom del servidor és invàlid", + "chatPermissions": "Permisos del xat", + "sender": "Remitent", + "storeInAndroidKeystore": "Desa en la Android KeyStore", + "signInWithPassword": "Inicia sessió amb contrasenya", + "offensive": "Ofensiu", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "makeAdminDescription": "Un cop hagis fet admin aquesta persona ja no podràs desfer-ho, ja que llavors tindrà els mateixos permisos que tu.", + "saveKeyManuallyDescription": "Per desar aquesta clau manualment, pica l'eina de compartir o copia-la al porta-retalls.", + "editBundlesForAccount": "Edita paquets per aquest compte", + "whyIsThisMessageEncrypted": "Per què no es pot llegir aquest missatge?", + "setChatDescription": "Posa una descripció de xat", + "importFromZipFile": "Importa des d'un arxiu zip", + "dehydrateWarning": "Aquesta acció és irreversible. Assegura't que deses l'arxiu de recuperació en un lloc segur.", + "noOtherDevicesFound": "No s'han trobat més dispositius", + "redactedBy": "Estripat per {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "videoCallsBetaWarning": "Tingues en compte que les trucades de vídeo estan encara en beta. Pot ser que no funcioni bé o que falli en alguna plataforma.", + "participant": "Participant", + "@participant": { + "type": "String", + "placeholders": {} + }, + "signInWith": "Inicia sessió amb {provider}", + "@signInWith": { + "type": "String", + "placeholders": { + "provider": { + "type": "String" + } + } + }, + "fileIsTooBigForServer": "No s'ha pogut enviar! El servidor només accepta adjunts de fins a {max}.", + "homeserver": "Servidor", + "callingPermissions": "Permisos de trucada", + "readUpToHere": "Llegit fins aquí", + "start": "Comença", + "register": "Registra't", + "@register": { + "type": "String", + "placeholders": {} + }, + "unlockOldMessages": "Desbloqueja els missatges antics", + "numChats": "{number} xats", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "optionalRedactReason": "(Opcional) El motiu per estripar el missatge...", + "dehydrate": "Exporta la sessió i neteja el dispositiu", + "archiveRoomDescription": "Aquest xat serà arxivat. Els altres contactes del grup ho veuran com si haguessis abandonat el xat.", + "exportEmotePack": "Exporta com un pack Emote en .zip", + "switchToAccount": "Canvia al compte {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "experimentalVideoCalls": "Trucades de vídeo experimentals", + "pleaseEnterRecoveryKeyDescription": "Per desbloquejar els missatges antics, introdueix la clau de recuperació que vas generar en una sessió anterior. La clau de recuperació NO és la teva contrasenya.", + "openInMaps": "Obre als mapes", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "Vols convidar {contact} al xat \"{groupName}\"?", + "redactedByBecause": "Estripat per {username} per: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Has rebutjat la invitació de {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "appearOnTopDetails": "Permet a l'app que aparegui sobre d'altres apps. No cal si ja has afegit FluffyChat com a compte de trucades", + "enterRoom": "Entra a la sala", + "reportUser": "Denuncia l'usuàrïi", + "confirmEventUnpin": "Vols desfixar l'esdeveniment permanentment?", + "badServerVersionsException": "Aquest servidor suporta aquestes versions de Matrix:\n{serverVersions}\nPerò aquesta aplicación només és compatible amb {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Has convidat a {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "S'ha desat l'arxiu a {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "redactMessageDescription": "S'estriparà el missatge per a totser d'aquesta conversa. Aquesta acció és irreversible.", + "recoveryKey": "Clau de recuperació", + "invalidInput": "L'entrada no és vàlida!", + "dehydrateTorLong": "Per a lis usuàrïis de Tor, es recomana exportar la sessió abans de tancar la finestra.", + "doNotShowAgain": "No ho tornis a mostrar", + "report": "informa", + "serverRequiresEmail": "Aquest servidor necessita validar la teva adreça per registrar-t'hi.", + "hideUnimportantStateEvents": "Amaga canvis d'estat poc importants", + "screenSharingTitle": "compartició de pantalla", + "widgetCustom": "Personalització", + "addToSpaceDescription": "Tria un espai per afegir-hi el xat.", + "googlyEyesContent": "{senderName} t'ha enviat un parell d'ulls", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "youBannedUser": "Has vetat a {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "addChatDescription": "Afegeix una descripció al xat...", + "editRoomAvatar": "Canvia la imatge de la sala", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "hasKnocked": "🚪 {user} pica a la porta", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "publish": "Publica", + "openLinkInBrowser": "Obre l'enllaç en un navegador", + "messageInfo": "Informació del missatge", + "disableEncryptionWarning": "Per motius de seguretat, un cop activat, no es pot desactivar el xifratge.", + "directChat": "Xat directe", + "wrongPinEntered": "Pin incorrecte! Torna-ho a provar en {seconds} segons...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "sendTypingNotifications": "Envia notificacions d'escriptura", + "inviteGroupChat": "📨 Invitació de grup", + "appearOnTop": "Mostra per sobre", + "invitePrivateChat": "📨 Invitació a un xat privat", + "foregroundServiceRunning": "Aquesta notificació apareix quan el servei de primer pla està corrent.", + "voiceCall": "Videotrucada", + "commandHint_unban": "Aixeca el veto a aquesti usuàriï per aquesta sala", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "importEmojis": "Importa emojis", + "wasDirectChatDisplayName": "Xat buit ( era {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "No s'ha afegit una descripció de xat.", + "removeFromBundle": "Esborra del paquet", + "confirmMatrixId": "Confirma la teva ID de Matrix per poder esborrar el compte.", + "learnMore": "Llegeix-ne més", + "notAnImage": "No és un arxiu d'image.", + "users": "Usuàrïis", + "openGallery": "Obre la galeria", + "chatDescriptionHasBeenChanged": "Ha canviat la descripció del xat", + "newGroup": "Grup nou", + "bundleName": "Nom del paquet", + "dehydrateTor": "Usuàrïis de Tor: Exporta la sessió", + "removeFromSpace": "Esborra de l'espai", + "roomUpgradeDescription": "El xat serà recreat amb una versió de sala nova. Totis lis participants seran notificadis que han de canviar al nou xat. Pots llegir més sobre les versions de sala a https://spec.matrix.org/latest/rooms/", + "pleaseEnterANumber": "Introdueix un número major que 0", + "youKicked": "👞 Has expulsat a {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "profileNotFound": "No s'ha trobat el compte en aquest servidor. Pot ser un error de connexió, o que realment no existeixi.", + "jump": "Salta", + "reactedWith": "{sender} ha reaccionat amb {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "sorryThatsNotPossible": "Aquesta acció no és possible", + "videoWithSize": "Vídeo {size}", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "shareInviteLink": "Comparteix un enllaç d'invitació", + "commandHint_markasdm": "Marca com a conversa directa la sala amb aquesta ID de Matrix", + "recoveryKeyLost": "Que has perdut la clau de recuperació?", + "cuddleContent": "{senderName} et fa una carícia", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "deviceKeys": "Claus del dispositiu:", + "emoteKeyboardNoRecents": "Els últims emotes usats apareixeran aquí...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "setTheme": "Tria el tema:", + "youJoinedTheChat": "T'has afegit al xat", + "openVideoCamera": "Obre la càmera per a fer un vídeo", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "markAsRead": "Marca com a llegit", + "widgetName": "Nom", + "errorAddingWidget": "S'ha produït un error en afegir el giny.", + "commandHint_hug": "Envia una abraçada", + "replace": "Reemplaça", + "oopsPushError": "Ep! Sembla que s'ha produït un error en configurar les notificacions.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "youUnbannedUser": "Has aixecat el veto a {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "newSpace": "Espai nou", + "emojis": "Emojis", + "pleaseEnterYourPin": "Introdueix el teu pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseChoose": "Escull", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "commandHint_googly": "Envia uns ulls curiosos", + "pleaseTryAgainLaterOrChooseDifferentServer": "Torna-ho a provar més tard o tria un servidor diferent.", + "createGroup": "Crea un grup", + "hydrateTorLong": "Que vas exportar la teva última sessió a Tor? La pots importar ara i continuar xatejant.", + "time": "Temps", + "custom": "Personalitzat", + "noBackupWarning": "Compte! Si no actives la còpia de seguretat dels xats, perdràs accés als teus missatges xifrats. És molt recomanable activar-ho abans de tancar la sessió.", + "storeInSecureStorageDescription": "Desa la clau de recuperació en l'emmagatzematge segur d'aquest dispositiu.", + "openChat": "Obre el xat", + "kickUserDescription": "Li usuàrïi ha estat expulsadi però no vetadi. Als xats públics, pot tornar-hi a entrar en qualsevol moment.", + "importNow": "Importa-ho ara", + "pinMessage": "Fixa a la sala", + "invite": "Convida", + "enableMultiAccounts": "(Beta) Activa multi-compte en aquest dispositiu", + "indexedDbErrorTitle": "Problemes amb el mode privat", + "unsupportedAndroidVersionLong": "Aquesta funcionalitat només funciona amb versions d'Android més noves.", + "storeSecurlyOnThisDevice": "Desa de forma segura en aquest dispositiu", + "screenSharingDetail": "Estàs compartint la teva pantalla a FluffyChat", + "placeCall": "Truca", + "block": "Bloca", + "blockUsername": "Ignora aquesti usuàrïi", + "blockedUsers": "Usuàrïis blocadis", + "blockListDescription": "Pots bloquejar usuàrïis que et molestin. No rebràs missatges seus ni invitacions de part seva a cap sala.", + "pleaseChooseAStrongPassword": "Tria una contrasenya forta", + "youInvitedToBy": "📩 T'han enviat un enllaç d'invitació per:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "groupName": "Nom del grup", + "createGroupAndInviteUsers": "Crea un grup i convida-hi usuàrïis", + "wrongRecoveryKey": "Malauradament, aquesta clau de recuperació no és la correcta.", + "publicLink": "Enllaç públic", + "transparent": "Transparent", + "sendReadReceiptsDescription": "Lis altris participants d'un xat poden veure quan has llegit un missatge.", + "yourGlobalUserIdIs": "La teva ID global és: ", + "startConversation": "Comença una conversa", + "commandHint_sendraw": "Envia un json pelat", + "databaseMigrationTitle": "La base de dades ha estat optimitzada", + "pleaseEnterYourCurrentPassword": "Fica la teva contrasenya actual", + "newPassword": "Contrasenya nova", + "restoreSessionBody": "L'aplicació provarà de restaurar la teva sessió des de la còpia de seguretat. Si us plau, comunica aquest error a l'equi pde desenvolupament a {url}. El missatge d'error és {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "formattedMessages": "Missatges amb format", + "formattedMessagesDescription": "Mostra contingut amb format enriquit com text en cursiva, fent servir markdown.", + "verifyOtherUser": "🔐 Verifica uni altri usuàrïi", + "verifyOtherDevice": "🔐 Verifica un altre dispositiu", + "databaseBuildErrorBody": "No s'ha pogut construir la base de dades SQLite. L'aplicació provarà de fer servir un format de base de dades antiquat. Si us plau, comunica aquesta situació a la comunitat de desenvolupament a {url}. El missatge d'error és: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "initAppError": "S'ha produït un error mentre s'inicialitzava l'aplicació", + "hidePresences": "Amagar la llista de Status?", + "noUsersFoundWithQuery": "No s'ha trobat cap usuàrïi amb \"{query}\". Revisa si ho has escrit malament.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "leaveEmptyToClearStatus": "Per esborrar el teu estat, deixa-ho en blanc.", + "select": "Tria", + "searchForUsers": "Cerca @usuariïs...", + "subspace": "Subespai", + "addChatOrSubSpace": "Afegeix un xat o un subespai", + "decline": "Denega", + "sendReadReceipts": "Envia informes de tecleig", + "sendTypingNotificationsDescription": "Lis altris participants d'un xat poden veure quan estàs teclejant un missatge nou.", + "incomingMessages": "Missatge d'entrada", + "presenceStyle": "Presència:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "acceptedKeyVerification": "{sender} ha acceptat la verificació de claus", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} ha canceŀlat la verificació de claus", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} ha comletat la verificació de claus", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} està a punt per verificar les claus", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "nothingFound": "No s'ha trobat res...", + "searchChatsRooms": "Cerca #sales, @usuariïs...", + "groupCanBeFoundViaSearch": "El grup es pot trobar per la cerca general", + "databaseMigrationBody": "Espereu un moment, si us plau.", + "passwordsDoNotMatch": "Les contrasenyes no coincideixen", + "passwordIsWrong": "La contrasenya introduïda és incorrecta", + "joinSpace": "Fica't a l'espai", + "publicSpaces": "Espais públics", + "thisDevice": "Aquest dispositiu:", + "sessionLostBody": "S'ha perdut la teva sessió. Si us plau, comunica aquest error a l'equip de desenvolupament a {url}. El missatge d'error és: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "forwardMessageTo": "Vols reenviar el missatge a {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "verifyOtherUserDescription": "Si verifiques aquesti usuàrïi, podràs estar seguri de a qui estàs escrivint. . 💪\n\nQuan inicies una verificació, l'altra persona i tu veureu un missatge emergent a l'app. Us sortiran un seguit d'emojis o números a cada pantalla, que haureu de comparar.\n\nLa millor manera de fer-ho és quedar en persona o fer una vídeo-trucada. 👭", + "verifyOtherDeviceDescription": "Quan verifiques un altre dispositiu, aquests poden intercanviar claus, així que es millora la seguretat total. 💪 Quan comences una verificació, apareixerà un missatge emergent a tots dos dispositius. A cadascun hi apareixerà un seguit d'emojis o de números que hauràs de comparar. El millor és tenir tots dos dispositius a mà abans d'iniciar la verificació. 🤳", + "requestedKeyVerification": "{sender} ha soŀlicitat verificar claus", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} ha iniciat la verificació de claus", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "presencesToggle": "Mostra els missatges d'estat d'altres usuàrïis", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "stickers": "Enganxines", + "discover": "Descobreix", + "commandHint_ignore": "Ignora el compte de matrix especificat", + "commandHint_unignore": "Deixa d'ignorar el compt de matrix especificat", + "sendCanceled": "S'ha canceŀlat l'enviament", + "noChatsFoundHere": "Encara no hi ha xats. Obre una conversa amb algú picant al botó de sota. ⤵️", + "hideMemberChangesInPublicChatsBody": "No mostres a l'històric de conversa de les sales públiques quan algú hi entra o surt. Això facilita la lectura.", + "invitedBy": "📩 Convidadi per {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knock": "Pica", + "knocking": "S'està picant", + "restricted": "Restringit", + "knockRestricted": "No es pot picar a la porta", + "goToSpace": "Ves a l'espai {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Canvia les opcions generals de xat", + "sendRoomNotifications": "Envia notificacions @room", + "changeTheDescriptionOfTheGroup": "Canvia la descripció del xat", + "changelog": "Registre de canvis", + "userLevel": "{level} - Usuàriï", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderadori", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "inviteOtherUsers": "Convida més gent a la conversa", + "changeTheChatPermissions": "Canvia els permisos del xat", + "changeTheVisibilityOfChatHistory": "Canvia la visibilitat de l'historial de conversa", + "changeTheCanonicalRoomAlias": "Canvia l'adreça principal del xat", + "accessAndVisibilityDescription": "Qui pot entrar a aquesta conversa i com pot ser descoberta.", + "customEmojisAndStickers": "Emojis i stickers propis", + "accessAndVisibility": "Accés i visibilitat", + "calls": "Trucades", + "hideRedactedMessages": "Amaga els missatges estripats", + "hideInvalidOrUnknownMessageFormats": "Amaga els missatges que tinguin un format desconegut", + "hideMemberChangesInPublicChats": "Amaga els canvis d'estat de lis membres a les sales públiques", + "notifyMeFor": "Nofica'm que", + "overview": "Resum", + "passwordRecoverySettings": "Recuperació de contrasenya", + "userRole": "Rol d'usuàriï", + "minimumPowerLevel": "El nivell mínim de permisos és {level}.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "gallery": "Galeria", + "noDatabaseEncryption": "No es pot xifrar la base de dades en aquesta plataforma", + "usersMustKnock": "Lis membres han de picar a la porta", + "noOneCanJoin": "Ningú s'hi pot ficar", + "userWouldLikeToChangeTheChat": "{user} vol entrar al xat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "customEmojisAndStickersBody": "Afegeix o comparteix emojis o stickers. Els podràs fer servir en qualsevol conversa.", + "hideRedactedMessagesBody": "Si algú estripa un missatge, ja no apareixerà a l'historial de la conversa.", + "searchIn": "Cerca al xat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "markAsUnread": "Marca com a no llegit", + "chatPermissionsDescription": "Defineix quin nivell de permisos cal per cada acció en aquest xat. Els nivells 0, 50 i 100 normalment representen usuàriïs, mods i admins, però es pot canviar.", + "updateInstalled": "🎉 S'ha actualitzat a la versió {version}!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "alwaysUse24HourFormat": "true", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "appLockDescription": "Bloca l'app amb un pin quan no la facis servir", + "swipeRightToLeftToReply": "Llisca de dreta esquerra per respondre", + "globalChatId": "Identificador global de xat", + "createNewAddress": "Crea una adreça nova", + "searchMore": "Cerca més...", + "files": "Arxius", + "publicChatAddresses": "Adreces públiques del xat", + "unreadChatsInApp": "{appname}: {unread} converses pendents", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "Ara mateix hi ha {count} usuàriïs bloquejadis.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "loginWithMatrixId": "Entra amb l'id de Matrix", + "discoverHomeservers": "Descobreix servidors", + "whatIsAHomeserver": "Què és un servidor de Matrix?", + "homeserverDescription": "Totes les teves dades s'emmagatzemen al servidor, com passa amb el e-mail. Pots triar quin servidor vols fer servir sense témer a no poder comunicar gent d'altres servidors. Llegeix-ne més a https://matrix.org.", + "doesNotSeemToBeAValidHomeserver": "No sembla un servidor compatible. Pot ser que la URL estigui malament?", + "countChatsAndCountParticipants": "{chats} xats i {participants} participants", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "No hi ha més xats...", + "space": "Espai", + "joinedChats": "Xats on has entrat", + "unread": "Sense llegir", + "spaces": "Espais", + "noPublicLinkHasBeenCreatedYet": "No s'ha creat cap enllaç públic", + "chatCanBeDiscoveredViaSearchOnServer": "El xat es pot descobrir amb la cerca de {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "calculatingFileSize": "S'està calculant la mida de l'arxiu...", + "prepareSendingAttachment": "S'està preparant per enviar l'adjunt...", + "generatingVideoThumbnail": "S'està generant la miniatura del vídeo...", + "noticeChatBackupDeviceVerification": "Nota: quan connectes tots els dispositius al backup del xat, es verifiquen automàticament.", + "continueText": "Continua", + "strikeThrough": "Text ratllat", + "addLink": "Afegeix un enllaç", + "noContactInformationProvided": "El servidor no ofereix cap informació de contacte vàlida", + "setWallpaper": "Tria imatge de fons", + "sendImages": "Envia {count} imatge", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendingAttachment": "S'està enviant l'adjunt...", + "compressVideo": "S'està comprimint el vídeo...", + "sendingAttachmentCountOfCount": "S'està enviant l'adjunt {index} de {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "S'ha arribat al límit del servidor! Esperant {seconds} segons...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "Un dels teus dispositius no està verificat", + "welcomeText": "Hola hola! 👋 Això és FluffyChat. Pots iniciar sessió en qualsevol servidor compatible amb https://matrix.org. I llavors xatejar amb qualsevol. És una xarxa enorme de missatgeria descentralitzada !", + "blur": "Difumina:", + "opacity": "Opacitat:", + "manageAccount": "Gestiona el compte", + "contactServerAdmin": "Contacta l'admin del servidor", + "contactServerSecurity": "Contacta l'equip de seguretat del servidor", + "version": "Versió", + "website": "Lloc web", + "compress": "Comprimeix", + "pleaseFillOut": "Emplena", + "invalidUrl": "URL invàlida", + "unableToJoinChat": "No s'ha pogut entrar al xat. Pot ser que l'altri participant hagi tancat la conversa.", + "aboutHomeserver": "Quant a {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "supportPage": "Pàgina de suport", + "serverInformation": "Informació del servidor:", + "name": "Nom", + "boldText": "Text en negreta", + "italicText": "Text en cursiva", + "contentNotificationSettings": "Opcions de notificació de continguts", + "roomNotificationSettings": "Opcions de notificacions de sales", + "notificationRuleContainsUserName": "Conté el nom d'usuàriï", + "notificationRuleContainsUserNameDescription": "Notifica l'usuàriï quan un missatge contingui el seu nom.", + "notificationRuleMaster": "Silencia totes les notificacions", + "notificationRuleSuppressNotices": "Elimina els missatges automàtics", + "notificationRuleInviteForMe": "Invitació per a mi", + "notificationRuleInviteForMeDescription": "Notifica l'usuàriï quan és convidadi a una sala.", + "notificationRuleMemberEventDescription": "Ignora les notificacions quan entra o surt algú d'una sala.", + "notificationRuleIsUserMention": "Mencions", + "notificationRuleContainsDisplayName": "Conté el nom visible", + "notificationRuleIsRoomMention": "Menció de sala", + "notificationRuleIsRoomMentionDescription": "Notifica l'usuàriï quan es s'esmenti la sala.", + "notificationRuleRoomnotifDescription": "Notifica l'usuàriï quan un missatge contingui '@room'.", + "notificationRuleTombstone": "Làpida", + "notificationRuleTombstoneDescription": "Notifica l'usuàriï dels missatges de desactivació de sales.", + "notificationRuleReaction": "Reacció", + "notificationRuleReactionDescription": "Ignora les notificacions sobre reaccions.", + "notificationRuleRoomServerAcl": "Regles ACL del servidor d'una sala", + "notificationRuleRoomServerAclDescription": "Ignora les notificacions sobre les regles d'accés (ACL) del servidor d'una sala.", + "notificationRuleSuppressEdits": "Elimina les edicions", + "notificationRuleSuppressEditsDescription": "Ignora les notificacions per missatges editats.", + "notificationRuleCall": "Trucada", + "notificationRuleCallDescription": "Notifica l'usuàriï de trucades.", + "notificationRuleEncryptedRoomOneToOneDescription": "Notifica l'usuàriï de missatges en sales xifrades un a un, converses de dues persones.", + "notificationRuleEncryptedRoomOneToOne": "Converses xifrades", + "notificationRuleRoomOneToOne": "Converses", + "notificationRuleMessageDescription": "Notifica l'usuàriï sobre missatges generals.", + "notificationRuleEncrypted": "Xifrat", + "notificationRuleEncryptedDescription": "Notifica l'usuàriï de missatges en sales xifrades.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleServerAcl": "Ignora canvis en ACL de servidor", + "unknownPushRule": "No es coneix la regla push '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "more": "Més", + "notificationRuleSuppressNoticesDescription": "No envia notificacions relacionades amb usuàriïs automàtics com els bots.", + "otherNotificationSettings": "Altres opcions de notificacions", + "notificationRuleIsUserMentionDescription": "Notifica quan mencionin l'usuàriï en un missatge.", + "notificationRuleContainsDisplayNameDescription": "Notifica l'usuàriï quan un missatge contingui el seu nom per mostrar.", + "notificationRuleJitsiDescription": "Notifica l'usuàriï sobre activitat del giny de Jitsi.", + "notificationRuleRoomnotif": "Notificació de sala", + "deletePushRuleCanNotBeUndone": "Si esborres aquesta opció de notificació no ho podràs tornar a canviar.", + "notificationRuleRoomOneToOneDescription": "Notifica l'usuàriï de missatges en converses de dues persones, sales un a un.", + "notificationRuleMemberEvent": "Canvis de membres", + "otherPartyNotLoggedIn": "L'altra persona no està en línia ara mateix i per tant no pot rebre missatges!", + "userSpecificNotificationSettings": "Opcions de notificacions d'usuàriï", + "generalNotificationSettings": "Opcions de notificacions generals", + "notificationRuleMessage": "Missatge", + "notificationRuleServerAclDescription": "Ignora les notificacions per canvis en les regles d'accés (ACL) de servidor.", + "shareKeysWithDescription": "Quins dispositius vols que puguin llegir els teus missatges xifrats?", + "previous": "Anterior", + "notificationRuleMasterDescription": "Ignora totes les altres regles i deshabilita totes les notificacions.", + "newChatRequest": "📩 Soŀlicitud de missatge", + "allDevices": "Tots els dispositius", + "crossVerifiedDevices": "Els dispositius verificats mútuament", + "verifiedDevicesOnly": "Només els dispositius verificats", + "synchronizingPleaseWaitCounter": " S'està sincronitzant... ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "appWantsToUseForLogin": "Fes servir '{server}' per iniciar sessió", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "Consenteixes que l'app i la web comparteixen informació sobre tu.", + "open": "Obre", + "appIntroduction": "El FluffyChat et permet xatejar amb amiguis entre diverses aplicacions. Llegeix-ne més a https://matrix.org o pica \"Continua\".", + "waitingForServer": "S'està esperant el servidor...", + "shareKeysWith": "Comparteix les claus amb...", + "crossVerifiedDevicesIfEnabled": "Els dispositius verificats mútuament, si està activat", + "commandHint_roomupgrade": "Actualitza aquesta sala a la versió indicada", + "takeAPhoto": "Fes una foto", + "recordAVideo": "Grava un vídeo", + "optionalMessage": "(Opcional) missatge...", + "enterNewChat": "Entra al nou xat", + "notSupportedOnThisDevice": "No suportat en aquest dispositiu", + "setCustomPermissionLevel": "Afegeix un nivell de permisos personalitzat", + "setPermissionsLevelDescription": "Tria un role predefinit o bé introdueix un nivell de permís personalitzat d'entre 0 i 100.", + "ignoreUser": "Ignora l'usuàriï", + "normalUser": "Usuàriï normal", + "changedTheChatDescription": "{username} ha canviat la descripció del xat", + "changedTheChatName": "{username} ha canviat el nom del xat", + "checkList": "Llista de tasques", + "countInvited": "{count} convidadis", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Missatge de veu de {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "approve": "Aprova", + "youHaveKnocked": "T'han picat a la porta", + "pleaseWaitUntilInvited": "Ara espera fins que algú de la sala t'hi deixi entrar.", + "commandHint_logout": "Tanca la sessió per aquest dispositiu", + "commandHint_logoutall": "Tanca totes les sessions actives", + "displayNavigationRail": "Mostra la barra de navegació al mòbil", + "customReaction": "Reacció personalitzada", + "moreEvents": "Altres esdeveniments", + "declineInvitation": "Rebutja la invitació", + "noMessagesYet": "No hi ha cap missatge", + "longPressToRecordVoiceMessage": "Deixa picat per gravar un missatge de veu.", + "pause": "Pausa", + "resume": "Continua", + "newSubSpace": "Crea un sub-espai", + "moveToDifferentSpace": "Mou-lo a un altre espai", + "moveUp": "Mou-lo amunt", + "moveDown": "Mou-lo avall", + "removeFromSpaceDescription": "S'esborrarà de l'espai el xat, però encara apareixerà a la llista de xats.", + "countChats": "{chats} xats", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Membre dels espais {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Membre dels espais {spaces} poden picar a porta", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "donate": "Dona", + "startedAPoll": "{username} ha creat una enquesta.", + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "poll": "Enquesta", + "startPoll": "Comença una enquesta", + "endPoll": "Acaba l'enquesta", + "answersVisible": "Respostes visibles", + "answersHidden": "Respostes amagades", + "pollQuestion": "Pregunta de l'enquesta", + "answerOption": "Opció de resposta", + "addAnswerOption": "Afegeix una opció", + "allowMultipleAnswers": "Permet múltiples respostes", + "pollHasBeenEnded": "Ha acabat l'enquesta", + "countVotes": "{count, plural, =1{Un vot} other{{count} vots}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Les respostes seran visibles quan s'acabi l'enquesta", + "replyInThread": "Respon en un fil", + "countReplies": "{count, plural, =1{Una resposta} other{{count} respostes}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Fil", + "backToMainChat": "Torna al xat principal", + "saveChanges": "Desa els canvis", + "createSticker": "Crea un sticker o un emoji", + "useAsSticker": "Agafa com a sticker", + "useAsEmoji": "Agafa com a emoji", + "stickerPackNameAlreadyExists": "Ja existeix aquest nom per un pack de stickers", + "newStickerPack": "Nou pack de stickers", + "stickerPackName": "Nom del pack de stickers", + "attribution": "Atribució", + "skipChatBackup": "Omet la còpia de seguretat del xat", + "skipChatBackupWarning": "N'estàs seguri? Si no actives la còpia de seguretat pots perdre accés als teus missatges si canvies de dispositiu.", + "loadingMessages": "S'estan carregant més missatges", + "setupChatBackup": "Activa la còpia de seguretat del xat", + "noMoreResultsFound": "No s'han trobat més resultats", + "chatSearchedUntil": "S'ha cercat fins a {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "URL base de federació", + "clientWellKnownInformation": "Informació de", + "baseUrl": "URL base", + "identityServer": "Servidor d'identitats:", + "versionWithNumber": "Versió: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Registres", + "advancedConfigs": "Avançat", + "advancedConfigurations": "Configuracions avançades", + "signIn": "Obre sessió", + "createNewAccount": "Crea un compte nou", + "signUpGreeting": "El FluffyChat és descentralitzat! Tria un servidor on vulguis crear-t'hi un compte, i som-hi!", + "signInGreeting": "Si ja tens un compte a Matrix, benvingudi! Tria el teu servidor i inicia-hi sessió.", + "appIntro": "Pots xatejar amb lis tevis amiguis amb Fluffychat. És una app de missatgeria [matrix] descentralitzada! Llegeix-ne més a https://matrix.org si vols, o inicia sessió.", + "theProcessWasCanceled": "S'ha canceŀlat el procés." } From bb225689bddad0415ae56ee57017927b9c8f654b Mon Sep 17 00:00:00 2001 From: mikinol Date: Sun, 15 Feb 2026 16:40:54 +0100 Subject: [PATCH 086/333] chore(translations): Translated using Weblate (Russian) Currently translated at 97.2% (817 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/ --- lib/l10n/intl_ru.arb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 31bd9aac..626e6f3d 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -2935,7 +2935,7 @@ "deletePushRuleCanNotBeUndone": "Если вы удалите эту настройку уведомлений, это невозможно отменить.", "shareKeysWith": "Поделиться ключами с...", "shareKeysWithDescription": "Каким устройствам следует доверять, чтобы они могли читать ваши сообщения в зашифрованных чатах?", - "crossVerifiedDevicesIfEnabled": "Если включено, перекрестите проверенные устройства", + "crossVerifiedDevicesIfEnabled": "Кросс-верифицированные устройства, если они включены", "crossVerifiedDevices": "Кросс-верифицированные устройства", "verifiedDevicesOnly": "Только проверенные устройства", "optionalMessage": "(Необязательно) сообщение...", @@ -2952,7 +2952,7 @@ "noMessagesYet": "Пока нет сообщений", "longPressToRecordVoiceMessage": "Нажмите длиннее, чтобы записать голосовое сообщение.", "pause": "Пауза", - "resume": "Резюмировать", + "resume": "Продолжить", "newSubSpace": "Новое подпространство", "moveToDifferentSpace": "Переместить в другое пространство", "moveUp": "Переместить вверх", @@ -3006,8 +3006,8 @@ "allowMultipleAnswers": "Разрешить несколько ответов", "pollHasBeenEnded": "Опрос завершен", "answersWillBeVisibleWhenPollHasEnded": "Ответы будут видны после завершения опроса", - "replyInThread": "Ответить в потоке", - "thread": "Нить", + "replyInThread": "Ответить в ветке", + "thread": "Ветка", "backToMainChat": "Вернуться в основной чат", "saveChanges": "Сохранить изменения", "createSticker": "Создать стикер или эмоджи", @@ -3022,5 +3022,6 @@ "loadingMessages": "Загрузка сообщений", "setupChatBackup": "Настроить резервную копию чата", "createNewAccount": "Создать новый аккаунт", - "theProcessWasCanceled": "Процесс был отменен." + "theProcessWasCanceled": "Процесс был отменен.", + "noMoreResultsFound": "Ничего не найдено" } From 593750ad155b43e6794dff94440af56d8e89046f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Sun, 15 Feb 2026 17:08:57 +0100 Subject: [PATCH 087/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 33.8% (284 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 63 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 408c593f..c6c85e88 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1267,5 +1267,68 @@ "@youHaveBeenBannedFromThisChat": { "type": "String", "placeholders": {} + }, + "yourPublicKey": "Tasarut-ik·im tazayezt", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Talɣut n yizen", + "time": "Akud", + "messageType": "Anaw n yizen", + "sender": "Amazan", + "openGallery": "Ldi timidelt", + "removeFromSpace": "Kkes seg tallunt", + "addToSpaceDescription": "Fren tallunt akken ad ternuḍ adiwenni-a.", + "start": "Senker", + "publish": "Suffeɣ-d", + "videoWithSize": "Avidyu ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "openChat": "Ldi Adiwenni", + "markAsRead": "Creḍ amzun yettwaɣṛa", + "reportUser": "Cetki aseqdac", + "dismiss": "Agi", + "reactedWith": "{sender} err-d s {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Senteḍ ɣer texxamt", + "confirmEventUnpin": "Tebɣiḍ ad tekkseḍ s wudem imezgi asenṭed n tadyant-nni?", + "emojis": "Imujiten", + "placeCall": "Sɛeddi Asiwel", + "voiceCall": "Asiwel n taɣect", + "removeAllOtherDevices": "Kkes akk ibenkan-nniḍen", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Yettwakkes sɣur {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Kkes ibenk", + "@removeDevice": { + "type": "String", + "placeholders": {} } } From 9128b6d283679fa53b838a886cfb55a28f7ca8ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Mon, 16 Feb 2026 17:23:47 +0100 Subject: [PATCH 088/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 38.5% (324 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 179 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 177 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index c6c85e88..81088b30 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -328,7 +328,7 @@ "type": "String", "description": "Usage hint for the command /html" }, - "commandHint_invite": "Snubeg aseqdac i d-ittunefken ɣer texxamt-agi", + "commandHint_invite": "Snubg aseqdac i d-ittunefken ɣer texxamt-agi", "@commandHint_invite": { "type": "String", "description": "Usage hint for the command /invite" @@ -629,7 +629,7 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Snubget-yi-d", + "inviteForMe": "Snubget i nekk", "@inviteForMe": { "type": "String", "placeholders": {} @@ -1330,5 +1330,180 @@ "@removeDevice": { "type": "String", "placeholders": {} + }, + "unbanFromChat": "Kkes agdal seg udiwenni", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Kkes avaṭar-ik·im", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Semselsi taxxamt s lqem amaynut", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Err", + "@reply": { + "type": "String", + "placeholders": {} + }, + "confirm": "Sentem", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Qqen", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Anermis yettwaɛreḍ ɣer ugraw", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Igber askan n yisem", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Igber isem n useqdac", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "Agbur yettwammel i inedbalen n uqeddac", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "Ttekkiɣ ɣef useɣwen", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Tafyirt n uɛeddi neɣ tasarut n tririt d tarameɣtut", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Ur yettḍurru ara", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Snubg anermis", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "Tebɣiḍ ad d-ɛerḍeḍ {contact} ɣer udiwenni \"{groupName}\"?", + "inviteContactToGroup": "Snubg anermis ɣer {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "Ulac aglam n udiwenni i d-yenulfan yakan.", + "inviteText": "{username} yeɛreḍ-ik·m ɣer FluffyChat.\n1. Rzu ɣer fluffychat.im syin sbedd asnas \n2. Jerred neɣ kcem \n3. Ldi aseɣwen n tinubga: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "configureChat": "Swel adiwenni", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "id": "Asulay", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Tamagit", + "@identity": { + "type": "String", + "placeholders": {} + }, + "block": "Iḥder", + "blockedUsers": "Iseqdacen yettusweḥlen", + "blockUsername": "Zgel isem n useqdac", + "loadMore": "Sali-d ugar…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Imeẓla n wadig nsan. Ma ulac aɣilif, rmed-iten akken ad izmiren ad bḍun ideg-ik·im.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Tisirag n wadig tettwagdel. Ttxil-k·m efk-asen amek ara bḍun ideg-ik·im.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "Semḍen tangalt QR", + "offline": "Aruqqin", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "iH", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Deg uẓeṭṭa", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Aḥraz n tsarut deg uẓeṭṭa yermed", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "unread": "Ur yettwaɣri ara", + "sendOnEnter": "Azen ɣef Kcem", + "space": "Tallunt", + "oopsPushError": "Ayhu! nesḥissif, teḍra-d tuccḍa deg usbadu n yilɣa usriden.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Ihuh, yella wayen ur neddi ara…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Ldi asnas akken ad teɣreḍ iznan", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Ldi takamiṛat", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "Ldi takamiṛat i tvidyut", + "@openVideoCamera": { + "type": "String", + "placeholders": {} } } From 3aa102d5c0a28da4f28ab6a51e4a8fa012fb60bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 16 Feb 2026 16:29:49 +0100 Subject: [PATCH 089/333] chore(translations): Translated using Weblate (Estonian) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/ --- lib/l10n/intl_et.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index 17dcf651..5399ecb5 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -1448,7 +1448,7 @@ } } }, - "redactMessage": "Muuda sõnumit", + "redactMessage": "Eemalda sõnum", "@redactMessage": { "type": "String", "placeholders": {} From 154ac0ae0c381bf6957a784769666ef88bc68732 Mon Sep 17 00:00:00 2001 From: NPL Date: Mon, 16 Feb 2026 12:57:33 +0100 Subject: [PATCH 090/333] chore(translations): Translated using Weblate (Japanese) Currently translated at 62.0% (521 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ja/ --- lib/l10n/intl_ja.arb | 70 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_ja.arb b/lib/l10n/intl_ja.arb index a4f96072..a857c4c0 100644 --- a/lib/l10n/intl_ja.arb +++ b/lib/l10n/intl_ja.arb @@ -2409,5 +2409,73 @@ "type": "String" } } - } + }, + "importEmojis": "絵文字をインポート", + "importNow": "今すぐインポート", + "importFromZipFile": ".zipファイルからインポート", + "exportEmotePack": "エモートパックを.zipでエクスポート", + "replace": "置き換え", + "commandHint_roomupgrade": "このルームを特定のルームバージョンにアップグレード", + "commandHint_cuddle": "笑顔を送る", + "googlyEyesContent": "{senderName}がギョロ目を送りました", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName}が笑顔を送りました", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName}がハグしました", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLockDescription": "未使用時にアプリをPINコードでロック", + "sendTypingNotifications": "入力通知を送信", + "swipeRightToLeftToReply": "左にスワイプして返信", + "countChatsAndCountParticipants": "{chats}チャットと{participants}人の参加者", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noChatsFoundHere": "ここにはまだチャットがありません。下のボタンを使ってみんなと新しいチャットを始めましょう。⤵️", + "joinedChats": "チャットに参加しました", + "commandHint_unban": "このルームから禁止されたユーザーを解禁する", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "chatPermissions": "チャット権限", + "checkList": "チェックリスト", + "accessAndVisibility": "アクセスと範囲", + "accessAndVisibilityDescription": "誰がこのチャットに参加できて、どのように発見することができるか。", + "customEmojisAndStickers": "カスタム絵文字とステッカー", + "customEmojisAndStickersBody": "どのチャットでも利用可能なカスタム絵文字やステッカーを追加・共有します。", + "hideRedactedMessages": "削除されたメッセージを隠す", + "hideRedactedMessagesBody": "誰かがメッセージを削除した場合、このメッセージはそれ以降チャット内では見えなくなります。", + "hideInvalidOrUnknownMessageFormats": "無効であるか不明なメッセージ形式を隠す", + "blockListDescription": "迷惑なユーザーをブロックすることができます。あなたの個人的なブロックリストに記載されたユーザーは、あらゆるメッセージやルームへの招待を受け取ることができません。", + "invalidServerName": "無効なサーバー名", + "redactMessageDescription": "メッセージはこの会話のすべての参加者から削除されます。これは取り消すことができません。" } From b8085bdfb1424e332467f528d953e2229bfed9ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Tue, 17 Feb 2026 19:36:10 +0100 Subject: [PATCH 091/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 41.9% (352 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 54 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 81088b30..7795fdc9 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1505,5 +1505,57 @@ "@openVideoCamera": { "type": "String", "placeholders": {} - } + }, + "moreEvents": "Ugar n ineḍruyen", + "declineInvitation": "Agi tinnubga", + "noMessagesYet": "Ulac iznan akka tura", + "longPressToRecordVoiceMessage": "Asiti aɣezzfan i usekles n yizen n taɣect.", + "pause": "Serǧu", + "resume": "Kemmel", + "newSubSpace": "Tallunt tanaddawt tamaynut", + "moveToDifferentSpace": "Smutti ɣer tallunt yemgaraden", + "moveUp": "Ddu d asawen", + "moveDown": "Ddu d akessar", + "removeFromSpaceDescription": "Adiwenni ad yettwakkes seg tallunt maca mazal ad yettban deg tebdart-ik·im n udiwenni.", + "countChats": "{chats} idiwenniyen", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Aɛeggal n tallunt n {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "donate": "Mudd tawsa", + "startedAPoll": "{username}yessenker tafrent.", + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "poll": "Tafrent", + "startPoll": "Senker tafrent", + "endPoll": "Eg taggara n tafrent", + "answersVisible": "Tiririyin yettbanen", + "answersHidden": "Tiririyin yeffren", + "pollQuestion": "Isteqsiyen n tefrent", + "answerOption": "tanefrunt n tririt", + "addAnswerOption": "Rnu tanefrunt n tririt", + "allowMultipleAnswers": "Sireg aget n tiririyin", + "pollHasBeenEnded": "Tafrent tfukk", + "answersWillBeVisibleWhenPollHasEnded": "Tiririyin ad banent ticki tafrent tfukk", + "replyInThread": "Err deg udras udiwenni", + "thread": "Adras udiwenni" } From a184327d1076c341a46daeacd211693a74d3122f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Thu, 19 Feb 2026 15:19:17 +0100 Subject: [PATCH 092/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 47.8% (402 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 68 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 7795fdc9..eebe6ba4 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1557,5 +1557,71 @@ "pollHasBeenEnded": "Tafrent tfukk", "answersWillBeVisibleWhenPollHasEnded": "Tiririyin ad banent ticki tafrent tfukk", "replyInThread": "Err deg udras udiwenni", - "thread": "Adras udiwenni" + "thread": "Adras udiwenni", + "oneOfYourDevicesIsNotVerified": "iwen seg ibenkan-ik·im ur yettusenqed ara", + "noticeChatBackupDeviceVerification": "Tamawt: Mi ara teqqneḍ akk ibenkan-ik·im ɣer weḥraz udiwenni, ttusneqden s wudem awurman.", + "continueText": "Ddu", + "blur": "Asluɣu:", + "opacity": "Tiḍullest:", + "setWallpaper": "Sbadu tugna ugilal", + "manageAccount": "Sefrek amiḍan", + "noContactInformationProvided": "Aqeddac ur yezmir ara ad d-yefk talɣut n unermis tameɣtut", + "contactServerAdmin": "Nermes anedbal n uqeddac", + "contactServerSecurity": "Taɣellist uqeddac n unermis", + "supportPage": "Asebter n tallalt", + "serverInformation": "Talɣut n uqeddac:", + "name": "Isem", + "version": "Lqem", + "website": "Asmel Web", + "compress": "Sekussem", + "boldText": "Aḍris azuran", + "italicText": "Aḍris uknan", + "strikeThrough": "Yettwajeṛṛeḍ", + "pleaseFillOut": "Ttxil-k·m, ččar", + "invalidUrl": "url armeɣtu", + "addLink": "Rnu aseɣwen", + "serverLimitReached": "Talast n uqeddac tewweḍ! Araǧu n {seconds} n tasinin…", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "unableToJoinChat": "Ur yezmir ara ad yernu ɣer udiwenni. Ahat aseqdac n udiwenni-agi imdel-it yakan.", + "previous": "Uzwir", + "otherPartyNotLoggedIn": "Aḥric nniḍen ur yeqqin ara akka tura, ihi ur yezmir ara ad d-yeṭṭef iznan!", + "appWantsToUseForLogin": "Seqdec '{server]' akken ad teqqneḍ", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "Ldi", + "waitingForServer": "Araǧu n uqeddac...", + "newChatRequest": "📩 Asuter n udiwenni amaynut", + "contentNotificationSettings": "Iɣewwaṛen n telɣut n ugbur", + "generalNotificationSettings": "Iɣewwaren imuta n ilɣa", + "roomNotificationSettings": "Iɣewwaṛen n telɣut n texxamt", + "userSpecificNotificationSettings": "Iɣewwaṛen n telɣut n useqdac", + "otherNotificationSettings": "Iɣewwaṛen-nniḍen n telɣut", + "notificationRuleContainsUserName": "Yegber isem n useqdac", + "notificationRuleContainsUserNameDescription": "Azen tilɣa i useqdac ma yella yizen yegber isem-is useqdac.", + "notificationRuleMaster": "Sgugem akk tilɣa", + "notificationRuleMasterDescription": "Ad isemselsi akk ilugan-nniḍen sakin ad sexsi akk tilɣa.", + "notificationRuleSuppressNotices": "Kkes iznan s wudem awurman", + "notificationRuleSuppressNoticesDescription": "Kkes ilɣa seg imsaɣen iwurmanen am yiṛubuten.", + "notificationRuleInviteForMe": "Asnubget i nekk", + "notificationRuleInviteForMeDescription": "Azen ilɣa i useqdac ticki yettwaɛreḍ ɣer texxamt.", + "notificationRuleMemberEvent": "Tadyant i yiɛeggalen", + "notificationRuleIsUserMention": "Abdar n useqdac", + "notificationRuleIsUserMentionDescription": "Azen ilɣa i useqdac ma yella yettwabder s srid deg yizen.", + "notificationRuleContainsDisplayName": "Yegber Isem n ubeqqeḍ", + "notificationRuleContainsDisplayNameDescription": "Azen ilɣa i useqdac ma yella yizen yegber Isem-is n ubeqqeḍ.", + "notificationRuleIsRoomMention": "Abdar n Texxamt", + "notificationRuleIsRoomMentionDescription": "Azen ilɣa i useqdac ticki yella ubdar n texxamt." } From 68d673005424a84dbc12262637ca445b6351255f Mon Sep 17 00:00:00 2001 From: Jelv Date: Wed, 18 Feb 2026 22:08:53 +0100 Subject: [PATCH 093/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index 3f081131..f3e35b0d 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -2406,10 +2406,10 @@ "sendTypingNotifications": "Typemeldingen verzenden", "pleaseTryAgainLaterOrChooseDifferentServer": "Probeer het later nog eens of kies een andere server.", "signInWithPassword": "Aanmelden met wachtwoord", - "chatPermissions": "Chat rechten", - "chatDescription": "Chatomschrijving", - "chatDescriptionHasBeenChanged": "Chatomschrijving gewijzigd", - "noChatDescriptionYet": "Nog geen chatomschrijving gemaakt.", + "chatPermissions": "Chatrechten", + "chatDescription": "Onderwerp", + "chatDescriptionHasBeenChanged": "Onderwerp gewijzigd", + "noChatDescriptionYet": "Nog geen onderwerp gemaakt.", "tryAgain": "Opnieuw proberen", "redactMessageDescription": "Het bericht zal worden aangepast voor alle deelnemers in dit gesprek. Dit kan niet ongedaan gemaakt worden.", "redactedByBecause": "Aangepast door {username}, reden: \"{reason}\"", @@ -2428,7 +2428,7 @@ "createGroup": "Groep aanmaken", "inviteContactToGroupQuestion": "Wil je {contact} uitnodigingen voor de chat \"{groupName}\"?", "optionalRedactReason": "(Optioneel) Reden voor aanpassing van dit bericht...", - "addChatDescription": "Voeg een chatomschrijving toe...", + "addChatDescription": "Voeg een onderwerp toe...", "invalidServerName": "Foute servernaam", "messagesStyle": "Berichten:", "shareInviteLink": "Uitnodigingslink delen", @@ -2442,7 +2442,7 @@ } }, "directChat": "Directe chat", - "setChatDescription": "Chatomschrijving instellen", + "setChatDescription": "Onderwerp instellen", "setTheme": "Thema instellen:", "setColorTheme": "Kleurthema instellen:", "invite": "Uitnodigen", @@ -2777,7 +2777,7 @@ "notificationRuleSuppressNoticesDescription": "Meldingen van automatische accounts zoals bots uitschakelen.", "notificationRuleInviteForMe": "Persoonlijke uitnodiging", "inviteOtherUsers": "Personen voor deze chat uitnodigen", - "changeTheChatPermissions": "Chat-rechten wijzigen", + "changeTheChatPermissions": "Chatrechten wijzigen", "changeTheCanonicalRoomAlias": "Standaard openbaar chat-adres wijzigen", "blur": "Vervaag:", "isReadyForKeyVerification": "{sender} is klaar voor de sleutelverificatie", @@ -2880,7 +2880,7 @@ "sendReadReceipts": "Leesbevestigingen versturen", "formattedMessages": "Opgemaakte berichten", "chatPermissionsDescription": "Stel het gewenste rechten-niveau in voor bepaalde acties in deze chat. Het rechten-niveau 0, 50 en 100 zijn gebruikelijk voor deelnemer, moderator en beheerder, maar elke verdeling is mogelijk.", - "changeTheDescriptionOfTheGroup": "Chatomschrijving wijzigen", + "changeTheDescriptionOfTheGroup": "Onderwerp wijzigen", "userRole": "Rol", "minimumPowerLevel": "{level} is het minimale rechten-niveau.", "@minimumPowerLevel": { @@ -3085,7 +3085,7 @@ } }, "answersWillBeVisibleWhenPollHasEnded": "Antwoorden zullen zichtbaar zijn wanneer de peiling is geëindigd", - "replyInThread": "Antwoord in draad", + "replyInThread": "Antwoord in gesprek", "countReplies": "{count, plural, =1{Één antwoord} other{{count} antwoorden}}", "@countReplies": { "type": "int", @@ -3095,7 +3095,7 @@ } } }, - "thread": "Draad", + "thread": "Gesprek", "backToMainChat": "Terug naar hoofdchat", "saveChanges": "Wijzigingen opslaan", "createSticker": "Sticker of emoji maken", @@ -3109,7 +3109,7 @@ "skipChatBackupWarning": "Weet je het zeker? Zonder chat back-up verlies je toegang tot je berichten als je van apparaat wisselt.", "loadingMessages": "Berichten laden", "setupChatBackup": "Chatback-up instellen", - "changedTheChatDescription": "{username} heeft de chatomschrijving gewijzigd", + "changedTheChatDescription": "{username} heeft het onderwerp gewijzigd", "changedTheChatName": "{username} heeft de chatnaam gewijzigd", "noMoreResultsFound": "Geen resultaten meer gevonden", "chatSearchedUntil": "Chat doorzocht tot {time}", From 475bb15875527501db7166e8f15750621c74767b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Thu, 19 Feb 2026 11:42:25 +0100 Subject: [PATCH 094/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (840 of 840 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index f1368c70..342b46d7 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -1855,7 +1855,7 @@ "type": "String", "placeholders": {} }, - "pleaseEnterYourPin": "Cuir isteach d'uimhir PIN le do thoil", + "pleaseEnterYourPin": "Cuir isteach do uap le do thoil", "@pleaseEnterYourPin": { "type": "String", "placeholders": {} @@ -2585,7 +2585,7 @@ "invite": "Tabhair cuireadh", "publicSpaces": "Spásanna poiblí", "whyIsThisMessageEncrypted": "Cén fáth nach féidir an teachtaireacht seo a léamh?", - "pinMessage": "PIN go seomra", + "pinMessage": "Bioráin chuig an seomra", "dehydrate": "Easpórtáil seisiún agus gléas wipe", "dehydrateTor": "Úsáideoirí TOR: Seisiún easpórtála", "commandHint_markasdm": "Marcáil mar sheomra teachtaireachta dírí don ID Maitrís tugtha", From 42cf87fde593019ee73546a6d69c4bd765dd6eda Mon Sep 17 00:00:00 2001 From: Logaritmica Date: Thu, 19 Feb 2026 22:55:36 +0100 Subject: [PATCH 095/333] chore(translations): Translated using Weblate (Portuguese (Brazil)) Currently translated at 98.0% (825 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/pt_BR/ --- lib/l10n/intl_pt_BR.arb | 415 ++-------------------------------------- 1 file changed, 11 insertions(+), 404 deletions(-) diff --git a/lib/l10n/intl_pt_BR.arb b/lib/l10n/intl_pt_BR.arb index 65233922..ab690300 100644 --- a/lib/l10n/intl_pt_BR.arb +++ b/lib/l10n/intl_pt_BR.arb @@ -401,7 +401,6 @@ "placeholders": {} }, "clearArchive": "Limpar arquivo", - "@clearArchive": {}, "close": "Fechar", "@close": { "type": "String", @@ -2082,39 +2081,22 @@ "placeholders": {} }, "oneClientLoggedOut": "Um dos seus clientes foi desconectado", - "@oneClientLoggedOut": {}, "addAccount": "Adicionar conta", - "@addAccount": {}, "unverified": "Não verificado", - "@unverified": {}, "yourChatBackupHasBeenSetUp": "Seu backup de conversas foi configurado.", - "@yourChatBackupHasBeenSetUp": {}, "editBundlesForAccount": "Editar coleções para esta conta", - "@editBundlesForAccount": {}, "serverRequiresEmail": "Este servidor precisa validar seu e-mail para efetuar o cadastro.", - "@serverRequiresEmail": {}, "messageInfo": "Informações da mensagem", - "@messageInfo": {}, "sender": "Remetente", - "@sender": {}, "publish": "Publicar", - "@publish": {}, "removeFromSpace": "Remover do espaço", - "@removeFromSpace": {}, "link": "Link", - "@link": {}, "start": "Iniciar", - "@start": {}, "repeatPassword": "Repita a senha", - "@repeatPassword": {}, "addToSpace": "Adicionar ao espaço", - "@addToSpace": {}, "sendOnEnter": "Enviar ao pressionar enter", - "@sendOnEnter": {}, "homeserver": "Servidor", - "@homeserver": {}, "chatHasBeenAddedToThisSpace": "A conversa foi adicionada a este espaço", - "@chatHasBeenAddedToThisSpace": {}, "commandHint_clearcache": "Limpar dados temporários", "@commandHint_clearcache": { "type": "String", @@ -2136,28 +2118,19 @@ "description": "Usage hint for the command /dm" }, "scanQrCode": "Ler código QR", - "@scanQrCode": {}, "openVideoCamera": "Abrir a câmera para um vídeo", "@openVideoCamera": { "type": "String", "placeholders": {} }, "addToBundle": "Adicionar à coleção", - "@addToBundle": {}, "removeFromBundle": "Remover desta coleção", - "@removeFromBundle": {}, "bundleName": "Nome da coleção", - "@bundleName": {}, "enableMultiAccounts": "(BETA) Ativar múltiplas contas neste dispositivo", - "@enableMultiAccounts": {}, "time": "Horário", - "@time": {}, "messageType": "Tipo da mensagem", - "@messageType": {}, "openGallery": "Abrir galeria", - "@openGallery": {}, "addToSpaceDescription": "Selecione um espaço para adicionar esta conversa.", - "@addToSpaceDescription": {}, "videoWithSize": "Vídeo ({size})", "@videoWithSize": { "type": "String", @@ -2168,22 +2141,16 @@ } }, "markAsRead": "Marcar como lido", - "@markAsRead": {}, "dismiss": "Descartar", - "@dismiss": {}, "separateChatTypes": "Separar conversas diretas e grupos", "@separateChatTypes": { "type": "String", "placeholders": {} }, "openChat": "Abrir conversa", - "@openChat": {}, "reportUser": "Denunciar usuário", - "@reportUser": {}, "emojis": "Emojis", - "@emojis": {}, "placeCall": "Chamar", - "@placeCall": {}, "reactedWith": "{sender} reagiu com {reaction}", "@reactedWith": { "type": "String", @@ -2197,39 +2164,22 @@ } }, "confirmEventUnpin": "Tem certeza que quer desafixar o evento permanentemente?", - "@confirmEventUnpin": {}, "pinMessage": "Fixar na sala", - "@pinMessage": {}, "voiceCall": "Chamada de voz", - "@voiceCall": {}, "unsupportedAndroidVersion": "Versão Android sem suporte", - "@unsupportedAndroidVersion": {}, "widgetNameError": "Forneça um nome de exibição.", - "@widgetNameError": {}, "unsupportedAndroidVersionLong": "Esta funcionalidade requer uma versão mais nova do Android. Verifique se há atualizações ou suporte ao LineageOS.", - "@unsupportedAndroidVersionLong": {}, "emailOrUsername": "E-mail ou nome de usuário", - "@emailOrUsername": {}, "videoCallsBetaWarning": "Observe que chamadas de vídeo estão atualmente em teste. Podem não funcionar como esperado ou sequer funcionar em algumas plataformas.", - "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Vídeo chamadas experimentais", - "@experimentalVideoCalls": {}, "widgetVideo": "Vídeo", - "@widgetVideo": {}, "errorAddingWidget": "Erro ao adicionar o widget.", - "@errorAddingWidget": {}, "addWidget": "Adicionar widget", - "@addWidget": {}, "widgetEtherpad": "Anotação de texto", - "@widgetEtherpad": {}, "widgetUrlError": "Isto não é uma URL válida.", - "@widgetUrlError": {}, "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "widgetCustom": "Personalizado", - "@widgetCustom": {}, "widgetName": "Nome", - "@widgetName": {}, "switchToAccount": "Alternar para a conta {number}", "@switchToAccount": { "type": "number", @@ -2240,11 +2190,8 @@ } }, "nextAccount": "Próxima conta", - "@nextAccount": {}, "previousAccount": "Conta anterior", - "@previousAccount": {}, "youRejectedTheInvitation": "Você rejeitou o convite", - "@youRejectedTheInvitation": {}, "youBannedUser": "Você baniu {user}", "@youBannedUser": { "placeholders": { @@ -2278,9 +2225,7 @@ } }, "youAcceptedTheInvitation": "👍 Você aceitou o convite", - "@youAcceptedTheInvitation": {}, "youJoinedTheChat": "Você entrou na conversa", - "@youJoinedTheChat": {}, "youKicked": "👞 Você expulsou {user}", "@youKicked": { "placeholders": { @@ -2315,13 +2260,9 @@ } }, "pleaseEnterRecoveryKeyDescription": "Para desbloquear as suas mensagens antigas, digite a sua chave de recuperação gerada numa sessão prévia. Sua chave de recuperação NÃO é sua senha.", - "@pleaseEnterRecoveryKeyDescription": {}, "indexedDbErrorLong": "Infelizmente, o armazenamento de mensagens não é ativado por padrão no modo privado.\nVisite\n- about:config\n- atribua \"true\" a \"dom.indexedDB.privateBrowsing.enabled\"\nSe não fizer isto, não será possível executar o FluffyChat.", - "@indexedDbErrorLong": {}, "users": "Usuários", - "@users": {}, "confirmMatrixId": "Confirme seu ID Matrix para apagar sua conta.", - "@confirmMatrixId": {}, "supposedMxid": "Isto deveria ser {mxid}", "@supposedMxid": { "type": "String", @@ -2332,17 +2273,11 @@ } }, "dehydrateTor": "Usuários TOR: Exportar sessão", - "@dehydrateTor": {}, "recoveryKey": "Chave de recuperação", - "@recoveryKey": {}, "recoveryKeyLost": "Perdeu a chave de recuperação?", - "@recoveryKeyLost": {}, "commandHint_cuddle": "Enviar um afago", - "@commandHint_cuddle": {}, "commandHint_hug": "Enviar um abraço", - "@commandHint_hug": {}, "commandHint_googly": "Enviar olhos arregalados", - "@commandHint_googly": {}, "googlyEyesContent": "{senderName} enviou olhos arregalados", "@googlyEyesContent": { "type": "String", @@ -2362,59 +2297,32 @@ } }, "commandHint_markasdm": "Marcar como sala de mensagens diretas para o ID Matrix fornecido", - "@commandHint_markasdm": {}, "commandHint_markasgroup": "Marcar como grupo", - "@commandHint_markasgroup": {}, "hydrateTor": "Usuários TOR: Importar sessão", - "@hydrateTor": {}, "hydrateTorLong": "Você exportou sua última sessão no TOR? Importe ela rapidamente e continue conversando.", - "@hydrateTorLong": {}, "hydrate": "Restaurar a partir de um arquivo de backup", - "@hydrate": {}, "pleaseEnterRecoveryKey": "Digite sua chave de recuperação:", - "@pleaseEnterRecoveryKey": {}, "indexedDbErrorTitle": "Problemas no modo privado", - "@indexedDbErrorTitle": {}, "storeInSecureStorageDescription": "Guardar a chave de recuperação no armazenamento seguro deste dispositivo.", - "@storeInSecureStorageDescription": {}, "saveKeyManuallyDescription": "Salvar esta chave manualmente via compartilhamento do sistema ou área de transferência.", - "@saveKeyManuallyDescription": {}, "storeInAndroidKeystore": "Guardar no cofre do Android (KeyStore)", - "@storeInAndroidKeystore": {}, "storeInAppleKeyChain": "Guardar no chaveiro da Apple", - "@storeInAppleKeyChain": {}, "storeSecurlyOnThisDevice": "Guardar de modo seguro neste dispositivo", - "@storeSecurlyOnThisDevice": {}, "user": "Usuário", - "@user": {}, "custom": "Personalizado", - "@custom": {}, "foregroundServiceRunning": "Esta notificação aparece quando o serviço de primeiro plano está sendo executado.", - "@foregroundServiceRunning": {}, "callingPermissions": "Permissões de chamada", - "@callingPermissions": {}, "callingAccount": "Conta para chamadas", - "@callingAccount": {}, "callingAccountDetails": "Permitir que o FluffyChat use o app de chamadas nativo do Android.", - "@callingAccountDetails": {}, "appearOnTop": "Aparecer no topo", - "@appearOnTop": {}, "appearOnTopDetails": "Permite que o app apareça no topo (desnecessário caso o FluffyChat já esteja configurado como conta para chamadas)", - "@appearOnTopDetails": {}, "otherCallingPermissions": "Microfone, câmera e outras permissões do FluffyChat", - "@otherCallingPermissions": {}, "newGroup": "Novo grupo", - "@newGroup": {}, "newSpace": "Novo espaço", - "@newSpace": {}, "enterSpace": "Abrir espaço", - "@enterSpace": {}, "enterRoom": "Abrir sala", - "@enterRoom": {}, "allSpaces": "Todos os espaços", - "@allSpaces": {}, "hideUnimportantStateEvents": "Ocultar eventos de estado desimportantes", - "@hideUnimportantStateEvents": {}, "countFiles": "{count} arquivos", "@countFiles": { "placeholders": { @@ -2424,21 +2332,13 @@ } }, "doNotShowAgain": "Não mostrar novamente", - "@doNotShowAgain": {}, "unlockOldMessages": "Desbloquear mensagens antigas", - "@unlockOldMessages": {}, "dehydrate": "Exportar sessão e apagar dispositivo", - "@dehydrate": {}, "dehydrateWarning": "Esta ação não pode ser desfeita. Certifique-se de que o arquivo de backup está guardado e seguro.", - "@dehydrateWarning": {}, "dehydrateTorLong": "Para usuários TOR, é recomendado exportar a sessão antes de fechar a janela.", - "@dehydrateTorLong": {}, "whyIsThisMessageEncrypted": "Por que não consigo ler esta mensagem?", - "@whyIsThisMessageEncrypted": {}, "screenSharingTitle": "compartilhamento de tela", - "@screenSharingTitle": {}, "screenSharingDetail": "Você está compartilhando sua tela no FluffyChat", - "@screenSharingDetail": {}, "numChats": "{number} conversas", "@numChats": { "type": "number", @@ -2449,66 +2349,38 @@ } }, "noKeyForThisMessage": "Isto pode ocorrer caso a mensagem tenha sido enviada antes de você ter se conectado à sua conta com este dispositivo.\n\nTambém é possível que o remetente tenha bloqueado o seu dispositivo ou ocorreu algum problema com a conexão.\n\nVocê consegue ler as mensagens em outra sessão? Então, pode transferir as mensagens de lá! Vá em Configurações > Dispositivos e confira se os dispositivos verificaram um ao outro. Quando abrir a sala da próxima vez e ambas as sessões estiverem abertas, as chaves serão transmitidas automaticamente.\n\nNão gostaria de perder suas chaves ao desconectar ou trocar de dispositivos? Certifique-se que o backup de conversas esteja ativado nas configurações.", - "@noKeyForThisMessage": {}, "allRooms": "Todas as conversas em grupo", "@allRooms": { "type": "String", "placeholders": {} }, "notAnImage": "Não é um arquivo de imagem.", - "@notAnImage": {}, "importNow": "Importar agora", - "@importNow": {}, "importEmojis": "Importar emojis", - "@importEmojis": {}, "importFromZipFile": "Importar de arquivo .zip", - "@importFromZipFile": {}, "sendTypingNotifications": "Enviar indicadores de digitação", - "@sendTypingNotifications": {}, "startFirstChat": "Inicie sua primeira conversa", - "@startFirstChat": {}, "exportEmotePack": "Exportar pacote de emojis como .zip", - "@exportEmotePack": {}, "replace": "Substituir", - "@replace": {}, "jumpToLastReadMessage": "Pular para a última mensagem lida", - "@jumpToLastReadMessage": {}, "reportErrorDescription": "😭 Ah, não. Algo deu errado. Se quiser, pode relatar isto aos desenvolvedores.", - "@reportErrorDescription": {}, "setColorTheme": "Aplicar paleta de cor:", - "@setColorTheme": {}, "banUserDescription": "O usuário será banido da conversa e não poderá participar novamente até que sejam desbanidos.", - "@banUserDescription": {}, "removeDevicesDescription": "Você será desconectado deste dispositivo e não poderá mais receber mensagens.", - "@removeDevicesDescription": {}, "tryAgain": "Tentar novamente", - "@tryAgain": {}, "unbanUserDescription": "O usuário poderá entrar novamente na conversa, caso tente.", - "@unbanUserDescription": {}, "messagesStyle": "Mensagens:", - "@messagesStyle": {}, "newSpaceDescription": "Os espaços permitem que você consolide suas conversas e construa comunidades públicas ou privadas.", - "@newSpaceDescription": {}, "chatDescription": "Descrição da conversa", - "@chatDescription": {}, "encryptThisChat": "Criptografar esta conversa", - "@encryptThisChat": {}, "reopenChat": "Reabrir conversa", - "@reopenChat": {}, "pushNotificationsNotAvailable": "Notificações push não estão disponíveis", - "@pushNotificationsNotAvailable": {}, "invalidServerName": "Nome do servidor inválido", - "@invalidServerName": {}, "chatPermissions": "Permissões da conversa", - "@chatPermissions": {}, "signInWithPassword": "Conectar com senha", - "@signInWithPassword": {}, "makeAdminDescription": "Assim que promover este usuário a administrador, não poderá desfazer isto e ele terá as mesmas permissões que você.", - "@makeAdminDescription": {}, "setChatDescription": "Configurar descrição da conversa", - "@setChatDescription": {}, "noOtherDevicesFound": "Nenhum outro dispositivo encontrado", - "@noOtherDevicesFound": {}, "redactedBy": "Apagado por {username}", "@redactedBy": { "type": "String", @@ -2528,15 +2400,10 @@ } }, "fileIsTooBigForServer": "Não foi possível enviar! O servidor suporta anexos somente até {max}.", - "@fileIsTooBigForServer": {}, "readUpToHere": "Lido até aqui", - "@readUpToHere": {}, "optionalRedactReason": "(Opcional) Motivo para apagar esta mensagem.", - "@optionalRedactReason": {}, "archiveRoomDescription": "A conversa será movida para o arquivo. Outros usuários verão que você deixou a conversa.", - "@archiveRoomDescription": {}, "inviteContactToGroupQuestion": "Deseja convidar {contact} para a conversa \"{groupName}\"?", - "@inviteContactToGroupQuestion": {}, "redactedByBecause": "Apagado por {username}, pois: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2559,13 +2426,9 @@ } }, "redactMessageDescription": "A mensagem será apagada para todos os participantes desta conversa. Isto não poderá ser desfeito.", - "@redactMessageDescription": {}, "invalidInput": "Entrada inválida!", - "@invalidInput": {}, "report": "relatar", - "@report": {}, "addChatDescription": "Adicionar uma descrição à conversa...", - "@addChatDescription": {}, "hasKnocked": "🚪 {user} bateu na porta", "@hasKnocked": { "placeholders": { @@ -2575,11 +2438,8 @@ } }, "openLinkInBrowser": "Abrir link no navegador", - "@openLinkInBrowser": {}, "disableEncryptionWarning": "Por razões de segurança, não é possível desativar a criptografada uma vez ativada.", - "@disableEncryptionWarning": {}, "directChat": "Conversa direta", - "@directChat": {}, "wrongPinEntered": "PIN incorreto! Tente novamente em {seconds} segundos...", "@wrongPinEntered": { "type": "String", @@ -2590,9 +2450,7 @@ } }, "inviteGroupChat": "📨 Convite para conversa em grupo", - "@inviteGroupChat": {}, "invitePrivateChat": "📨 Convite para conversa privada", - "@invitePrivateChat": {}, "wasDirectChatDisplayName": "Conversa vazia (era {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2603,62 +2461,36 @@ } }, "noChatDescriptionYet": "Nenhuma descrição para a conversa foi criada ainda.", - "@noChatDescriptionYet": {}, "learnMore": "Saiba mais", - "@learnMore": {}, "chatDescriptionHasBeenChanged": "Descrição da conversa alterada", - "@chatDescriptionHasBeenChanged": {}, "roomUpgradeDescription": "A conversa será recriada com a nova versão de sala. Todos participantes será notificados e terão que migrar para a nova sala. Você pode encontrar mais informações sobre versões de sala em https://spec.matrix.org/latest/room/", - "@roomUpgradeDescription": {}, "pleaseEnterANumber": "Digite um número maior que 0", - "@pleaseEnterANumber": {}, "profileNotFound": "O usuário não foi encontrado neste servidor. Talvez um problema de conexão ou o usuário não existe.", - "@profileNotFound": {}, "jump": "Pular", - "@jump": {}, "sorryThatsNotPossible": "Desculpe... isto não é possível", - "@sorryThatsNotPossible": {}, "shareInviteLink": "Compartilhar link de convite", - "@shareInviteLink": {}, "deviceKeys": "Chaves de dispositivo:", - "@deviceKeys": {}, "emoteKeyboardNoRecents": "Emojis recentes aparecem aqui...", "@emoteKeyboardNoRecents": { "type": "String", "placeholders": {} }, "setTheme": "Aplicar tema:", - "@setTheme": {}, "pleaseTryAgainLaterOrChooseDifferentServer": "Tente novamente mais tarde ou escolha um servidor diferente.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "createGroup": "Criar grupo", - "@createGroup": {}, "noBackupWarning": "Atenção! Se não ativar o backup de conversas, você perderá acesso a suas mensagens criptografadas. É altamente recomendável ativar o backup antes de sair.", - "@noBackupWarning": {}, "kickUserDescription": "O usuário foi expulso da conversa, mas não banido. Em conversas públicas, o usuário pode entrar novamente a qualquer momento.", - "@kickUserDescription": {}, "invite": "Convidar", - "@invite": {}, "blockListDescription": "Você pode bloquear usuários que estejam te perturbando. Você não receberá mensagens ou convites de usuários na sua lista pessoal de bloqueios.", - "@blockListDescription": {}, "createGroupAndInviteUsers": "Criar um grupo e convidar pessoas", - "@createGroupAndInviteUsers": {}, "thisDevice": "Este dispositivo:", - "@thisDevice": {}, "startConversation": "Iniciar uma conversa", - "@startConversation": {}, "publicSpaces": "Espaços públicos", - "@publicSpaces": {}, "blockedUsers": "Usuários bloqueados", - "@blockedUsers": {}, "passwordIsWrong": "A senha digitada está incorreta", - "@passwordIsWrong": {}, "pleaseEnterYourCurrentPassword": "Digite sua senha atual", - "@pleaseEnterYourCurrentPassword": {}, "groupCanBeFoundViaSearch": "Grupos podem ser encontrados por pesquisa", - "@groupCanBeFoundViaSearch": {}, "publicLink": "Link público", - "@publicLink": {}, "noUsersFoundWithQuery": "Infelizmente, não foi encontrado usuário com \"{query}\". Verifique se digitou corretamente.", "@noUsersFoundWithQuery": { "type": "String", @@ -2669,45 +2501,25 @@ } }, "block": "Bloquear", - "@block": {}, "nothingFound": "Nada foi encontrado...", - "@nothingFound": {}, "yourGlobalUserIdIs": "Seu ID global de usuário é: ", - "@yourGlobalUserIdIs": {}, "decline": "Rejeitar", - "@decline": {}, "newPassword": "Nova senha", - "@newPassword": {}, "passwordsDoNotMatch": "As senhas não correspondem", - "@passwordsDoNotMatch": {}, "commandHint_sendraw": "Enviar JSON puro", - "@commandHint_sendraw": {}, "wrongRecoveryKey": "Desculpe... esta não parece ser a chave de recuperação correta.", - "@wrongRecoveryKey": {}, "subspace": "Subespaço", - "@subspace": {}, "select": "Selecionar", - "@select": {}, "pleaseChooseAStrongPassword": "Escolha uma senha forte", - "@pleaseChooseAStrongPassword": {}, "blockUsername": "Ignorar nome de usuário", - "@blockUsername": {}, "addChatOrSubSpace": "Adicionar conversa ou subespaço", - "@addChatOrSubSpace": {}, "groupName": "Nome do grupo", - "@groupName": {}, "leaveEmptyToClearStatus": "Deixe em branco para limpar seu estado.", - "@leaveEmptyToClearStatus": {}, "joinSpace": "Entrar no espaço", - "@joinSpace": {}, "searchForUsers": "Pesquisar por @usuários...", - "@searchForUsers": {}, "databaseMigrationTitle": "O banco de dados está otimizado", - "@databaseMigrationTitle": {}, "searchChatsRooms": "Pesquisar por #conversas, @usuários...", - "@searchChatsRooms": {}, "databaseMigrationBody": "Aguarde. Isto pode demorar um pouco.", - "@databaseMigrationBody": {}, "youInvitedToBy": "📩 Você foi convidado através do link para:\n{alias}", "@youInvitedToBy": { "placeholders": { @@ -2726,11 +2538,8 @@ } }, "formattedMessagesDescription": "Exibir conteúdo de mensagem rico, como texto em negrito usando markdown.", - "@formattedMessagesDescription": {}, "verifyOtherUser": "🔐 Verificar outro usuário", - "@verifyOtherUser": {}, "verifyOtherDevice": "🔐 Verificar outro dispositivo", - "@verifyOtherDevice": {}, "acceptedKeyVerification": "{sender} aceitou a verificação de chaves", "@acceptedKeyVerification": { "type": "String", @@ -2750,7 +2559,6 @@ } }, "transparent": "Transparente", - "@transparent": {}, "databaseBuildErrorBody": "Não foi possível construir o banco de dados SQLite. O app tentará utilizar o banco de dados legado por enquanto. Relate este erro aos desenvolvedores em {url}. A mensagem de erro é: {error}", "@databaseBuildErrorBody": { "type": "String", @@ -2764,7 +2572,6 @@ } }, "initAppError": "Ocorreu um erro enquanto o app era iniciado", - "@initAppError": {}, "restoreSessionBody": "O app tentará agora restaurar sua sessão a partir do backup. Relate isto ao desenvolvedor em {url}. A mensagem de erro é: {error}", "@restoreSessionBody": { "type": "String", @@ -2778,11 +2585,8 @@ } }, "sendReadReceipts": "Enviar recibos de leitura", - "@sendReadReceipts": {}, "sendTypingNotificationsDescription": "Outros participantes nesta conversa podem ver quando você está digitando uma nova mensagem.", - "@sendTypingNotificationsDescription": {}, "formattedMessages": "Mensagens formatadas", - "@formattedMessages": {}, "presenceStyle": "Presença:", "@presenceStyle": { "type": "String", @@ -2794,11 +2598,8 @@ "placeholders": {} }, "commandHint_ignore": "Ignorar o ID Matrix especificado", - "@commandHint_ignore": {}, "commandHint_unignore": "Parar de ignorar o ID Matrix especificado", - "@commandHint_unignore": {}, "hidePresences": "Ocultar lista de estado?", - "@hidePresences": {}, "sessionLostBody": "Sua sessão foi desconectada. Relate este ao desenvolvedor em {url}. A mensagem de erro é: {error}", "@sessionLostBody": { "type": "String", @@ -2812,9 +2613,7 @@ } }, "sendReadReceiptsDescription": "Outros participantes nesta conversa podem ver quando você tiver lido uma mensagem.", - "@sendReadReceiptsDescription": {}, "verifyOtherUserDescription": "Se você verificar outro usuário, você terá certeza que você conhece com quem está conversando. 💪\n\nAo iniciar uma verificação, você e o outro usuário receberão um pop-up no app. Então vocês receberão uma série de emojis ou números para comparar um com o outro.\n\nA melhor maneira de fazer este procedimento é se encontrar pessoalmente ou através de uma chamada de vídeo. 👭", - "@verifyOtherUserDescription": {}, "requestedKeyVerification": "{sender} solicitou uma verificação de chaves", "@requestedKeyVerification": { "type": "String", @@ -2825,7 +2624,6 @@ } }, "verifyOtherDeviceDescription": "Ao verificar outro dispositivo, os dispositivos poderão trocar chaves, aumentando sua segurança. 💪 Ao iniciar a verificação, um pop-up aparecerá no app em ambos os aparelhos. Então você verá uma série de emojis ou números que você terá que comparar um com o outro. É melhor fazer esse procedimento com ambos os dispositivos em mãos antes de começar a verificação. 🤳", - "@verifyOtherDeviceDescription": {}, "canceledKeyVerification": "{sender} cancelou a verificação de chaves", "@canceledKeyVerification": { "type": "String", @@ -2854,11 +2652,8 @@ } }, "stickers": "Figurinhas", - "@stickers": {}, "discover": "Explorar", - "@discover": {}, "incomingMessages": "Mensagens recebidas", - "@incomingMessages": {}, "unreadChatsInApp": "{appname}: {unread} conversas não lidas", "@unreadChatsInApp": { "type": "String", @@ -2872,35 +2667,20 @@ } }, "appLockDescription": "Bloquear o app com um código PIN quando não estiver usando", - "@appLockDescription": {}, "accessAndVisibilityDescription": "Quem pode entrar nesta conversa e como a conversa pode ser descoberta.", - "@accessAndVisibilityDescription": {}, "calls": "Chamadas", - "@calls": {}, "customEmojisAndStickers": "Emojis e stickers customizados", - "@customEmojisAndStickers": {}, "customEmojisAndStickersBody": "Adicionar ou compartilhar emojis ou stickers customizados que podem ser usados em qualquer conversa.", - "@customEmojisAndStickersBody": {}, "hideRedactedMessages": "Ocultar mensagens apagadas", - "@hideRedactedMessages": {}, "hideRedactedMessagesBody": "Se alguém apagar uma mensagem, esta mensagem não será mais visível na conversa.", - "@hideRedactedMessagesBody": {}, "hideInvalidOrUnknownMessageFormats": "Ocultar formatos de mensagem inválidos ou desconhecidos", - "@hideInvalidOrUnknownMessageFormats": {}, "hideMemberChangesInPublicChats": "Ocultar mudanças de membro em conversas públicas", - "@hideMemberChangesInPublicChats": {}, "hideMemberChangesInPublicChatsBody": "Não mostre se alguém entrou ou saiu da conversa para melhorar a legibilidade.", - "@hideMemberChangesInPublicChatsBody": {}, "overview": "Visão geral", - "@overview": {}, "notifyMeFor": "Notificar me para", - "@notifyMeFor": {}, "usersMustKnock": "Usuários devem bater na porta", - "@usersMustKnock": {}, "noOneCanJoin": "Ninguém pode entrar", - "@noOneCanJoin": {}, "knocking": "Batendo na porta", - "@knocking": {}, "chatCanBeDiscoveredViaSearchOnServer": "A conversa pode ser descoberta por pesquisa em {server}", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2911,18 +2691,14 @@ } }, "publicChatAddresses": "Endereços de conversas públicas", - "@publicChatAddresses": {}, "thereAreCountUsersBlocked": "Nesse momento, há {count} usuários bloqueados.", "@thereAreCountUsersBlocked": { "type": "String", "count": {} }, "globalChatId": "ID global de conversa", - "@globalChatId": {}, "accessAndVisibility": "Acesso e visibilidade", - "@accessAndVisibility": {}, "passwordRecoverySettings": "Configurações de recuperação de senha", - "@passwordRecoverySettings": {}, "userWouldLikeToChangeTheChat": "{user} gostaria de entrar na conversa.", "@userWouldLikeToChangeTheChat": { "placeholders": { @@ -2932,9 +2708,7 @@ } }, "noPublicLinkHasBeenCreatedYet": "Nenhum link público foi criado ainda", - "@noPublicLinkHasBeenCreatedYet": {}, "userRole": "Cargo do usuário", - "@userRole": {}, "minimumPowerLevel": "{level} é o nível mínimo de poder.", "@minimumPowerLevel": { "type": "String", @@ -2945,11 +2719,8 @@ } }, "noDatabaseEncryption": "A criptografia do banco de dados não é suportada nesta plataforma", - "@noDatabaseEncryption": {}, "createNewAddress": "Criar um novo endereço", - "@createNewAddress": {}, "knock": "Bater na porta", - "@knock": {}, "searchIn": "Procurar na conversa {chat}...", "@searchIn": { "type": "String", @@ -2960,63 +2731,36 @@ } }, "restricted": "Restrito", - "@restricted": {}, "knockRestricted": "Bater na porta restrito", - "@knockRestricted": {}, "searchMore": "Pesquisar mais...", - "@searchMore": {}, "gallery": "Galeria", - "@gallery": {}, "files": "Arquivos", - "@files": {}, "more": "Mais", - "@more": {}, "deletePushRuleCanNotBeUndone": "Se você apagar esta configuração de notificação, isso não poderá ser desfeito.", - "@deletePushRuleCanNotBeUndone": {}, "alwaysUse24HourFormat": "true", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, "setPermissionsLevelDescription": "Selecione um cargo pré-definido abaixo ou digite um nível de permissão personalizado entre 0 e 100.", - "@setPermissionsLevelDescription": {}, "shareKeysWith": "Compartilhar chaves com...", - "@shareKeysWith": {}, "setCustomPermissionLevel": "Configurar nível personalizado de permissão", - "@setCustomPermissionLevel": {}, "ignoreUser": "Ignorar usuário", - "@ignoreUser": {}, "contentNotificationSettings": "Configurações de notificações de conteúdo", - "@contentNotificationSettings": {}, "generalNotificationSettings": "Configurações de notificações gerais", - "@generalNotificationSettings": {}, "notificationRuleContainsUserNameDescription": "Notifica o usuário quando a mensagem contém o seu nome de usuário.", - "@notificationRuleContainsUserNameDescription": {}, "notificationRuleMaster": "Silenciar todas as notificações", - "@notificationRuleMaster": {}, "notificationRuleMasterDescription": "Sobrescreve todas as outras regras e desativa todas as notificações.", - "@notificationRuleMasterDescription": {}, "notificationRuleContainsDisplayName": "Contém o nome de exibição", - "@notificationRuleContainsDisplayName": {}, "notificationRuleRoomnotif": "Notificação de sala", - "@notificationRuleRoomnotif": {}, "notificationRuleIsRoomMentionDescription": "Notifica o usuário quando há uma menção de sala.", - "@notificationRuleIsRoomMentionDescription": {}, "notificationRuleRoomnotifDescription": "Notifica o usuário quando uma mensagem contém '@room'.", - "@notificationRuleRoomnotifDescription": {}, "notificationRuleTombstone": "Morte", - "@notificationRuleTombstone": {}, "notificationRuleReaction": "Reação", - "@notificationRuleReaction": {}, "notificationRuleSuppressEditsDescription": "Omite notificações de mensagens editadas.", - "@notificationRuleSuppressEditsDescription": {}, "notificationRuleEncryptedRoomOneToOneDescription": "Notifica o usuário de mensagens em salas criptografas de 2 pessoas.", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, "notificationRuleRoomOneToOne": "Sala de 2 pessoas", - "@notificationRuleRoomOneToOne": {}, "notificationRuleMessageDescription": "Notifica o usuário de mensagens gerais.", - "@notificationRuleMessageDescription": {}, "notificationRuleEncrypted": "Criptografado", - "@notificationRuleEncrypted": {}, "unknownPushRule": "Regra de push desconhecida '{rule}'", "@unknownPushRule": { "type": "String", @@ -3027,25 +2771,15 @@ } }, "notificationRuleServerAclDescription": "Omite notificações de eventos de ACL de servidor.", - "@notificationRuleServerAclDescription": {}, "unread": "Não lido", - "@unread": {}, "changeTheCanonicalRoomAlias": "Alterar o endereço público principal da conversa", - "@changeTheCanonicalRoomAlias": {}, "doesNotSeemToBeAValidHomeserver": "Não parece ser um servidor compatível. URL errada?", - "@doesNotSeemToBeAValidHomeserver": {}, "website": "Site", - "@website": {}, "compress": "Comprimir", - "@compress": {}, "invalidUrl": "URL inválida", - "@invalidUrl": {}, "appWantsToUseForLoginDescription": "Aqui, você permite que o app e o site compartilhem informações sobre você.", - "@appWantsToUseForLoginDescription": {}, "notificationRuleMemberEvent": "Evento de membro", - "@notificationRuleMemberEvent": {}, "crossVerifiedDevicesIfEnabled": "Dispositivos verificados por ambos se ativado", - "@crossVerifiedDevicesIfEnabled": {}, "countInvited": "{count} convidados", "@countInvited": { "type": "String", @@ -3056,7 +2790,6 @@ } }, "checkList": "Lista de tarefas", - "@checkList": {}, "synchronizingPleaseWaitCounter": " Sincronizando… ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -3075,7 +2808,6 @@ } }, "markAsUnread": "Marcar como não lido", - "@markAsUnread": {}, "updateInstalled": "🎉 Atualização da versão {version} instalada!", "@updateInstalled": { "type": "String", @@ -3086,39 +2818,22 @@ } }, "changelog": "Registro de mudanças", - "@changelog": {}, "sendCanceled": "Envio cancelado", - "@sendCanceled": {}, "unableToJoinChat": "Não foi possível entrar na conversa. Talvez a outra pessoa já fechou a conversa.", - "@unableToJoinChat": {}, "whatIsAHomeserver": "O que é um servidor?", - "@whatIsAHomeserver": {}, "prepareSendingAttachment": "Preparando o envio do anexo...", - "@prepareSendingAttachment": {}, "sendingAttachment": "Enviando o anexo...", - "@sendingAttachment": {}, "noticeChatBackupDeviceVerification": "Observação: Quando você conecta todos os seus dispositivos ao backup de conversas, eles são verificados automaticamente.", - "@noticeChatBackupDeviceVerification": {}, "continueText": "Continuar", - "@continueText": {}, "blur": "Borrar:", - "@blur": {}, "opacity": "Opacidade:", - "@opacity": {}, "setWallpaper": "Configurar plano de fundo", - "@setWallpaper": {}, "noContactInformationProvided": "O servidor não fornece nenhuma informação válida de contato", - "@noContactInformationProvided": {}, "contactServerAdmin": "Contatar o administrador do servidor", - "@contactServerAdmin": {}, "contactServerSecurity": "Contatar a segurança do servidor", - "@contactServerSecurity": {}, "supportPage": "Página de ajuda", - "@supportPage": {}, "italicText": "Texto em itálico", - "@italicText": {}, "strikeThrough": "Risco", - "@strikeThrough": {}, "appWantsToUseForLogin": "Usar '{server}' para conectar", "@appWantsToUseForLogin": { "type": "String", @@ -3129,27 +2844,16 @@ } }, "open": "Abrir", - "@open": {}, "roomNotificationSettings": "Configurações de notificações de sala", - "@roomNotificationSettings": {}, "userSpecificNotificationSettings": "Configurações de notificações específicas ao usuário", - "@userSpecificNotificationSettings": {}, "otherNotificationSettings": "Configurações de outras notificações", - "@otherNotificationSettings": {}, "notificationRuleContainsUserName": "Contém o nome de usuário", - "@notificationRuleContainsUserName": {}, "notificationRuleSuppressNotices": "Omitir mensagens automáticas", - "@notificationRuleSuppressNotices": {}, "notificationRuleInviteForMe": "Convite para mim", - "@notificationRuleInviteForMe": {}, "notificationRuleMemberEventDescription": "Omite todas as notificações de eventos de membro.", - "@notificationRuleMemberEventDescription": {}, "notificationRuleIsUserMention": "Menção de usuário", - "@notificationRuleIsUserMention": {}, "notificationRuleContainsDisplayNameDescription": "Notifica o usuário quando uma mensagem contém seu nome de exibição.", - "@notificationRuleContainsDisplayNameDescription": {}, "notificationRuleCall": "Chamada", - "@notificationRuleCall": {}, "sentVoiceMessage": "🎙️ {duration} - Mensagem de voz de {sender}", "@sentVoiceMessage": { "type": "String", @@ -3163,15 +2867,10 @@ } }, "crossVerifiedDevices": "Dispositivos verificados por ambos", - "@crossVerifiedDevices": {}, "takeAPhoto": "Tirar uma foto", - "@takeAPhoto": {}, "youHaveKnocked": "Bateram na sua porta", - "@youHaveKnocked": {}, "changeGeneralChatSettings": "Alterar configurações gerais de conversa", - "@changeGeneralChatSettings": {}, "inviteOtherUsers": "Convidar outros usuários para esta conversa", - "@inviteOtherUsers": {}, "adminLevel": "{level} - Administrador", "@adminLevel": { "type": "String", @@ -3182,9 +2881,7 @@ } }, "changeTheChatPermissions": "Alterar as permissões da conversa", - "@changeTheChatPermissions": {}, "changeTheVisibilityOfChatHistory": "Alterar a visibilidade do histórico de conversa", - "@changeTheVisibilityOfChatHistory": {}, "sendImages": "Enviar {count} imagens", "@sendImages": { "type": "String", @@ -3200,17 +2897,11 @@ "space": {} }, "discoverHomeservers": "Explorar servidores", - "@discoverHomeservers": {}, "loginWithMatrixId": "Conectar com ID Matrix", - "@loginWithMatrixId": {}, "calculatingFileSize": "Calculando o tamanho do arquivo...", - "@calculatingFileSize": {}, "compressVideo": "Comprimindo o vídeo...", - "@compressVideo": {}, "generatingVideoThumbnail": "Gerando a miniatura do vídeo...", - "@generatingVideoThumbnail": {}, "oneOfYourDevicesIsNotVerified": "Um dos seus dispositivos não está verificado", - "@oneOfYourDevicesIsNotVerified": {}, "serverLimitReached": "Limite do servidor alcançado! Esperando {seconds} segundos...", "@serverLimitReached": { "type": "integer", @@ -3221,9 +2912,7 @@ } }, "manageAccount": "Gerenciar conta", - "@manageAccount": {}, "newChatRequest": "📩 Nova solicitação de conversa", - "@newChatRequest": {}, "userLevel": "{level} - Usuário", "@userLevel": { "type": "String", @@ -3234,25 +2923,15 @@ } }, "enterNewChat": "Abrir a conversa nova", - "@enterNewChat": {}, "notificationRuleSuppressNoticesDescription": "Omite notificações de clientes automatizados, como bots.", - "@notificationRuleSuppressNoticesDescription": {}, "notificationRuleInviteForMeDescription": "Notifica o usuário quando for convidado para uma sala.", - "@notificationRuleInviteForMeDescription": {}, "approve": "Aprovar", - "@approve": {}, "homeserverDescription": "Todos os seus dados são armazenados no servidor, parecido como um provedor de e-mail. Pode escolher qual servidor quer usar, enquanto ainda conversa com todo mundo. Aprenda mais em https://matrix.org.", - "@homeserverDescription": {}, "notificationRuleEncryptedRoomOneToOne": "Sala criptografada de 2 pessoas", - "@notificationRuleEncryptedRoomOneToOne": {}, "pleaseWaitUntilInvited": "Aguarde até que alguém da sala te convide.", - "@pleaseWaitUntilInvited": {}, "waitingForServer": "Aguardando o servidor...", - "@waitingForServer": {}, "notificationRuleEncryptedDescription": "Notifica o usuário de mensagens em salas criptografadas.", - "@notificationRuleEncryptedDescription": {}, "sendRoomNotifications": "Enviar notificações de @room", - "@sendRoomNotifications": {}, "sendingAttachmentCountOfCount": "Enviando o {index}° anexo de {length}...", "@sendingAttachmentCountOfCount": { "type": "integer", @@ -3266,19 +2945,12 @@ } }, "welcomeText": "Olá! 👋 Este é o FluffyChat. Você pode se conectar com qualquer servidor que é compatível com o https://matrix.org. E então conversar com qualquer um. É uma rede gigante e descentralizada de conversa!", - "@welcomeText": {}, "notificationRuleRoomServerAclDescription": "Omite notificações de listas de controle de acesso de servidor de uma sala (ACL).", - "@notificationRuleRoomServerAclDescription": {}, "appIntroduction": "O FluffyChat permite que você converse com os seus amigos entre mensageiros diferentes. Aprenda mais em https://matrix.org ou toque em *Continuar*.", - "@appIntroduction": {}, "notificationRuleIsUserMentionDescription": "Notifica o usuário quando é mencionado diretamente em uma mensagem.", - "@notificationRuleIsUserMentionDescription": {}, "notificationRuleSuppressEdits": "Omitir edições", - "@notificationRuleSuppressEdits": {}, "shareKeysWithDescription": "Quais dispositivos devem ser confiados para que possam ler suas mensagens em conversas criptografas?", - "@shareKeysWithDescription": {}, "allDevices": "Todos os dispositivos", - "@allDevices": {}, "aboutHomeserver": "Sobre {homeserver}", "@aboutHomeserver": { "type": "String", @@ -3289,23 +2961,14 @@ } }, "swipeRightToLeftToReply": "Deslizar da direita pra esquerda para responder", - "@swipeRightToLeftToReply": {}, "verifiedDevicesOnly": "Somente dispositivos verificados", - "@verifiedDevicesOnly": {}, "boldText": "Texto em negrito", - "@boldText": {}, "recordAVideo": "Gravar um vídeo", - "@recordAVideo": {}, "optionalMessage": "(Opcional) mensagem...", - "@optionalMessage": {}, "joinedChats": "Conversas que entrou", - "@joinedChats": {}, "notSupportedOnThisDevice": "Não há suporte neste dispositivo", - "@notSupportedOnThisDevice": {}, "normalUser": "Usuário normal", - "@normalUser": {}, "commandHint_roomupgrade": "Atualizar esta sala para a versão de sala especificada", - "@commandHint_roomupgrade": {}, "countChatsAndCountParticipants": "{chats} conversas e {participants} participantes", "@countChatsAndCountParticipants": { "type": "String", @@ -3319,13 +2982,9 @@ } }, "noMoreChatsFound": "Mais nenhuma conversa foi encontrada...", - "@noMoreChatsFound": {}, "noChatsFoundHere": "Nenhuma conversa encontrada aqui ainda. Inicie uma nova conversa com alguém usando o botão abaixo. ⤵️", - "@noChatsFoundHere": {}, "space": "Espaço", - "@space": {}, "spaces": "Espaços", - "@spaces": {}, "moderatorLevel": "{level} - Moderador", "@moderatorLevel": { "type": "String", @@ -3336,73 +2995,39 @@ } }, "changeTheDescriptionOfTheGroup": "Alterar a descrição da conversa", - "@changeTheDescriptionOfTheGroup": {}, "chatPermissionsDescription": "Configurar qual o nível de poder é necessário para certas ações nesta conversa. Os níveis de poder 0, 50, e 100 são normalmente para representar usuários, moderadores, e administradores, mas qualquer configuração é possível.", - "@chatPermissionsDescription": {}, "serverInformation": "Informações do servidor:", - "@serverInformation": {}, "name": "Nome", - "@name": {}, "version": "Versão", - "@version": {}, "pleaseFillOut": "Preencha", - "@pleaseFillOut": {}, "addLink": "Adicionar link", - "@addLink": {}, "notificationRuleRoomServerAcl": "ACL de servidores de sala", - "@notificationRuleRoomServerAcl": {}, "notificationRuleCallDescription": "Notifica o usuário de chamadas.", - "@notificationRuleCallDescription": {}, "notificationRuleRoomOneToOneDescription": "Notifica o usuário de mensagens em salas de duas pessoas.", - "@notificationRuleRoomOneToOneDescription": {}, "notificationRuleMessage": "Mensagem", - "@notificationRuleMessage": {}, "notificationRuleJitsi": "Jitsi", - "@notificationRuleJitsi": {}, "notificationRuleJitsiDescription": "Notifica o usuário de eventos de widget do Jitsi.", - "@notificationRuleJitsiDescription": {}, "notificationRuleServerAcl": "Omitir eventos de ACL de servidor", - "@notificationRuleServerAcl": {}, "notificationRuleIsRoomMention": "Menção de sala", - "@notificationRuleIsRoomMention": {}, "notificationRuleTombstoneDescription": "Notifica o usuário de mensagens de desativação de salas.", - "@notificationRuleTombstoneDescription": {}, "notificationRuleReactionDescription": "Omite notificações de reações.", - "@notificationRuleReactionDescription": {}, "commandHint_logout": "Desconecte-se do seu dispositivo atual", - "@commandHint_logout": {}, "commandHint_logoutall": "Desconecte-se de todos os dispositivos ativos", - "@commandHint_logoutall": {}, "displayNavigationRail": "Mostrar trilha de navegação em dispositivo móvel", - "@displayNavigationRail": {}, "previous": "Anterior", - "@previous": {}, "otherPartyNotLoggedIn": "A outra pessoa não tem nenhum dispositivo conectado no momento e portanto não consegue receber mensagens!", - "@otherPartyNotLoggedIn": {}, "customReaction": "Reação personalizada", - "@customReaction": {}, "moreEvents": "Mais eventos", - "@moreEvents": {}, "declineInvitation": "Rejeitar convite", - "@declineInvitation": {}, "noMessagesYet": "Nenhuma mensagem ainda", - "@noMessagesYet": {}, "longPressToRecordVoiceMessage": "Segure para gravar uma mensagem de voz.", - "@longPressToRecordVoiceMessage": {}, "pause": "Pausar", - "@pause": {}, "resume": "Retomar", - "@resume": {}, "newSubSpace": "Novo sub espaço", - "@newSubSpace": {}, "moveToDifferentSpace": "Mover para espaço diferente", - "@moveToDifferentSpace": {}, "moveUp": "Mover para cima", - "@moveUp": {}, "moveDown": "Mover para baixo", - "@moveDown": {}, "removeFromSpaceDescription": "A conversa será removida do espaço mas ainda aparecerá na sua lista de conversas.", - "@removeFromSpaceDescription": {}, "countChats": "{chats} conversas", "@countChats": { "type": "String", @@ -3431,7 +3056,6 @@ } }, "donate": "Doar", - "@donate": {}, "startedAPoll": "{username} iniciou uma enquete.", "@startedAPoll": { "type": "String", @@ -3442,25 +3066,15 @@ } }, "poll": "Enquete", - "@poll": {}, "startPoll": "Abrir enquete", - "@startPoll": {}, "endPoll": "Fechar enquete", - "@endPoll": {}, "answersVisible": "Respostas visíveis", - "@answersVisible": {}, "answersHidden": "Respostas ocultas", - "@answersHidden": {}, "pollQuestion": "Questão da enquete", - "@pollQuestion": {}, "answerOption": "Opção de resposta", - "@answerOption": {}, "addAnswerOption": "Adicionar opção de resposta", - "@addAnswerOption": {}, "allowMultipleAnswers": "Permitir várias respostas", - "@allowMultipleAnswers": {}, "pollHasBeenEnded": "A enquete terminou", - "@pollHasBeenEnded": {}, "countVotes": "{count, plural, =1{Um voto} other{{count} votos}}", "@countVotes": { "type": "int", @@ -3471,9 +3085,7 @@ } }, "answersWillBeVisibleWhenPollHasEnded": "As respostas ficarão visíveis quando a enquete terminar", - "@answersWillBeVisibleWhenPollHasEnded": {}, "replyInThread": "Responder no tópico", - "@replyInThread": {}, "countReplies": "{count, plural, =1{Uma resposta} other{{count} respostas}}", "@countReplies": { "type": "int", @@ -3484,35 +3096,30 @@ } }, "thread": "Tópico", - "@thread": {}, "backToMainChat": "Voltar à conversa principal", - "@backToMainChat": {}, "saveChanges": "Salvar alterações", - "@saveChanges": {}, "createSticker": "Criar figurinha ou emoji", - "@createSticker": {}, "useAsSticker": "Usar como figurinha", - "@useAsSticker": {}, "useAsEmoji": "Usar como emoji", - "@useAsEmoji": {}, "stickerPackNameAlreadyExists": "O nome do pacote de figurinhas já existe", - "@stickerPackNameAlreadyExists": {}, "newStickerPack": "Novo pacote de figurinhas", - "@newStickerPack": {}, "stickerPackName": "Nome do pacote de figurinhas", - "@stickerPackName": {}, "attribution": "Créditos", - "@attribution": {}, "skipChatBackup": "Pular backup de conversas", - "@skipChatBackup": {}, "skipChatBackupWarning": "Tem certeza? Se não ativar o backup de conversas, você pode perder o acesso às suas mensagens se trocar de dispositivo.", - "@skipChatBackupWarning": {}, "loadingMessages": "Carregando mensagens", - "@loadingMessages": {}, "setupChatBackup": "Configurar backup de conversas", - "@setupChatBackup": {}, "changedTheChatDescription": "{username} alterou a descrição da conversa", - "@changedTheChatDescription": {}, "changedTheChatName": "{username} alterou o nome da conversa", - "@changedTheChatName": {} + "versionWithNumber": "Versão: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "advancedConfigs": "", + "theProcessWasCanceled": "" } From 5dfb40fdb8beb343a188d053351976c618cfa5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Fri, 20 Feb 2026 02:28:57 +0100 Subject: [PATCH 096/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (841 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 502def90..4ef6388b 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -3144,5 +3144,6 @@ "signUpGreeting": "FluffyChat 是去中心化的!选择您希望创建账户的服务器!", "signInGreeting": "已经有 Matrix 账户了?欢迎回来!选择 homeserver 登录。", "appIntro": "借助 FluffyChat,您可以和好友聊天。它是安全的去中心化 [matrix] 消息收发应用!如果愿意,可以在 https://matrix.org 了解更多信息,也可直接注册账户。", - "theProcessWasCanceled": "过程被取消。" + "theProcessWasCanceled": "过程被取消。", + "join": "加入" } From d233a22793a0eb7f6099c570dcf1ffc0d9743335 Mon Sep 17 00:00:00 2001 From: Jelv Date: Fri, 20 Feb 2026 22:35:33 +0100 Subject: [PATCH 097/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (841 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index f3e35b0d..33581c89 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -1276,7 +1276,7 @@ "type": "String", "placeholders": {} }, - "ok": "OK", + "ok": "Ok", "@ok": { "type": "String", "placeholders": {} @@ -3143,5 +3143,6 @@ "signUpGreeting": "FluffyChat is decentraal! Kies een server waar je wil voor jouw account en laten we gaan!", "signInGreeting": "Heb je al een Matrix account? Welkom terug! Kies jouw server en log in.", "appIntro": "Met FluffyChat kan je chatten met je vrienden. Het is een veilige en decentrale [matrix] app! Lees meer op https://matrix.org als je wilt of kies registreren.", - "theProcessWasCanceled": "Het proces is geannuleerd." + "theProcessWasCanceled": "Het proces is geannuleerd.", + "join": "Deelnemen" } From 213019f083e6efeeb01754c8ace3465201a6b4f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Fri, 20 Feb 2026 18:33:50 +0100 Subject: [PATCH 098/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 48.7% (410 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 47 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index eebe6ba4..a6243839 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -58,7 +58,7 @@ "type": "String", "placeholders": {} }, - "confirmMatrixId": "Ttxil-ik·im, sentem asulay-ik·im n Matrix akken ad tekkseḍ amiḍan-ik·im.", + "confirmMatrixId": "Ttxil-ik·im, sentem asulay-ik·im n Matriks akken ad tekkseḍ amiḍan-ik·im.", "supposedMxid": "A win yufan, ad yili d {mxid}", "@supposedMxid": { "type": "String", @@ -296,7 +296,7 @@ "type": "String", "placeholders": {} }, - "commandHint_markasdm": "Creḍ d akken taxxamt n yizen usrid i usulay Matrix i d-yettunefken", + "commandHint_markasdm": "Creḍ d akken taxxamt n yizen usrid i Usulay Matriks i d-yettunefken", "commandHint_markasgroup": "Creḍ am ugraw", "commandHint_ban": "Gdel aseqdac i d-ittunefken seg texxamt-agi", "@commandHint_ban": { @@ -1623,5 +1623,46 @@ "notificationRuleContainsDisplayName": "Yegber Isem n ubeqqeḍ", "notificationRuleContainsDisplayNameDescription": "Azen ilɣa i useqdac ma yella yizen yegber Isem-is n ubeqqeḍ.", "notificationRuleIsRoomMention": "Abdar n Texxamt", - "notificationRuleIsRoomMentionDescription": "Azen ilɣa i useqdac ticki yella ubdar n texxamt." + "notificationRuleIsRoomMentionDescription": "Azen ilɣa i useqdac ticki yella ubdar n texxamt.", + "badServerLoginTypesException": "Aqeddac agejdan issefrak anawen n tuqqna:\n{serverVersions}\nMaca asnas-agi issefrak kan:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendTypingNotifications": "Azen alɣu ttaruɣ", + "swipeRightToLeftToReply": "Zuɣer seg uyeffus ɣer uzelmaḍ akken ad d-terreḍ", + "badServerVersionsException": "Aqeddac agejdan issefrak ileqman Spec:\n{serverVersions}\nMaca asnas-agi issefrak kan {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "countChatsAndCountParticipants": "{chats} n yidiwenniyen akked {participants} n yimttekkiyen", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "Ulac ugar n idiwenniyen yettwafen…", + "noChatsFoundHere": "Ur d-nufi ula d yiwen n udiwenni da. Bdu adiwenni akked yiwen s useqdec n tqeffalt ukessar-a. ⤵️", + "joinedChats": "Yettwarna ɣer udiwenni" } From 1b5c1547d6e99c782479bb9c5739c0d2cbc5b56a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Fri, 20 Feb 2026 12:04:54 +0100 Subject: [PATCH 099/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (841 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index 342b46d7..fd1d59ba 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -3150,5 +3150,6 @@ "signUpGreeting": "Tá FluffyChat díláraithe! Roghnaigh freastalaí inar mian leat do chuntas a chruthú agus déanaimis é!", "signInGreeting": "An bhfuil cuntas agat i Matrix cheana féin? Fáilte ar ais! Roghnaigh do fhreastalaí baile agus sínigh isteach.", "appIntro": "Le FluffyChat is féidir leat comhrá a dhéanamh le do chairde. Is teachtaire [maitrís] díláraithe slán é! Foghlaim tuilleadh ar https://matrix.org más maith leat nó cláraigh.", - "theProcessWasCanceled": "Cuireadh an próiseas ar ceal." + "theProcessWasCanceled": "Cuireadh an próiseas ar ceal.", + "join": "Téigh i" } From 81af04f60a7b014f8dfb5d47eacb6d095ed9526f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 20 Feb 2026 15:25:37 +0100 Subject: [PATCH 100/333] chore(translations): Translated using Weblate (Estonian) Currently translated at 100.0% (841 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/ --- lib/l10n/intl_et.arb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index 5399ecb5..984c2dd1 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -3144,5 +3144,6 @@ "signUpGreeting": "FluffyChat kasutab hajutatud võrku! Vali server, kuhu tahad oma kasutajakonto lisada ning alustame!", "signInGreeting": "Sul juba on Matrixi kasutajakonto olemas? Tere tulemast tagasi! Vali oma koduserver ja logi sisse.", "appIntro": "FluffyChati abil saad suhelda oma sõpradega. See on turvaline ja hajutatud sõnumiklient [matrix]-i võrgus! Lisateavet leiad https://matrix.org saidist või lihtsalt liitu.", - "theProcessWasCanceled": "Protsess on katkestatud." + "theProcessWasCanceled": "Protsess on katkestatud.", + "join": "Liitu" } From 187bc676cfce1db6796995dea3e292cd064c4a3c Mon Sep 17 00:00:00 2001 From: Krille-chan Date: Sat, 21 Feb 2026 07:28:45 +0100 Subject: [PATCH 101/333] fix: Add missing @@locale --- lib/l10n/intl_kab.arb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index a6243839..36327059 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1,4 +1,5 @@ { + "@@locale": "kab", "repeatPassword": "Ales awal n uɛeddi", "notAnImage": "Mačči d afaylu n tugna.", "setCustomPermissionLevel": "Sbadu aswir yugnen n usireg", From 812ea75aba8cbf20aa6776aa4bf475634cc025ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Feb 2026 07:30:43 +0100 Subject: [PATCH 102/333] chore: Update locale config --- android/app/src/main/res/xml/locale_config.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/android/app/src/main/res/xml/locale_config.xml b/android/app/src/main/res/xml/locale_config.xml index 130debff..03c69a69 100644 --- a/android/app/src/main/res/xml/locale_config.xml +++ b/android/app/src/main/res/xml/locale_config.xml @@ -30,6 +30,7 @@ + From c3ae496beeb586da5d293494dbbc3a60a008a532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Feb 2026 07:31:59 +0100 Subject: [PATCH 103/333] fix: Wrong placeholder in kab --- lib/l10n/intl_kab.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 36327059..0004f11d 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1593,7 +1593,7 @@ "unableToJoinChat": "Ur yezmir ara ad yernu ɣer udiwenni. Ahat aseqdac n udiwenni-agi imdel-it yakan.", "previous": "Uzwir", "otherPartyNotLoggedIn": "Aḥric nniḍen ur yeqqin ara akka tura, ihi ur yezmir ara ad d-yeṭṭef iznan!", - "appWantsToUseForLogin": "Seqdec '{server]' akken ad teqqneḍ", + "appWantsToUseForLogin": "Seqdec '{server}' akken ad teqqneḍ", "@appWantsToUseForLogin": { "type": "String", "placeholders": { From d434489f398df2102d52e2876d1f1fd1391c1996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Feb 2026 07:33:07 +0100 Subject: [PATCH 104/333] chore: Follow up import format --- lib/utils/client_manager.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 713461ce..452d8956 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -1,6 +1,5 @@ import 'dart:io'; -import 'package:fluffychat/utils/custom_image_resizer.dart'; import 'package:flutter/foundation.dart'; import 'package:collection/collection.dart'; @@ -15,6 +14,7 @@ import 'package:universal_html/html.dart' as html; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/custom_http_client.dart'; +import 'package:fluffychat/utils/custom_image_resizer.dart'; import 'package:fluffychat/utils/init_with_restore.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart'; From ae1a1919b5fe4ee6515476f23d0a8ce218ca18ab Mon Sep 17 00:00:00 2001 From: xabirequejo Date: Sat, 21 Feb 2026 23:58:53 +0100 Subject: [PATCH 105/333] chore(translations): Translated using Weblate (Basque) Currently translated at 100.0% (841 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/ --- lib/l10n/intl_eu.arb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_eu.arb b/lib/l10n/intl_eu.arb index 7a36eb28..07c1fc46 100644 --- a/lib/l10n/intl_eu.arb +++ b/lib/l10n/intl_eu.arb @@ -3138,5 +3138,12 @@ "signInWithLabel": "Hasi saioa honakoarekin:", "federationBaseUrl": "Federatzeko URL oinarria", "baseUrl": "URL oinarria", - "identityServer": "Identitate-zerbitzaria:" + "identityServer": "Identitate-zerbitzaria:", + "signIn": "Hasi saioa", + "createNewAccount": "Sortu kontu berria", + "signUpGreeting": "FluffyChat deszentralizatua da! Hautatu zure kontua zein zerbitzaritan sortu nahi duzun, eta hasi erabiltzen!", + "signInGreeting": "Baduzu dagoeneko Matrix kontu bat? Ongi etorri berriro ere! Hautatu zure zerbitzaria eta hasi saioa.", + "appIntro": "FluffyChat-i esker lagunekin txateatu dezakezu. [matrix]-erako mezularitza programa seguru eta deszentralizatua da! Nahi baduzu, irakurri gehiago https://matrix.org gunean, edo hasi saioa.", + "theProcessWasCanceled": "Eragiketa bertan behera utzi da.", + "join": "Batu" } From 08379a72e51657dbd297d8b4d18fe18db79a1191 Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Sat, 21 Feb 2026 07:03:25 +0100 Subject: [PATCH 106/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (841 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 2491aa33..2e3b4e6a 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -3151,5 +3151,6 @@ "signUpGreeting": "FluffyChat er desentralisert! Velg en server der du vil opprette kontoen din, så kjører vi på!", "signInGreeting": "Har du allerede en Matrix-konto? Velkommen tilbake! Velg hjemmeserveren din og logg inn.", "appIntro": "Med FluffyChat kan du chatte med vennene dine. Det er en sikker, desentralisert [matrix]-meldingsapp! Les mer på https://matrix.org hvis du vil, eller bare registrer deg.", - "theProcessWasCanceled": "Prosessen ble avbrutt." + "theProcessWasCanceled": "Prosessen ble avbrutt.", + "join": "Bli med" } From 7cde0f9d0a75089a53cd23f0254326c2adc2f6fd Mon Sep 17 00:00:00 2001 From: nautilusx Date: Sat, 21 Feb 2026 22:35:27 +0100 Subject: [PATCH 107/333] chore(translations): Translated using Weblate (German) Currently translated at 100.0% (841 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/ --- lib/l10n/intl_de.arb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index c37baf26..8ae397ee 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -3143,5 +3143,6 @@ "appIntro": "Mit FluffyChat kannst du mit deinen Freunden chatten. Es ist ein sicherer, dezentralisierter [Matrix]-Messenger! Erfahre mehr auf https://matrix.org, wenn du möchtest, oder melde dich einfach an.", "theProcessWasCanceled": "Der Vorgang wurde abgebrochen.", "federationBaseUrl": "Basis-URL der Föderation", - "clientWellKnownInformation": "Bekannte Informationen zum Client:" + "clientWellKnownInformation": "Bekannte Informationen zum Client:", + "join": "Beitreten" } From 0869a93a7a05bd176b3c05618b717b5676dd5cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Sat, 21 Feb 2026 18:38:23 +0100 Subject: [PATCH 108/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 51.2% (431 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 100 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 0004f11d..f8604fda 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1665,5 +1665,103 @@ }, "noMoreChatsFound": "Ulac ugar n idiwenniyen yettwafen…", "noChatsFoundHere": "Ur d-nufi ula d yiwen n udiwenni da. Bdu adiwenni akked yiwen s useqdec n tqeffalt ukessar-a. ⤵️", - "joinedChats": "Yettwarna ɣer udiwenni" + "joinedChats": "Yettwarna ɣer udiwenni", + "widgetName": "Isem", + "widgetUrlError": "Wagi mačči d URL ameɣtu.", + "widgetNameError": "Ttxil-k·m sekcem isem n uskan.", + "errorAddingWidget": "Tuccḍa deg tmerna n uwiǧit.", + "youRejectedTheInvitation": "Tugiḍ tinnubga", + "youJoinedTheChat": "Tekcemeḍ ɣer udiwenni", + "youAcceptedTheInvitation": "👍 Tqebleḍ tinubga", + "youBannedUser": "Tgedleḍ {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "Tekkseḍ tinnubga i {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 Tettwaɛerḍeḍ s useɣwen ɣer:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 Tettwaɛerḍeḍ sɣur {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "invitedBy": "📩 Tettwaɛerḍeɣ sɣur {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 Tɛerḍeḍ-d {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 Tegliḍ s rrkel {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 Tegliḍ s rrkel u tgedleḍ {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "Tekkseḍ agdel n {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪{user} yesṭebṭbed", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Iseqdacen yessefk ad sṭebṭben", + "noOneCanJoin": "Yiwen ur yezmir ad d-yernu", + "userWouldLikeToChangeTheChat": "{user} yebɣa ad yettekki deg udiwenni.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "Werɛad ur d-yennulfa ula d yiwen n wassaɣ azayez" } From 15a7053c58ae380e9dc2f4821eb65ae0cb2e6a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 09:07:37 +0100 Subject: [PATCH 109/333] build: Deploy web on app.fluffy.chat --- .github/workflows/release.yaml | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 25dab37e..de164c05 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -23,8 +23,6 @@ jobs: with: flutter-version: ${{ env.FLUTTER_VERSION }} cache: true - - name: Install dependencies - run: sudo apt-get update && sudo apt-get install nodejs -y - uses: moonrepo/setup-rust@v1 - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu - run: flutter pub get @@ -32,7 +30,7 @@ jobs: run: ./scripts/prepare-web.sh - run: rm ./assets/vodozemac/.gitignore - name: Build Release Web - run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps --base-href "/web/" + run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps - name: Create archive run: tar -czf fluffychat-web.tar.gz build/web/ - name: Upload Web Build @@ -49,17 +47,12 @@ jobs: asset_path: fluffychat-web.tar.gz asset_name: fluffychat-web.tar.gz asset_content_type: application/gzip - - name: Install and build tailwindcss - working-directory: docs - run: | - npm install tailwindcss @tailwindcss/cli - npx tailwindcss -o ./tailwind.css - name: Build Website run: | - mv docs public - mv repo public || true - mv build/web/ public/web - cp public/web -r public/nightly + mkdir public + mkdir public/nightly + cp -r build/web/* public/ + cp -r build/web/* public/nightly/ - name: Deploy to GitHub Pages if: startsWith(github.ref, 'refs/tags/v') uses: peaceiris/actions-gh-pages@v4 @@ -67,7 +60,7 @@ jobs: personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }} publish_dir: ./public publish_branch: gh-pages - cname: fluffychat.im + cname: app.fluffy.chat build_apk: runs-on: ubuntu-latest From c1541bc4bfdde03631a805c78c94b690c5704f86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 9 Nov 2025 11:17:55 +0100 Subject: [PATCH 110/333] feat: Implement matrix native oidc --- lib/config/app_config.dart | 2 +- lib/pages/settings/settings_view.dart | 11 +- lib/pages/sign_in/sign_in_page.dart | 155 ++++++++++-------- .../view_model/flows/check_homeserver.dart | 40 +++-- .../sign_in/view_model/flows/oidc_login.dart | 91 ++++++++++ .../sign_in/view_model/flows/sso_login.dart | 1 + 6 files changed, 208 insertions(+), 92 deletions(-) create mode 100644 lib/pages/sign_in/view_model/flows/oidc_login.dart diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index e635e96c..1cd090c6 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -31,7 +31,7 @@ abstract class AppConfig { static const String howDoIGetStickersTutorial = 'https://fluffy.chat/faq/#how_do_i_get_stickers'; static const String appId = 'im.fluffychat.FluffyChat'; - static const String appOpenUrlScheme = 'im.fluffychat'; + static const String appOpenUrlScheme = 'chat.fluffy'; static const String sourceCodeUrl = 'https://github.com/krille-chan/fluffychat'; diff --git a/lib/pages/settings/settings_view.dart b/lib/pages/settings/settings_view.dart index 3b25f30b..20b84146 100644 --- a/lib/pages/settings/settings_view.dart +++ b/lib/pages/settings/settings_view.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -119,13 +118,9 @@ class SettingsView extends StatelessWidget { }, ), FutureBuilder( - future: Matrix.of(context).client.getWellknown(), + future: Matrix.of(context).client.getAuthMetadata(), builder: (context, snapshot) { - final accountManageUrl = snapshot.data?.additionalProperties - .tryGetMap( - 'org.matrix.msc2965.authentication', - ) - ?.tryGet('account'); + final accountManageUrl = snapshot.data?.issuer; if (accountManageUrl == null) { return const SizedBox.shrink(); } @@ -133,7 +128,7 @@ class SettingsView extends StatelessWidget { leading: const Icon(Icons.account_circle_outlined), title: Text(L10n.of(context).manageAccount), trailing: const Icon(Icons.open_in_new_outlined), - onTap: () => launchUrlString( + onTap: () => launchUrl( accountManageUrl, mode: LaunchMode.inAppBrowserView, ), diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index 8dd4390a..0b353065 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -57,6 +57,8 @@ class SignInPage extends StatelessWidget { state.publicHomeservers.connectionState == ConnectionState.waiting, controller: viewModel.filterTextController, + autocorrect: false, + keyboardType: TextInputType.url, decoration: InputDecoration( filled: true, fillColor: theme.colorScheme.secondaryContainer, @@ -91,37 +93,27 @@ class SignInPage extends StatelessWidget { final server = publicHomeservers[i]; return RadioListTile.adaptive( value: server, - radioScaleFactor: 2, - secondary: IconButton( - icon: const Icon(Icons.link_outlined), - onPressed: () => launchUrlString( - server.homepage ?? 'https://${server.name}', - ), - ), + radioScaleFactor: + FluffyThemes.isColumnMode(context) || + { + TargetPlatform.iOS, + TargetPlatform.macOS, + }.contains(theme.platform) + ? 2 + : 1, title: Row( - spacing: 4, children: [ Expanded(child: Text(server.name ?? 'Unknown')), - ...?server.languages?.map( - (language) => Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, + SizedBox.square( + dimension: 32, + child: IconButton( + icon: const Icon( + Icons.open_in_new_outlined, + size: 16, ), - color: theme.colorScheme.tertiaryContainer, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, - ), - child: Text( - language, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onTertiaryContainer, - ), - ), + onPressed: () => launchUrlString( + server.homepage ?? + 'https://${server.name}', ), ), ), @@ -133,36 +125,61 @@ class SignInPage extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ if (server.features?.isNotEmpty == true) - Row( + Wrap( spacing: 4.0, - children: server.features! - .map( - (feature) => Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, + runSpacing: 4.0, + children: [ + ...?server.languages?.map( + (language) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .tertiaryContainer, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, ), - color: theme - .colorScheme - .secondaryContainer, - child: Padding( - padding: - const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, - ), - child: Text( - feature, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onSecondaryContainer, - ), + child: Text( + language, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onTertiaryContainer, ), ), ), - ) - .toList(), + ), + ), + ...server.features!.map( + (feature) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .secondaryContainer, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + feature, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onSecondaryContainer, + ), + ), + ), + ), + ), + ], ), Text( server.description ?? 'A matrix homeserver', @@ -188,22 +205,24 @@ class SignInPage extends StatelessWidget { shadowColor: theme.appBarTheme.shadowColor, child: Padding( padding: const EdgeInsets.all(16.0), - child: ElevatedButton( - onPressed: - state.loginLoading.connectionState == - ConnectionState.waiting - ? null - : () => connectToHomeserverFlow( - selectedHomserver, - context, - viewModel.setLoginLoading, - signUp, - ), - child: - state.loginLoading.connectionState == - ConnectionState.waiting - ? const CircularProgressIndicator.adaptive() - : Text(L10n.of(context).continueText), + child: SafeArea( + child: ElevatedButton( + onPressed: + state.loginLoading.connectionState == + ConnectionState.waiting + ? null + : () => connectToHomeserverFlow( + selectedHomserver, + context, + viewModel.setLoginLoading, + signUp, + ), + child: + state.loginLoading.connectionState == + ConnectionState.waiting + ? const CircularProgressIndicator.adaptive() + : Text(L10n.of(context).continueText), + ), ), ), ), diff --git a/lib/pages/sign_in/view_model/flows/check_homeserver.dart b/lib/pages/sign_in/view_model/flows/check_homeserver.dart index 895a168b..a7ddb206 100644 --- a/lib/pages/sign_in/view_model/flows/check_homeserver.dart +++ b/lib/pages/sign_in/view_model/flows/check_homeserver.dart @@ -5,6 +5,7 @@ import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pages/sign_in/view_model/flows/oidc_login.dart'; import 'package:fluffychat/pages/sign_in/view_model/flows/sso_login.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; @@ -27,16 +28,33 @@ void connectToHomeserverFlow( } final l10n = L10n.of(context); final client = await Matrix.of(context).getLoginClient(); - final (_, _, loginFlows, _) = await client.checkHomeserver(homeserver); + final (_, _, loginFlows, authMetadata) = await client.checkHomeserver( + homeserver, + fetchAuthMetadata: true, + ); + final regLink = homeserverData.regLink; final supportsSso = loginFlows.any((flow) => flow.type == 'm.login.sso'); - if (!supportsSso) { - final regLink = homeserverData.regLink; + if ((kIsWeb || PlatformInfos.isLinux) && + (supportsSso || authMetadata != null || (signUp && regLink != null))) { + final consent = await showOkCancelAlertDialog( + context: context, + title: l10n.appWantsToUseForLogin(homeserverInput), + message: l10n.appWantsToUseForLoginDescription, + okLabel: l10n.continueText, + ); + if (consent != OkCancelResult.ok) return; + } + + if (authMetadata != null) { + await oidcLoginFlow(client, context, signUp); + } else if (supportsSso) { + await ssoLoginFlow(client, context, signUp); + } else { if (signUp && regLink != null) { await launchUrlString(regLink); } - final pathSegments = List.of( GoRouter.of(context).routeInformationProvider.value.uri.pathSegments, ); @@ -46,18 +64,10 @@ void connectToHomeserverFlow( setState(AsyncSnapshot.withData(ConnectionState.done, true)); return; } - if (kIsWeb || PlatformInfos.isLinux) { - final consent = await showOkCancelAlertDialog( - context: context, - title: l10n.appWantsToUseForLogin(homeserverInput), - message: l10n.appWantsToUseForLoginDescription, - okLabel: l10n.continueText, - ); - if (consent != OkCancelResult.ok) return; - } - await ssoLoginFlow(client, context, signUp); - setState(AsyncSnapshot.withData(ConnectionState.done, true)); + if (context.mounted) { + setState(AsyncSnapshot.withData(ConnectionState.done, true)); + } } catch (e, s) { setState(AsyncSnapshot.withError(ConnectionState.done, e, s)); if (!context.mounted) return; diff --git a/lib/pages/sign_in/view_model/flows/oidc_login.dart b/lib/pages/sign_in/view_model/flows/oidc_login.dart new file mode 100644 index 00000000..38ffd4b3 --- /dev/null +++ b/lib/pages/sign_in/view_model/flows/oidc_login.dart @@ -0,0 +1,91 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:matrix/matrix.dart'; +import 'package:universal_html/html.dart' as html; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; + +Future oidcLoginFlow( + Client client, + BuildContext context, + bool signUp, +) async { + Logs().i('Starting Matrix Native OIDC Flow...'); + final redirectUrl = kIsWeb + ? Uri.parse( + html.window.location.href, + ).resolveUri(Uri(pathSegments: ['auth.html'])) + : (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) + ? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login') + : Uri.parse('http://localhost:3001/login'); + + final urlScheme = + (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) + ? redirectUrl.scheme + : 'http://localhost:3001'; + + final clientUri = Uri.parse(AppConfig.website); + final supportWebPlatform = + kIsWeb && + kReleaseMode && + redirectUrl.scheme == 'https' && + redirectUrl.host.contains(clientUri.host); + if (!supportWebPlatform) { + Logs().w( + 'OIDC Application Type web is not supported. Using native now. Please use this instance not in production!', + ); + } + + final oidcClientData = await client.registerOidcClient( + redirectUris: [redirectUrl], + applicationType: supportWebPlatform + ? OidcApplicationType.web + : OidcApplicationType.native, + clientInformation: OidcClientInformation( + clientName: AppSettings.applicationName.value, + clientUri: clientUri, + logoUri: Uri.parse('https://fluffy.chat/assets/favicon.png'), + tosUri: null, + policyUri: AppConfig.privacyUrl, + ), + ); + + final session = await client.initOidcLoginSession( + oidcClientData: oidcClientData, + redirectUri: redirectUrl, + prompt: signUp ? 'create' : null, + ); + + if (!PlatformInfos.isMobile && !PlatformInfos.isMacOS) { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of( + context, + ).appWantsToUseForLogin(client.homeserver!.toString()), + message: L10n.of(context).appWantsToUseForLoginDescription, + okLabel: L10n.of(context).continueText, + ); + if (consent != OkCancelResult.ok) return; + } + if (!context.mounted) return; + + final returnUrlString = await FlutterWebAuth2.authenticate( + url: session.authenticationUri.toString(), + callbackUrlScheme: urlScheme, + options: FlutterWebAuth2Options(useWebview: PlatformInfos.isMobile), + ); + final returnUrl = Uri.parse(returnUrlString); + final queryParameters = returnUrl.hasFragment + ? Uri.parse(returnUrl.fragment).queryParameters + : returnUrl.queryParameters; + final code = queryParameters['code'] as String; + final state = queryParameters['state'] as String; + + await client.oidcLogin(session: session, code: code, state: state); +} diff --git a/lib/pages/sign_in/view_model/flows/sso_login.dart b/lib/pages/sign_in/view_model/flows/sso_login.dart index 5eb5c3cc..325793c1 100644 --- a/lib/pages/sign_in/view_model/flows/sso_login.dart +++ b/lib/pages/sign_in/view_model/flows/sso_login.dart @@ -13,6 +13,7 @@ Future ssoLoginFlow( BuildContext context, bool signUp, ) async { + Logs().i('Starting legacy SSO Flow...'); final redirectUrl = kIsWeb ? Uri.parse( html.window.location.href, From 39ed7a3aa92eed36932902d2ecaad7771585947f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 09:34:10 +0100 Subject: [PATCH 111/333] chore: Add recommended homeservers --- lib/config/app_config.dart | 4 ++-- recommended_homeservers.json | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 recommended_homeservers.json diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 1cd090c6..cedef2c1 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -50,8 +50,8 @@ abstract class AppConfig { static final Uri homeserverList = Uri( scheme: 'https', - host: 'servers.joinmatrix.org', - path: 'servers.json', + host: 'raw.githubusercontent.com', + path: 'krille-chan/fluffychat/refs/heads/main/recommended_homeservers.json', ); static final Uri privacyUrl = Uri( diff --git a/recommended_homeservers.json b/recommended_homeservers.json new file mode 100644 index 00000000..1e263a9a --- /dev/null +++ b/recommended_homeservers.json @@ -0,0 +1,40 @@ +{ + "public_servers": [ + { + "name": "matrix.org", + "description": "The Matrix.org Foundation offers the matrix.org homeserver as an easy entry point for anyone wanting to try out Matrix.", + "reg_method": "oidc", + "languages": [ + "All", + "English" + ] + }, + { + "name": "converser.eu", + "description": "A free and decentralized communication server.", + "reg_method": "oidc", + "languages": [ + "All", + "Français" + ] + }, + { + "name": "mozilla.org", + "description": "Matrix homeserver hosted by Mozilla.", + "reg_method": "oidc", + "languages": [ + "All", + "English" + ] + }, + { + "name": "frei.chat", + "description": "frei.chat was opened on January 23rd, 2022 and enjoys new users every day.", + "reg_method": "oidc", + "languages": [ + "All", + "Deutsch" + ] + } + ] +} \ No newline at end of file From f9d1d4a9caa7fc7dcd2e316c678fd91dda5227f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 09:57:31 +0100 Subject: [PATCH 112/333] chore: Clean up pages build --- .github/workflows/release.yaml | 1 + docs/.well-known/org.flathub.VerifiedApps.txt | 2 -- docs/index.html | 19 ------------------- 3 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 docs/.well-known/org.flathub.VerifiedApps.txt delete mode 100644 docs/index.html diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index de164c05..8899dca0 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -53,6 +53,7 @@ jobs: mkdir public/nightly cp -r build/web/* public/ cp -r build/web/* public/nightly/ + echo "app.fluffy.chat" >> public/CNAME - name: Deploy to GitHub Pages if: startsWith(github.ref, 'refs/tags/v') uses: peaceiris/actions-gh-pages@v4 diff --git a/docs/.well-known/org.flathub.VerifiedApps.txt b/docs/.well-known/org.flathub.VerifiedApps.txt deleted file mode 100644 index a9a5eb47..00000000 --- a/docs/.well-known/org.flathub.VerifiedApps.txt +++ /dev/null @@ -1,2 +0,0 @@ -# im.fluffychat.Fluffychat -8b25b37b-f160-4350-b4f6-9a04554e8f9e \ No newline at end of file diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index e5974b53..00000000 --- a/docs/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Redirecting to fluffy.chat - - - - - -

- Redirecting... -

-

Note: If your browser does not redirect you, please use this link: -

- https://fluffy.chat - - - \ No newline at end of file From c4122f7ac1d05e7093159841fad20fb94e13a81c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 09:59:25 +0100 Subject: [PATCH 113/333] chore: Follow up add default homeserver --- lib/pages/sign_in/view_model/sign_in_view_model.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart index 55ff005c..fefa29d3 100644 --- a/lib/pages/sign_in/view_model/sign_in_view_model.dart +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -75,13 +75,13 @@ class SignInViewModel extends ValueNotifier { publicHomeservers.sort(sortHomeservers); - final defaultServer = - publicHomeservers.singleWhereOrNull( - (server) => server.name == AppSettings.defaultHomeserver.value, - ) ?? - defaultHomeserverData; + final defaultServer = publicHomeservers.singleWhereOrNull( + (server) => server.name == AppSettings.defaultHomeserver.value, + ); - publicHomeservers.insert(0, defaultServer); + if (defaultServer == null) { + publicHomeservers.insert(0, defaultHomeserverData); + } value = value.copyWith( selectedHomeserver: value.selectedHomeserver ?? publicHomeservers.first, From 67218a0acb6ab275f9e50782138e30cc9239b4a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 10:00:36 +0100 Subject: [PATCH 114/333] chore: Only show confirm dialog once --- lib/pages/sign_in/view_model/flows/oidc_login.dart | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/lib/pages/sign_in/view_model/flows/oidc_login.dart b/lib/pages/sign_in/view_model/flows/oidc_login.dart index 38ffd4b3..be496af2 100644 --- a/lib/pages/sign_in/view_model/flows/oidc_login.dart +++ b/lib/pages/sign_in/view_model/flows/oidc_login.dart @@ -7,9 +7,7 @@ import 'package:universal_html/html.dart' as html; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; Future oidcLoginFlow( Client client, @@ -62,17 +60,6 @@ Future oidcLoginFlow( prompt: signUp ? 'create' : null, ); - if (!PlatformInfos.isMobile && !PlatformInfos.isMacOS) { - final consent = await showOkCancelAlertDialog( - context: context, - title: L10n.of( - context, - ).appWantsToUseForLogin(client.homeserver!.toString()), - message: L10n.of(context).appWantsToUseForLoginDescription, - okLabel: L10n.of(context).continueText, - ); - if (consent != OkCancelResult.ok) return; - } if (!context.mounted) return; final returnUrlString = await FlutterWebAuth2.authenticate( From 2ac1193889436d8ff44d4ad2f0effaccfe137cce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 10:15:00 +0100 Subject: [PATCH 115/333] chore: Remove frei.chat from homeserver list --- recommended_homeservers.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/recommended_homeservers.json b/recommended_homeservers.json index 1e263a9a..0dafd695 100644 --- a/recommended_homeservers.json +++ b/recommended_homeservers.json @@ -26,15 +26,6 @@ "All", "English" ] - }, - { - "name": "frei.chat", - "description": "frei.chat was opened on January 23rd, 2022 and enjoys new users every day.", - "reg_method": "oidc", - "languages": [ - "All", - "Deutsch" - ] } ] } \ No newline at end of file From 8998d5600a0df8a4dfd7a6f90afc5df0e03637e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 10:20:28 +0100 Subject: [PATCH 116/333] chore: Update recommended homeservers --- recommended_homeservers.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/recommended_homeservers.json b/recommended_homeservers.json index 0dafd695..ec2f3dc7 100644 --- a/recommended_homeservers.json +++ b/recommended_homeservers.json @@ -2,6 +2,7 @@ "public_servers": [ { "name": "matrix.org", + "website": "https://matrix.org", "description": "The Matrix.org Foundation offers the matrix.org homeserver as an easy entry point for anyone wanting to try out Matrix.", "reg_method": "oidc", "languages": [ @@ -11,6 +12,7 @@ }, { "name": "converser.eu", + "website": "https://converser.eu", "description": "A free and decentralized communication server.", "reg_method": "oidc", "languages": [ @@ -20,12 +22,22 @@ }, { "name": "mozilla.org", + "website": "https://mozilla.org", "description": "Matrix homeserver hosted by Mozilla.", "reg_method": "oidc", "languages": [ "All", "English" ] + }, + { + "name": "magdeburg.jetzt", + "website": "https://magdeburg.jetzt", + "reg_method": "oidc", + "languages": [ + "All", + "Deutsch" + ] } ] } \ No newline at end of file From df847abbebc3865a1979cd28c9ca53abe37c0091 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 10:47:58 +0100 Subject: [PATCH 117/333] feat: OIDC Login on same page --- lib/config/routes.dart | 11 +- lib/pages/intro/intro_page.dart | 171 +++++++++++------- lib/pages/intro/intro_page_presenter.dart | 97 ++++++++++ .../sign_in/view_model/flows/oidc_login.dart | 27 ++- .../oidc_session_json_extension.dart | 24 +++ 5 files changed, 252 insertions(+), 78 deletions(-) create mode 100644 lib/pages/intro/intro_page_presenter.dart create mode 100644 lib/utils/matrix_sdk_extensions/oidc_session_json_extension.dart diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 60e78878..451b1b66 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -17,7 +17,7 @@ import 'package:fluffychat/pages/chat_members/chat_members.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart'; import 'package:fluffychat/pages/chat_search/chat_search_page.dart'; import 'package:fluffychat/pages/device_settings/device_settings.dart'; -import 'package:fluffychat/pages/intro/intro_page.dart'; +import 'package:fluffychat/pages/intro/intro_page_presenter.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart'; import 'package:fluffychat/pages/login/login.dart'; import 'package:fluffychat/pages/new_group/new_group.dart'; @@ -68,7 +68,7 @@ abstract class AppRoutes { GoRoute( path: '/home', pageBuilder: (context, state) => - defaultPageBuilder(context, state, const IntroPage()), + defaultPageBuilder(context, state, const IntroPagePresenter()), redirect: loggedInRedirect, routes: [ GoRoute( @@ -263,8 +263,11 @@ abstract class AppRoutes { GoRoute( path: 'addaccount', redirect: loggedOutRedirect, - pageBuilder: (context, state) => - defaultPageBuilder(context, state, const IntroPage()), + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + const IntroPagePresenter(), + ), routes: [ GoRoute( path: 'sign_in', diff --git a/lib/pages/intro/intro_page.dart b/lib/pages/intro/intro_page.dart index d973ae14..3b321add 100644 --- a/lib/pages/intro/intro_page.dart +++ b/lib/pages/intro/intro_page.dart @@ -13,7 +13,14 @@ import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; import 'package:fluffychat/widgets/matrix.dart'; class IntroPage extends StatelessWidget { - const IntroPage({super.key}); + final bool isLoading; + final String? loggingInToHomeserver; + + const IntroPage({ + required this.isLoading, + required this.loggingInToHomeserver, + super.key, + }); @override Widget build(BuildContext context) { @@ -21,6 +28,7 @@ class IntroPage extends StatelessWidget { final addMultiAccount = Matrix.of( context, ).widget.clients.any((client) => client.isLogged()); + final loggingInToHomeserver = this.loggingInToHomeserver; return LoginScaffold( appBar: AppBar( @@ -35,7 +43,7 @@ class IntroPage extends StatelessWidget { useRootNavigator: true, itemBuilder: (_) => [ PopupMenuItem( - onTap: () => restoreBackupFlow(context), + onTap: isLoading ? null : () => restoreBackupFlow(context), child: Row( mainAxisSize: .min, children: [ @@ -71,87 +79,110 @@ class IntroPage extends StatelessWidget { ), ], ), - body: LayoutBuilder( - builder: (context, constraints) { - return SingleChildScrollView( - child: ConstrainedBox( - constraints: BoxConstraints(minHeight: constraints.maxHeight), - child: IntrinsicHeight( - child: Column( - children: [ - Container( - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Hero( - tag: 'info-logo', - child: Image.asset( - './assets/banner_transparent.png', - fit: BoxFit.fitWidth, - ), - ), + body: isLoading + ? Center( + child: Column( + mainAxisAlignment: .center, + children: [ + CircularProgressIndicator.adaptive(), + if (loggingInToHomeserver != null) + Text(L10n.of(context).logInTo(loggingInToHomeserver)), + ], + ), + ) + : LayoutBuilder( + builder: (context, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, ), - const SizedBox(height: 32), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 32.0), - child: SelectableLinkify( - text: L10n.of(context).appIntro, - textScaleFactor: MediaQuery.textScalerOf( - context, - ).scale(1), - textAlign: TextAlign.center, - linkStyle: TextStyle( - color: theme.colorScheme.secondary, - decorationColor: theme.colorScheme.secondary, - ), - onOpen: (link) => launchUrlString(link.url), - ), - ), - const Spacer(), - Padding( - padding: const EdgeInsets.all(32.0), + child: IntrinsicHeight( child: Column( - mainAxisSize: .min, - crossAxisAlignment: .stretch, children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: theme.colorScheme.secondary, - foregroundColor: theme.colorScheme.onSecondary, + Container( + alignment: Alignment.center, + padding: const EdgeInsets.symmetric( + horizontal: 8.0, ), - onPressed: () => context.go( - '${GoRouterState.of(context).uri.path}/sign_up', + child: Hero( + tag: 'info-logo', + child: Image.asset( + './assets/banner_transparent.png', + fit: BoxFit.fitWidth, + ), ), - child: Text(L10n.of(context).createNewAccount), ), - SizedBox(height: 16), - ElevatedButton( - onPressed: () => context.go( - '${GoRouterState.of(context).uri.path}/sign_in', + const SizedBox(height: 32), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 32.0, ), - child: Text(L10n.of(context).signIn), - ), - TextButton( - onPressed: () async { - final client = await Matrix.of( + child: SelectableLinkify( + text: L10n.of(context).appIntro, + textScaleFactor: MediaQuery.textScalerOf( context, - ).getLoginClient(); - context.go( - '${GoRouterState.of(context).uri.path}/login', - extra: client, - ); - }, - child: Text(L10n.of(context).loginWithMatrixId), + ).scale(1), + textAlign: TextAlign.center, + linkStyle: TextStyle( + color: theme.colorScheme.secondary, + decorationColor: theme.colorScheme.secondary, + ), + onOpen: (link) => launchUrlString(link.url), + ), + ), + const Spacer(), + Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: .min, + crossAxisAlignment: .stretch, + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + theme.colorScheme.secondary, + foregroundColor: + theme.colorScheme.onSecondary, + ), + onPressed: () => context.go( + '${GoRouterState.of(context).uri.path}/sign_up', + ), + child: Text( + L10n.of(context).createNewAccount, + ), + ), + SizedBox(height: 16), + ElevatedButton( + onPressed: () => context.go( + '${GoRouterState.of(context).uri.path}/sign_in', + ), + child: Text(L10n.of(context).signIn), + ), + TextButton( + onPressed: () async { + final client = await Matrix.of( + context, + ).getLoginClient(); + context.go( + '${GoRouterState.of(context).uri.path}/login', + extra: client, + ); + }, + child: Text( + L10n.of(context).loginWithMatrixId, + ), + ), + ], + ), ), ], ), ), - ], - ), - ), + ), + ); + }, ), - ); - }, - ), ); } } diff --git a/lib/pages/intro/intro_page_presenter.dart b/lib/pages/intro/intro_page_presenter.dart new file mode 100644 index 00000000..1f7bdebe --- /dev/null +++ b/lib/pages/intro/intro_page_presenter.dart @@ -0,0 +1,97 @@ +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix_api_lite/utils/logs.dart'; +import 'package:matrix/msc_extensions/msc_2964_oidc_login_flow/msc_2964_oidc_login_flow.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/universal_html.dart' as web; + +import 'package:fluffychat/pages/intro/intro_page.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart'; +import 'package:fluffychat/widgets/matrix.dart'; + +class IntroPagePresenter extends StatefulWidget { + const IntroPagePresenter({super.key}); + + @override + State createState() => _IntroPagePresenterState(); +} + +class _IntroPagePresenterState extends State { + bool isLoading = kIsWeb; + String? loggingInToHomeserver; + + @override + void initState() { + super.initState(); + + if (kIsWeb) _finishOidcLogin(); + } + + void _finishOidcLogin() async { + final store = await SharedPreferences.getInstance(); + final storedHomeserverString = store.getString( + OidcSessionJsonExtension.homeserverStoreKey, + ); + final homeserverUrl = storedHomeserverString == null + ? null + : Uri.tryParse(storedHomeserverString); + + final oidcSessionString = store.getString( + OidcSessionJsonExtension.storeKey, + ); + final session = oidcSessionString == null + ? null + : OidcSessionJsonExtension.fromJson(jsonDecode(oidcSessionString)); + + await store.remove(OidcSessionJsonExtension.storeKey); + await store.remove(OidcSessionJsonExtension.homeserverStoreKey); + + if (homeserverUrl == null || session == null) { + setState(() { + isLoading = false; + }); + return; + } + setState(() { + loggingInToHomeserver = homeserverUrl.origin; + }); + + try { + final returnUrl = Uri.parse(web.window.location.href); + final queryParameters = returnUrl.hasFragment + ? Uri.parse(returnUrl.fragment).queryParameters + : returnUrl.queryParameters; + final code = queryParameters['code'] as String; + final state = queryParameters['state'] as String; + + final client = await Matrix.of(context).getLoginClient(); + await client.checkHomeserver(homeserverUrl); + await client.oidcLogin(session: session, code: code, state: state); + } catch (e, s) { + Logs().w('Unable to login via OIDC', e, s); + if (mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + } + } finally { + if (mounted) { + setState(() { + isLoading = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { + return IntroPage( + isLoading: isLoading, + loggingInToHomeserver: loggingInToHomeserver, + ); + } +} diff --git a/lib/pages/sign_in/view_model/flows/oidc_login.dart b/lib/pages/sign_in/view_model/flows/oidc_login.dart index be496af2..02e16eb0 100644 --- a/lib/pages/sign_in/view_model/flows/oidc_login.dart +++ b/lib/pages/sign_in/view_model/flows/oidc_login.dart @@ -1,12 +1,16 @@ +import 'dart:convert'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:universal_html/html.dart' as html; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; Future oidcLoginFlow( @@ -16,9 +20,7 @@ Future oidcLoginFlow( ) async { Logs().i('Starting Matrix Native OIDC Flow...'); final redirectUrl = kIsWeb - ? Uri.parse( - html.window.location.href, - ).resolveUri(Uri(pathSegments: ['auth.html'])) + ? Uri.parse(html.window.location.href).resolveUri(Uri(query: '')) : (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) ? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login') : Uri.parse('http://localhost:3001/login'); @@ -62,11 +64,28 @@ Future oidcLoginFlow( if (!context.mounted) return; + if (kIsWeb) { + final store = await SharedPreferences.getInstance(); + store.setString( + OidcSessionJsonExtension.homeserverStoreKey, + client.homeserver!.toString(), + ); + store.setString( + OidcSessionJsonExtension.storeKey, + jsonEncode(session.toJson()), + ); + } + final returnUrlString = await FlutterWebAuth2.authenticate( url: session.authenticationUri.toString(), callbackUrlScheme: urlScheme, - options: FlutterWebAuth2Options(useWebview: PlatformInfos.isMobile), + options: FlutterWebAuth2Options( + useWebview: PlatformInfos.isMobile, + windowName: '_self', + ), ); + if (kIsWeb) return; // On Web we return at intro page when app starts again! + final returnUrl = Uri.parse(returnUrlString); final queryParameters = returnUrl.hasFragment ? Uri.parse(returnUrl.fragment).queryParameters diff --git a/lib/utils/matrix_sdk_extensions/oidc_session_json_extension.dart b/lib/utils/matrix_sdk_extensions/oidc_session_json_extension.dart new file mode 100644 index 00000000..90fb9911 --- /dev/null +++ b/lib/utils/matrix_sdk_extensions/oidc_session_json_extension.dart @@ -0,0 +1,24 @@ +import 'package:matrix/matrix.dart'; + +extension OidcSessionJsonExtension on OidcLoginSession { + static const String storeKey = 'oidc_session'; + static const String homeserverStoreKey = 'oidc_stored_homeserver'; + Map toJson() => { + 'oidc_client_data': oidcClientData.toJson(), + 'authentication_uri': authenticationUri.toString(), + 'redirect_uri': redirectUri.toString(), + 'code_verifier': codeVerifier, + 'state': state, + }; + + static OidcLoginSession fromJson(Map json) => + OidcLoginSession( + oidcClientData: OidcClientData.fromJson( + json['oidc_client_data'] as Map, + ), + authenticationUri: Uri.parse(json['authentication_uri'] as String), + redirectUri: Uri.parse(json['redirect_uri'] as String), + codeVerifier: json['code_verifier'] as String, + state: json['state'] as String, + ); +} From e9efce150e20324b6c4262bf34e3be9132bba5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 11:14:45 +0100 Subject: [PATCH 118/333] feat: Add presetHomeserver config to enforce a homeserver for web --- config.sample.json | 2 + lib/config/setting_keys.dart | 4 +- lib/pages/intro/intro_page.dart | 69 ++++++++++--------- lib/pages/intro/intro_page_presenter.dart | 26 +++++++ lib/pages/sign_in/sign_in_page.dart | 2 +- .../flows => utils}/sort_homeservers.dart | 0 .../view_model/sign_in_view_model.dart | 2 +- .../sign_in_flows}/check_homeserver.dart | 4 +- .../sign_in_flows}/oidc_login.dart | 0 .../sign_in_flows}/sso_login.dart | 0 macos/Podfile.lock | 17 ++--- 11 files changed, 77 insertions(+), 49 deletions(-) rename lib/pages/sign_in/{view_model/flows => utils}/sort_homeservers.dart (100%) rename lib/{pages/sign_in/view_model/flows => utils/sign_in_flows}/check_homeserver.dart (94%) rename lib/{pages/sign_in/view_model/flows => utils/sign_in_flows}/oidc_login.dart (100%) rename lib/{pages/sign_in/view_model/flows => utils/sign_in_flows}/sso_login.dart (100%) diff --git a/config.sample.json b/config.sample.json index 5aa0a4bb..a1ea6f6f 100644 --- a/config.sample.json +++ b/config.sample.json @@ -1,6 +1,8 @@ { "applicationName": "FluffyChat", "defaultHomeserver": "matrix.org", + "presetHomeserver": "", + "welcomeText": "", "privacyUrl": "https://github.com/krille-chan/fluffychat/blob/main/PRIVACY.md", "audioRecordingNumChannels": 1, "audioRecordingAutoGain": true, diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 7011e864..da1b3bbf 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -52,7 +52,9 @@ enum AppSettings { // colorSchemeSeed stored as ARGB int colorSchemeSeedInt('chat.fluffy.color_scheme_seed', 0xFF5625BA), emojiSuggestionLocale('emoji_suggestion_locale', ''), - enableSoftLogout('chat.fluffy.enable_soft_logout', false); + enableSoftLogout('chat.fluffy.enable_soft_logout', false), + presetHomeserver('chat.fluffy.preset_homeserver', ''), + welcomeText('chat.fluffy.welcome_text', ''); final String key; final T defaultValue; diff --git a/lib/pages/intro/intro_page.dart b/lib/pages/intro/intro_page.dart index 3b321add..46fd7e5d 100644 --- a/lib/pages/intro/intro_page.dart +++ b/lib/pages/intro/intro_page.dart @@ -13,13 +13,17 @@ import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; import 'package:fluffychat/widgets/matrix.dart'; class IntroPage extends StatelessWidget { - final bool isLoading; - final String? loggingInToHomeserver; + final bool isLoading, hasPresetHomeserver; + final String? loggingInToHomeserver, welcomeText; + final VoidCallback login; const IntroPage({ required this.isLoading, required this.loggingInToHomeserver, super.key, + required this.hasPresetHomeserver, + required this.welcomeText, + required this.login, }); @override @@ -119,7 +123,7 @@ class IntroPage extends StatelessWidget { horizontal: 32.0, ), child: SelectableLinkify( - text: L10n.of(context).appIntro, + text: welcomeText ?? L10n.of(context).appIntro, textScaleFactor: MediaQuery.textScalerOf( context, ).scale(1), @@ -138,41 +142,42 @@ class IntroPage extends StatelessWidget { mainAxisSize: .min, crossAxisAlignment: .stretch, children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: - theme.colorScheme.secondary, - foregroundColor: - theme.colorScheme.onSecondary, + if (!hasPresetHomeserver) + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + theme.colorScheme.secondary, + foregroundColor: + theme.colorScheme.onSecondary, + ), + onPressed: () => context.go( + '${GoRouterState.of(context).uri.path}/sign_up', + ), + child: Text( + L10n.of(context).createNewAccount, + ), ), - onPressed: () => context.go( - '${GoRouterState.of(context).uri.path}/sign_up', - ), - child: Text( - L10n.of(context).createNewAccount, - ), - ), SizedBox(height: 16), ElevatedButton( - onPressed: () => context.go( - '${GoRouterState.of(context).uri.path}/sign_in', - ), + onPressed: login, child: Text(L10n.of(context).signIn), ), - TextButton( - onPressed: () async { - final client = await Matrix.of( - context, - ).getLoginClient(); - context.go( - '${GoRouterState.of(context).uri.path}/login', - extra: client, - ); - }, - child: Text( - L10n.of(context).loginWithMatrixId, + + if (!hasPresetHomeserver) + TextButton( + onPressed: () async { + final client = await Matrix.of( + context, + ).getLoginClient(); + context.go( + '${GoRouterState.of(context).uri.path}/login', + extra: client, + ); + }, + child: Text( + L10n.of(context).loginWithMatrixId, + ), ), - ), ], ), ), diff --git a/lib/pages/intro/intro_page_presenter.dart b/lib/pages/intro/intro_page_presenter.dart index 1f7bdebe..dad35f34 100644 --- a/lib/pages/intro/intro_page_presenter.dart +++ b/lib/pages/intro/intro_page_presenter.dart @@ -3,14 +3,18 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix_api_lite/utils/logs.dart'; import 'package:matrix/msc_extensions/msc_2964_oidc_login_flow/msc_2964_oidc_login_flow.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:universal_html/universal_html.dart' as web; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/pages/intro/intro_page.dart'; +import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart'; +import 'package:fluffychat/utils/sign_in_flows/check_homeserver.dart'; import 'package:fluffychat/widgets/matrix.dart'; class IntroPagePresenter extends StatefulWidget { @@ -49,11 +53,13 @@ class _IntroPagePresenterState extends State { await store.remove(OidcSessionJsonExtension.storeKey); await store.remove(OidcSessionJsonExtension.homeserverStoreKey); + if (!mounted) return; if (homeserverUrl == null || session == null) { setState(() { isLoading = false; }); + return; } setState(() { @@ -87,11 +93,31 @@ class _IntroPagePresenterState extends State { } } + void _login() { + final presetHomeserver = AppSettings.presetHomeserver.value; + if (presetHomeserver.isEmpty) { + context.go('${GoRouterState.of(context).uri.path}/sign_in'); + return; + } + + connectToHomeserverFlow( + PublicHomeserverData(name: presetHomeserver), + context, + (snapshot) {}, + false, + ); + } + @override Widget build(BuildContext context) { return IntroPage( isLoading: isLoading, loggingInToHomeserver: loggingInToHomeserver, + hasPresetHomeserver: AppSettings.presetHomeserver.value.isNotEmpty, + welcomeText: AppSettings.welcomeText.value.isEmpty + ? null + : AppSettings.welcomeText.value, + login: _login, ); } } diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index 0b353065..b2952952 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -5,10 +5,10 @@ import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pages/sign_in/view_model/flows/check_homeserver.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/pages/sign_in/view_model/sign_in_view_model.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:fluffychat/utils/sign_in_flows/check_homeserver.dart'; import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/view_model_builder.dart'; diff --git a/lib/pages/sign_in/view_model/flows/sort_homeservers.dart b/lib/pages/sign_in/utils/sort_homeservers.dart similarity index 100% rename from lib/pages/sign_in/view_model/flows/sort_homeservers.dart rename to lib/pages/sign_in/utils/sort_homeservers.dart diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart index fefa29d3..23d0028f 100644 --- a/lib/pages/sign_in/view_model/sign_in_view_model.dart +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -7,7 +7,7 @@ import 'package:matrix/matrix_api_lite/utils/logs.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/pages/sign_in/view_model/flows/sort_homeservers.dart'; +import 'package:fluffychat/pages/sign_in/utils/sort_homeservers.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/pages/sign_in/view_model/sign_in_state.dart'; import 'package:fluffychat/widgets/matrix.dart'; diff --git a/lib/pages/sign_in/view_model/flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart similarity index 94% rename from lib/pages/sign_in/view_model/flows/check_homeserver.dart rename to lib/utils/sign_in_flows/check_homeserver.dart index a7ddb206..bd822c99 100644 --- a/lib/pages/sign_in/view_model/flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -5,11 +5,11 @@ import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/pages/sign_in/view_model/flows/oidc_login.dart'; -import 'package:fluffychat/pages/sign_in/view_model/flows/sso_login.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/sign_in_flows/oidc_login.dart'; +import 'package:fluffychat/utils/sign_in_flows/sso_login.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; diff --git a/lib/pages/sign_in/view_model/flows/oidc_login.dart b/lib/utils/sign_in_flows/oidc_login.dart similarity index 100% rename from lib/pages/sign_in/view_model/flows/oidc_login.dart rename to lib/utils/sign_in_flows/oidc_login.dart diff --git a/lib/pages/sign_in/view_model/flows/sso_login.dart b/lib/utils/sign_in_flows/sso_login.dart similarity index 100% rename from lib/pages/sign_in/view_model/flows/sso_login.dart rename to lib/utils/sign_in_flows/sso_login.dart diff --git a/macos/Podfile.lock b/macos/Podfile.lock index ce2bf67b..3bc9e932 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -40,10 +40,7 @@ PODS: - FlutterMacOS - package_info_plus (0.0.1): - FlutterMacOS - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - record_macos (1.1.0): + - record_macos (1.2.0): - FlutterMacOS - screen_retriever_macos (0.0.1): - FlutterMacOS @@ -98,7 +95,6 @@ DEPENDENCIES: - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin`) - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/darwin`) - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - record_macos (from `Flutter/ephemeral/.symlinks/plugins/record_macos/macos`) - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) @@ -156,8 +152,6 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/just_audio/darwin package_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos - path_provider_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin record_macos: :path: Flutter/ephemeral/.symlinks/plugins/record_macos/macos screen_retriever_macos: @@ -203,16 +197,15 @@ SPEC CHECKSUMS: geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed package_info_plus: f0052d280d17aa382b932f399edf32507174e870 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - record_macos: 43194b6c06ca6f8fa132e2acea72b202b92a0f5b + record_macos: 7f227161b93c49e7e34fe681c5891c8622c8cc8b screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f share_plus: 510bf0af1a42cd602274b4629920c9649c52f4cc - shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb SQLCipher: eb79c64049cb002b4e9fcb30edb7979bf4706dfc sqlcipher_flutter_libs: 01ead34db27ae5e49987cae46c8a34199eb22cfe - url_launcher_macos: 0fba8ddabfc33ce0a9afe7c5fef5aab3d8d2d673 + url_launcher_macos: f87a979182d112f911de6820aefddaf56ee9fbfd video_compress: 752b161da855df2492dd1a8fa899743cc8fe9534 - video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b + video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a wakelock_plus: 917609be14d812ddd9e9528876538b2263aaa03b webcrypto: a5f5eb3e375cf0a99993e207e97cdcab5c94ce2e WebRTC-SDK: 40d4f5ba05cadff14e4db5614aec402a633f007e From bed0a89d65d3995f45b39358f5e489df9e51be24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 12:12:45 +0100 Subject: [PATCH 119/333] chore: Fix oidc login on web --- lib/utils/sign_in_flows/oidc_login.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils/sign_in_flows/oidc_login.dart b/lib/utils/sign_in_flows/oidc_login.dart index 02e16eb0..3dac7079 100644 --- a/lib/utils/sign_in_flows/oidc_login.dart +++ b/lib/utils/sign_in_flows/oidc_login.dart @@ -20,7 +20,7 @@ Future oidcLoginFlow( ) async { Logs().i('Starting Matrix Native OIDC Flow...'); final redirectUrl = kIsWeb - ? Uri.parse(html.window.location.href).resolveUri(Uri(query: '')) + ? Uri.parse(html.window.location.href.split('#').first.split('?').first) : (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) ? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login') : Uri.parse('http://localhost:3001/login'); From bfbcd31f352f3ce4e6dfcdd0c45ee56bd5610f29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 12:27:58 +0100 Subject: [PATCH 120/333] chore: Sanitize hash param for oidc --- lib/main.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index d173f77e..62355e51 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'dart:isolate'; import 'dart:ui'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; @@ -8,6 +9,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; import 'package:matrix/matrix.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/universal_html.dart' as web; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/client_manager.dart'; @@ -30,6 +32,14 @@ void main() async { await waitForPushIsolateDone(); } + // Sanitize hash for OIDC: + if (kIsWeb) { + final hash = web.window.location.hash; + if (hash.isNotEmpty && !hash.startsWith('/')) { + web.window.location.hash = hash.replaceFirst('#', '#?'); + } + } + // Our background push shared isolate accesses flutter-internal things very early in the startup proccess // To make sure that the parts of flutter needed are started up already, we need to ensure that the // widget bindings are initialized already. From 9f5794004e85e6d08ef20abbbfb805d1df9cdf0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 12:31:35 +0100 Subject: [PATCH 121/333] chore: Hide homepage button if not preset --- lib/pages/sign_in/sign_in_page.dart | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index b2952952..b1fbf731 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -91,6 +91,7 @@ class SignInPage extends StatelessWidget { itemCount: publicHomeservers.length, itemBuilder: (context, i) { final server = publicHomeservers[i]; + final homepage = server.homepage; return RadioListTile.adaptive( value: server, radioScaleFactor: @@ -104,19 +105,18 @@ class SignInPage extends StatelessWidget { title: Row( children: [ Expanded(child: Text(server.name ?? 'Unknown')), - SizedBox.square( - dimension: 32, - child: IconButton( - icon: const Icon( - Icons.open_in_new_outlined, - size: 16, - ), - onPressed: () => launchUrlString( - server.homepage ?? - 'https://${server.name}', + if (homepage != null) + SizedBox.square( + dimension: 32, + child: IconButton( + icon: const Icon( + Icons.open_in_new_outlined, + size: 16, + ), + onPressed: () => + launchUrlString(homepage), ), ), - ), ], ), subtitle: Column( From 9873c7699b4d504fde6aebf20a82809a1b0283c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 12:32:55 +0100 Subject: [PATCH 122/333] chore: Add missing localization --- lib/l10n/intl_en.arb | 3 ++- lib/pages/sign_in/sign_in_page.dart | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index b455b035..42a185b2 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -3497,5 +3497,6 @@ "signInGreeting": "You already have an account in Matrix? Welcome back! Select your homeserver and sign in.", "appIntro": "With FluffyChat you can chat with your friends. It's a secure decentralized [matrix] messenger! Learn more on https://matrix.org if you like or just sign up.", "theProcessWasCanceled": "The process was canceled.", - "join": "Join" + "join": "Join", + "searchOrEnterHomeserverAddress": "Search or enter homeserver address" } diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index b1fbf731..e86d39bb 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -69,7 +69,9 @@ class SignInPage extends StatelessWidget { errorText: state.publicHomeservers.error ?.toLocalizedString(context), prefixIcon: const Icon(Icons.search_outlined), - hintText: 'Search or enter homeserver address', + hintText: L10n.of( + context, + ).searchOrEnterHomeserverAddress, ), ), ], From 75db25874a9b247ca4f41e85bc7f4985e78c1ddd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Feb 2026 12:34:31 +0100 Subject: [PATCH 123/333] chore: Update matrix ID localization --- lib/l10n/intl_en.arb | 3 ++- lib/pages/login/login_view.dart | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 42a185b2..eef06b29 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -3498,5 +3498,6 @@ "appIntro": "With FluffyChat you can chat with your friends. It's a secure decentralized [matrix] messenger! Learn more on https://matrix.org if you like or just sign up.", "theProcessWasCanceled": "The process was canceled.", "join": "Join", - "searchOrEnterHomeserverAddress": "Search or enter homeserver address" + "searchOrEnterHomeserverAddress": "Search or enter homeserver address", + "matrixId": "Matrix ID" } diff --git a/lib/pages/login/login_view.dart b/lib/pages/login/login_view.dart index ca13ac21..f0352640 100644 --- a/lib/pages/login/login_view.dart +++ b/lib/pages/login/login_view.dart @@ -56,7 +56,7 @@ class LoginView extends StatelessWidget { errorText: controller.usernameError, errorStyle: const TextStyle(color: Colors.orange), hintText: '@username:domain', - labelText: L10n.of(context).emailOrUsername, + labelText: L10n.of(context).matrixId, ), ), ), From 8e4b4f1338d02a74839c6d749e4b3ed1e8374385 Mon Sep 17 00:00:00 2001 From: Artem Pereverzev Date: Sun, 22 Feb 2026 19:55:50 +0100 Subject: [PATCH 124/333] chore(translations): Translated using Weblate (Russian) Currently translated at 97.5% (820 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ru/ --- lib/l10n/intl_ru.arb | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 626e6f3d..710b1c2c 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -3023,5 +3023,35 @@ "setupChatBackup": "Настроить резервную копию чата", "createNewAccount": "Создать новый аккаунт", "theProcessWasCanceled": "Процесс был отменен.", - "noMoreResultsFound": "Ничего не найдено" + "noMoreResultsFound": "Ничего не найдено", + "countChatsAndCountParticipants": "{chats} чатов и {participants} участников", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "countInvited": "{count} приглашенных", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "loadCountMoreParticipants": "Загрузить ещё {count} участников", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + } } From 278bd2580e2611d90848d1559d73d328380c07d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Sun, 22 Feb 2026 18:44:06 +0100 Subject: [PATCH 125/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 53.5% (450 of 841 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index f8604fda..fda3960f 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1763,5 +1763,31 @@ } } }, - "noPublicLinkHasBeenCreatedYet": "Werɛad ur d-yennulfa ula d yiwen n wassaɣ azayez" + "noPublicLinkHasBeenCreatedYet": "Werɛad ur d-yennulfa ula d yiwen n wassaɣ azayez", + "users": "Iseqdacen", + "unlockOldMessages": "Kkes asekkeṛ i yiznan iqbuṛen", + "storeInSecureStorageDescription": "Ḥrez tasarut n tririt deg usekles aɣelsan n yibenk-a.", + "saveKeyManuallyDescription": "Sekles tasarut-agi s ufus deg udiwenni n beṭṭu n unagraw neɣ ɣef tecfawit.", + "storeInAndroidKeystore": "Sekles deg Android KeyStore", + "storeInAppleKeyChain": "Sekles deg uzrar n tsura n Apple", + "storeSecurlyOnThisDevice": "Ḥrez s wudem aɣelsan ɣef yibenk-a", + "countFiles": "{count} n yifuyla", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "Aseqdac", + "custom": "Yugnen", + "foregroundServiceRunning": "Alɣu-agi yettban-d ticki ameẓlu n uɣawas amezwaru iteddu.", + "screenSharingTitle": "beṭṭu n ugdil", + "screenSharingDetail": "Tbeṭṭuḍ agdil-ik·im deg FluffyChat", + "callingPermissions": "Tisirag n usiwel", + "callingAccount": "amiḍan n usiwel", + "callingAccountDetails": "Sireg FluffyChat ad iseqdec asnas aneṣli n Android i usɛeddi n usiwel.", + "appearOnTop": "Sbeqeḍ deg uksawen", + "otherCallingPermissions": "Tisirag n umikrufun, takamiṛat akked tiyaḍ n FluffyChat", + "whyIsThisMessageEncrypted": "Acuɣer izen-agi ur yettwaɣri ara?" } From e82438975b29264b7652e2d18ba2f510f33b3f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 23 Feb 2026 10:33:08 +0100 Subject: [PATCH 126/333] build: Check for commented code in CI --- .github/workflows/integrate.yaml | 13 ++++++++++--- lib/widgets/matrix.dart | 2 -- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 35d8d55f..f600c2f3 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -25,13 +25,20 @@ jobs: - name: Check license compliance run: dart run license_checker check-licenses -c licenses.yaml --problematic - run: flutter analyze + - run: dart run dart_code_linter:metrics check-unused-code lib + - run: dart run dart_code_linter:metrics check-unused-files lib + - run: dart run dart_code_linter:metrics check-unused-l10n lib + - name: Check for commented-out Dart code with semicolons + run: | + if grep -R --include="*.dart" -nE '^[[:space:]]*//[^/<].*;[[:space:]]*$' lib/; then + echo "" + echo "❌ Found commented-out Dart code ending with semicolon." + exit 1 + fi - name: Add Firebase Messaging run: ./scripts/add-firebase-messaging.sh - run: flutter analyze - run: flutter test - - run: dart run dart_code_linter:metrics check-unused-code lib - - run: dart run dart_code_linter:metrics check-unused-files lib - - run: dart run dart_code_linter:metrics check-unused-l10n lib build_debug_apk: runs-on: ubuntu-latest diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index fb67822c..3e3fa8ef 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -32,8 +32,6 @@ import '../utils/account_bundles.dart'; import '../utils/background_push.dart'; import 'local_notifications_extension.dart'; -// import 'package:flutter_secure_storage/flutter_secure_storage.dart'; - class Matrix extends StatefulWidget { final Widget? child; From ab976db8e701e9f82dae2e4c1690ff1e868c59d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Feb 2026 09:09:49 +0100 Subject: [PATCH 127/333] refactor: Enable avoid-returning-widgets lint --- analysis_options.yaml | 3 +- lib/pages/chat/chat_view.dart | 227 ++++++------ lib/pages/chat/input_bar.dart | 5 +- lib/pages/dialer/dialer.dart | 453 ++++++++++++------------ lib/utils/markdown_context_builder.dart | 244 +++++++------ lib/widgets/mxc_image.dart | 38 +- 6 files changed, 497 insertions(+), 473 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 6d17e303..82dc170d 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -45,8 +45,6 @@ dart_code_linter: - avoid-unnecessary-conditionals # TODO: # - member-ordering - # - avoid-late-keyword - # - avoid-non-null-assertion # - avoid-global-state # - prefer-match-file-name # - avoid-banned-imports: @@ -61,6 +59,7 @@ dart_code_linter: - prefer-media-query-direct-access - avoid-wrapping-in-padding - prefer-correct-edge-insets-constructor + - avoid-returning-widgets # TODO: # - avoid-returning-widgets # - prefer-single-widget-per-file: diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index 23e0b8ad..2c19524b 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -34,120 +34,6 @@ class ChatView extends StatelessWidget { const ChatView(this.controller, {super.key}); - List _appBarActions(BuildContext context) { - if (controller.selectMode) { - return [ - if (controller.canEditSelectedEvents) - IconButton( - icon: const Icon(Icons.edit_outlined), - tooltip: L10n.of(context).edit, - onPressed: controller.editSelectedEventAction, - ), - if (controller.selectedEvents.length == 1 && - controller.activeThreadId == null && - controller.room.canSendDefaultMessages) - IconButton( - icon: const Icon(Icons.message_outlined), - tooltip: L10n.of(context).replyInThread, - onPressed: () => controller.enterThread( - controller.selectedEvents.single.eventId, - ), - ), - IconButton( - icon: const Icon(Icons.copy_outlined), - tooltip: L10n.of(context).copyToClipboard, - onPressed: controller.copyEventsAction, - ), - if (controller.canRedactSelectedEvents) - IconButton( - icon: const Icon(Icons.delete_outlined), - tooltip: L10n.of(context).redactMessage, - onPressed: controller.redactEventsAction, - ), - if (controller.selectedEvents.length == 1) - PopupMenuButton<_EventContextAction>( - useRootNavigator: true, - onSelected: (action) { - switch (action) { - case _EventContextAction.info: - controller.showEventInfo(); - controller.clearSelectedEvents(); - break; - case _EventContextAction.report: - controller.reportEventAction(); - break; - } - }, - itemBuilder: (context) => [ - if (controller.canPinSelectedEvents) - PopupMenuItem( - onTap: controller.pinEvent, - value: null, - child: Row( - mainAxisSize: .min, - children: [ - const Icon(Icons.push_pin_outlined), - const SizedBox(width: 12), - Text(L10n.of(context).pinMessage), - ], - ), - ), - if (controller.canSaveSelectedEvent) - PopupMenuItem( - onTap: () => controller.saveSelectedEvent(context), - value: null, - child: Row( - mainAxisSize: .min, - children: [ - const Icon(Icons.download_outlined), - const SizedBox(width: 12), - Text(L10n.of(context).downloadFile), - ], - ), - ), - PopupMenuItem( - value: _EventContextAction.info, - child: Row( - mainAxisSize: .min, - children: [ - const Icon(Icons.info_outlined), - const SizedBox(width: 12), - Text(L10n.of(context).messageInfo), - ], - ), - ), - if (controller.selectedEvents.single.status.isSent) - PopupMenuItem( - value: _EventContextAction.report, - child: Row( - mainAxisSize: .min, - children: [ - const Icon(Icons.shield_outlined, color: Colors.red), - const SizedBox(width: 12), - Text(L10n.of(context).reportMessage), - ], - ), - ), - ], - ), - ]; - } else if (!controller.room.isArchived) { - return [ - if (AppSettings.experimentalVoip.value && - Matrix.of(context).voipPlugin != null && - controller.room.isDirectChat) - IconButton( - onPressed: controller.onPhoneButtonTap, - icon: const Icon(Icons.call_outlined), - tooltip: L10n.of(context).placeCall, - ), - EncryptionButton(controller.room), - ChatSettingsPopupMenu(controller.room, true), - ]; - } - return []; - } - @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -238,7 +124,118 @@ class ChatView extends StatelessWidget { ), titleSpacing: FluffyThemes.isColumnMode(context) ? 24 : 0, title: ChatAppBarTitle(controller), - actions: _appBarActions(context), + actions: [ + if (controller.selectMode) ...[ + if (controller.canEditSelectedEvents) + IconButton( + icon: const Icon(Icons.edit_outlined), + tooltip: L10n.of(context).edit, + onPressed: controller.editSelectedEventAction, + ), + if (controller.selectedEvents.length == 1 && + controller.activeThreadId == null && + controller.room.canSendDefaultMessages) + IconButton( + icon: const Icon(Icons.message_outlined), + tooltip: L10n.of(context).replyInThread, + onPressed: () => controller.enterThread( + controller.selectedEvents.single.eventId, + ), + ), + IconButton( + icon: const Icon(Icons.copy_outlined), + tooltip: L10n.of(context).copyToClipboard, + onPressed: controller.copyEventsAction, + ), + if (controller.canRedactSelectedEvents) + IconButton( + icon: const Icon(Icons.delete_outlined), + tooltip: L10n.of(context).redactMessage, + onPressed: controller.redactEventsAction, + ), + if (controller.selectedEvents.length == 1) + PopupMenuButton<_EventContextAction>( + useRootNavigator: true, + onSelected: (action) { + switch (action) { + case _EventContextAction.info: + controller.showEventInfo(); + controller.clearSelectedEvents(); + break; + case _EventContextAction.report: + controller.reportEventAction(); + break; + } + }, + itemBuilder: (context) => [ + if (controller.canPinSelectedEvents) + PopupMenuItem( + onTap: controller.pinEvent, + value: null, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.push_pin_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).pinMessage), + ], + ), + ), + if (controller.canSaveSelectedEvent) + PopupMenuItem( + onTap: () => + controller.saveSelectedEvent(context), + value: null, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.download_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).downloadFile), + ], + ), + ), + PopupMenuItem( + value: _EventContextAction.info, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.info_outlined), + const SizedBox(width: 12), + Text(L10n.of(context).messageInfo), + ], + ), + ), + if (controller.selectedEvents.single.status.isSent) + PopupMenuItem( + value: _EventContextAction.report, + child: Row( + mainAxisSize: .min, + children: [ + const Icon( + Icons.shield_outlined, + color: Colors.red, + ), + const SizedBox(width: 12), + Text(L10n.of(context).reportMessage), + ], + ), + ), + ], + ), + ] else if (!controller.room.isArchived) ...[ + if (AppSettings.experimentalVoip.value && + Matrix.of(context).voipPlugin != null && + controller.room.isDirectChat) + IconButton( + onPressed: controller.onPhoneButtonTap, + icon: const Icon(Icons.call_outlined), + tooltip: L10n.of(context).placeCall, + ), + EncryptionButton(controller.room), + ChatSettingsPopupMenu(controller.room, true), + ], + ], bottom: PreferredSize( preferredSize: Size.fromHeight(appbarBottomHeight), child: Column( diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index de967b58..3c240d30 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -392,7 +392,10 @@ class InputBar extends StatelessWidget { controller: controller, focusNode: focusNode, readOnly: readOnly, - contextMenuBuilder: (c, e) => markdownContextBuilder(c, e, controller), + contextMenuBuilder: (c, e) => MarkdownContextBuilder( + editableTextState: e, + controller: controller, + ), contentInsertionConfiguration: ContentInsertionConfiguration( onContentInserted: (KeyboardInsertedContent content) { final data = content.data; diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index ae2d5655..753312b3 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -339,235 +339,103 @@ class MyCallingPage extends State { } */ - List _buildActionButtons(bool isFloating) { - if (isFloating) { - return []; - } - - final switchCameraButton = FloatingActionButton( - heroTag: 'switchCamera', - onPressed: _switchCamera, - backgroundColor: Colors.black45, - child: const Icon(Icons.switch_camera), - ); - /* - var switchSpeakerButton = FloatingActionButton( - heroTag: 'switchSpeaker', - child: Icon(_speakerOn ? Icons.volume_up : Icons.volume_off), - onPressed: _switchSpeaker, - foregroundColor: Colors.black54, - backgroundColor: Theme.of(widget.context).backgroundColor, - ); - */ - final hangupButton = FloatingActionButton( - heroTag: 'hangup', - onPressed: _hangUp, - tooltip: 'Hangup', - backgroundColor: _state == CallState.kEnded ? Colors.black45 : Colors.red, - child: const Icon(Icons.call_end), - ); - - final answerButton = FloatingActionButton( - heroTag: 'answer', - onPressed: _answerCall, - tooltip: 'Answer', - backgroundColor: Colors.green, - child: const Icon(Icons.phone), - ); - - final muteMicButton = FloatingActionButton( - heroTag: 'muteMic', - onPressed: _muteMic, - foregroundColor: isMicrophoneMuted ? Colors.black26 : Colors.white, - backgroundColor: isMicrophoneMuted ? Colors.white : Colors.black45, - child: Icon(isMicrophoneMuted ? Icons.mic_off : Icons.mic), - ); - - final screenSharingButton = FloatingActionButton( - heroTag: 'screenSharing', - onPressed: _screenSharing, - foregroundColor: isScreensharingEnabled ? Colors.black26 : Colors.white, - backgroundColor: isScreensharingEnabled ? Colors.white : Colors.black45, - child: const Icon(Icons.desktop_mac), - ); - - final holdButton = FloatingActionButton( - heroTag: 'hold', - onPressed: _remoteOnHold, - foregroundColor: isRemoteOnHold ? Colors.black26 : Colors.white, - backgroundColor: isRemoteOnHold ? Colors.white : Colors.black45, - child: const Icon(Icons.pause), - ); - - final muteCameraButton = FloatingActionButton( - heroTag: 'muteCam', - onPressed: _muteCamera, - foregroundColor: isLocalVideoMuted ? Colors.black26 : Colors.white, - backgroundColor: isLocalVideoMuted ? Colors.white : Colors.black45, - child: Icon(isLocalVideoMuted ? Icons.videocam_off : Icons.videocam), - ); - - switch (_state) { - case CallState.kRinging: - case CallState.kInviteSent: - case CallState.kCreateAnswer: - case CallState.kConnecting: - return call.isOutgoing - ? [hangupButton] - : [answerButton, hangupButton]; - case CallState.kConnected: - return [ - muteMicButton, - //switchSpeakerButton, - if (!voiceonly && !kIsWeb) switchCameraButton, - if (!voiceonly) muteCameraButton, - if (PlatformInfos.isMobile || PlatformInfos.isWeb) - screenSharingButton, - holdButton, - hangupButton, - ]; - case CallState.kEnded: - return [hangupButton]; - case CallState.kFledgling: - case CallState.kWaitLocalMedia: - case CallState.kCreateOffer: - case CallState.kEnding: - case null: - break; - } - return []; - } - - List _buildContent(Orientation orientation, bool isFloating) { - final stackWidgets = []; - - final call = this.call; - if (call.callHasEnded) { - return stackWidgets; - } - - if (call.localHold || call.remoteOnHold) { - var title = ''; - if (call.localHold) { - title = - '${call.room.getLocalizedDisplayname(MatrixLocals(L10n.of(widget.context)))} held the call.'; - } else if (call.remoteOnHold) { - title = 'You held the call.'; - } - stackWidgets.add( - Center( - child: Column( - mainAxisAlignment: .center, - children: [ - const Icon(Icons.pause, size: 48.0, color: Colors.white), - Text( - title, - style: const TextStyle(color: Colors.white, fontSize: 24.0), - ), - ], - ), - ), - ); - return stackWidgets; - } - - var primaryStream = - call.remoteScreenSharingStream ?? - call.localScreenSharingStream ?? - call.remoteUserMediaStream ?? - call.localUserMediaStream; - - if (!connected) { - primaryStream = call.localUserMediaStream; - } - - if (primaryStream != null) { - stackWidgets.add( - Center( - child: _StreamView( - primaryStream, - mainView: true, - matrixClient: widget.client, - ), - ), - ); - } - - if (isFloating || !connected) { - return stackWidgets; - } - - _resizeLocalVideo(orientation); - - if (call.getRemoteStreams.isEmpty) { - return stackWidgets; - } - - final secondaryStreamViews = []; - - if (call.remoteScreenSharingStream != null) { - final remoteUserMediaStream = call.remoteUserMediaStream; - secondaryStreamViews.add( - SizedBox( - width: _localVideoWidth, - height: _localVideoHeight, - child: _StreamView( - remoteUserMediaStream!, - matrixClient: widget.client, - ), - ), - ); - secondaryStreamViews.add(const SizedBox(height: 10)); - } - - final localStream = - call.localUserMediaStream ?? call.localScreenSharingStream; - if (localStream != null && !isFloating) { - secondaryStreamViews.add( - SizedBox( - width: _localVideoWidth, - height: _localVideoHeight, - child: _StreamView(localStream, matrixClient: widget.client), - ), - ); - secondaryStreamViews.add(const SizedBox(height: 10)); - } - - if (call.localScreenSharingStream != null && !isFloating) { - secondaryStreamViews.add( - SizedBox( - width: _localVideoWidth, - height: _localVideoHeight, - child: _StreamView( - call.remoteUserMediaStream!, - matrixClient: widget.client, - ), - ), - ); - secondaryStreamViews.add(const SizedBox(height: 10)); - } - - if (secondaryStreamViews.isNotEmpty) { - stackWidgets.add( - Container( - padding: const EdgeInsets.only(top: 20, bottom: 120), - alignment: Alignment.bottomRight, - child: Container( - width: _localVideoWidth, - margin: _localVideoMargin, - child: Column(children: secondaryStreamViews), - ), - ), - ); - } - - return stackWidgets; - } - @override Widget build(BuildContext context) { return PIPView( builder: (context, isFloating) { + // Build action buttons + final switchCameraButton = FloatingActionButton( + heroTag: 'switchCamera', + onPressed: _switchCamera, + backgroundColor: Colors.black45, + child: const Icon(Icons.switch_camera), + ); + final hangupButton = FloatingActionButton( + heroTag: 'hangup', + onPressed: _hangUp, + tooltip: 'Hangup', + backgroundColor: _state == CallState.kEnded + ? Colors.black45 + : Colors.red, + child: const Icon(Icons.call_end), + ); + final answerButton = FloatingActionButton( + heroTag: 'answer', + onPressed: _answerCall, + tooltip: 'Answer', + backgroundColor: Colors.green, + child: const Icon(Icons.phone), + ); + final muteMicButton = FloatingActionButton( + heroTag: 'muteMic', + onPressed: _muteMic, + foregroundColor: isMicrophoneMuted ? Colors.black26 : Colors.white, + backgroundColor: isMicrophoneMuted ? Colors.white : Colors.black45, + child: Icon(isMicrophoneMuted ? Icons.mic_off : Icons.mic), + ); + final screenSharingButton = FloatingActionButton( + heroTag: 'screenSharing', + onPressed: _screenSharing, + foregroundColor: isScreensharingEnabled + ? Colors.black26 + : Colors.white, + backgroundColor: isScreensharingEnabled + ? Colors.white + : Colors.black45, + child: const Icon(Icons.desktop_mac), + ); + final holdButton = FloatingActionButton( + heroTag: 'hold', + onPressed: _remoteOnHold, + foregroundColor: isRemoteOnHold ? Colors.black26 : Colors.white, + backgroundColor: isRemoteOnHold ? Colors.white : Colors.black45, + child: const Icon(Icons.pause), + ); + final muteCameraButton = FloatingActionButton( + heroTag: 'muteCam', + onPressed: _muteCamera, + foregroundColor: isLocalVideoMuted ? Colors.black26 : Colors.white, + backgroundColor: isLocalVideoMuted ? Colors.white : Colors.black45, + child: Icon(isLocalVideoMuted ? Icons.videocam_off : Icons.videocam), + ); + + late final List actionButtons; + if (!isFloating) { + switch (_state) { + case CallState.kRinging: + case CallState.kInviteSent: + case CallState.kCreateAnswer: + case CallState.kConnecting: + actionButtons = call.isOutgoing + ? [hangupButton] + : [answerButton, hangupButton]; + break; + case CallState.kConnected: + actionButtons = [ + muteMicButton, + if (!voiceonly && !kIsWeb) switchCameraButton, + if (!voiceonly) muteCameraButton, + if (PlatformInfos.isMobile || PlatformInfos.isWeb) + screenSharingButton, + holdButton, + hangupButton, + ]; + break; + case CallState.kEnded: + actionButtons = [hangupButton]; + break; + case CallState.kFledgling: + case CallState.kWaitLocalMedia: + case CallState.kCreateOffer: + case CallState.kEnding: + case null: + actionButtons = []; + break; + } + } else { + actionButtons = []; + } + return Scaffold( resizeToAvoidBottomInset: !isFloating, floatingActionButtonLocation: @@ -577,16 +445,147 @@ class MyCallingPage extends State { height: 150.0, child: Row( mainAxisAlignment: .spaceAround, - children: _buildActionButtons(isFloating), + children: actionButtons, ), ), body: OrientationBuilder( builder: (BuildContext context, Orientation orientation) { + final stackWidgets = []; + + final callHasEnded = call.callHasEnded; + if (!callHasEnded) { + if (call.localHold || call.remoteOnHold) { + var title = ''; + if (call.localHold) { + title = + '${call.room.getLocalizedDisplayname(MatrixLocals(L10n.of(widget.context)))} held the call.'; + } else if (call.remoteOnHold) { + title = 'You held the call.'; + } + stackWidgets.add( + Center( + child: Column( + mainAxisAlignment: .center, + children: [ + const Icon( + Icons.pause, + size: 48.0, + color: Colors.white, + ), + Text( + title, + style: const TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + ], + ), + ), + ); + } else { + var primaryStream = + call.remoteScreenSharingStream ?? + call.localScreenSharingStream ?? + call.remoteUserMediaStream ?? + call.localUserMediaStream; + + if (!connected) { + primaryStream = call.localUserMediaStream; + } + + if (primaryStream != null) { + stackWidgets.add( + Center( + child: _StreamView( + primaryStream, + mainView: true, + matrixClient: widget.client, + ), + ), + ); + } + + if (!isFloating && connected) { + _resizeLocalVideo(orientation); + + if (call.getRemoteStreams.isNotEmpty) { + final secondaryStreamViews = []; + + if (call.remoteScreenSharingStream != null) { + final remoteUserMediaStream = + call.remoteUserMediaStream; + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView( + remoteUserMediaStream!, + matrixClient: widget.client, + ), + ), + ); + secondaryStreamViews.add(const SizedBox(height: 10)); + } + + final localStream = + call.localUserMediaStream ?? + call.localScreenSharingStream; + if (localStream != null && !isFloating) { + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView( + localStream, + matrixClient: widget.client, + ), + ), + ); + secondaryStreamViews.add(const SizedBox(height: 10)); + } + + if (call.localScreenSharingStream != null && + !isFloating) { + secondaryStreamViews.add( + SizedBox( + width: _localVideoWidth, + height: _localVideoHeight, + child: _StreamView( + call.remoteUserMediaStream!, + matrixClient: widget.client, + ), + ), + ); + secondaryStreamViews.add(const SizedBox(height: 10)); + } + + if (secondaryStreamViews.isNotEmpty) { + stackWidgets.add( + Container( + padding: const EdgeInsets.only( + top: 20, + bottom: 120, + ), + alignment: Alignment.bottomRight, + child: Container( + width: _localVideoWidth, + margin: _localVideoMargin, + child: Column(children: secondaryStreamViews), + ), + ), + ); + } + } + } + } + } + return Container( decoration: const BoxDecoration(color: Colors.black87), child: Stack( children: [ - ..._buildContent(orientation, isFloating), + ...stackWidgets, if (!isFloating) Positioned( top: 24.0, diff --git a/lib/utils/markdown_context_builder.dart b/lib/utils/markdown_context_builder.dart index 18b5d511..f03da17f 100644 --- a/lib/utils/markdown_context_builder.dart +++ b/lib/utils/markdown_context_builder.dart @@ -3,128 +3,136 @@ import 'package:flutter/material.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; -Widget markdownContextBuilder( - BuildContext context, - EditableTextState editableTextState, - TextEditingController controller, -) { - final value = editableTextState.textEditingValue; - final selectedText = value.selection.textInside(value.text); - final buttonItems = editableTextState.contextMenuButtonItems; - final l10n = L10n.of(context); +class MarkdownContextBuilder extends StatelessWidget { + final EditableTextState editableTextState; + final TextEditingController controller; - return AdaptiveTextSelectionToolbar.buttonItems( - anchors: editableTextState.contextMenuAnchors, - buttonItems: [ - ...buttonItems, - if (selectedText.isNotEmpty) ...[ - ContextMenuButtonItem( - label: l10n.link, - onPressed: () async { - final input = await showTextInputDialog( - context: context, - title: l10n.addLink, - okLabel: l10n.ok, - cancelLabel: l10n.cancel, - validator: (text) { - if (text.isEmpty) { - return l10n.pleaseFillOut; - } - try { - text.startsWith('http') ? Uri.parse(text) : Uri.https(text); - } catch (_) { - return l10n.invalidUrl; - } - return null; - }, - hintText: 'www...', - keyboardType: TextInputType.url, - ); - final urlString = input; - if (urlString == null) return; - final url = urlString.startsWith('http') - ? Uri.parse(urlString) - : Uri.https(urlString); - final selection = controller.selection; - controller.text = controller.text.replaceRange( - selection.start, - selection.end, - '[$selectedText](${url.toString()})', - ); - ContextMenuController.removeAny(); - }, - ), - ContextMenuButtonItem( - label: l10n.checkList, - onPressed: () { - final text = controller.text; - final selection = controller.selection; + const MarkdownContextBuilder({ + required this.editableTextState, + required this.controller, + super.key, + }); - var start = selection.textBefore(text).lastIndexOf('\n'); - if (start == -1) start = 0; - final end = selection.end; + @override + Widget build(BuildContext context) { + final value = editableTextState.textEditingValue; + final selectedText = value.selection.textInside(value.text); + final buttonItems = editableTextState.contextMenuButtonItems; + final l10n = L10n.of(context); - final fullLineSelection = TextSelection( - baseOffset: start, - extentOffset: end, - ); + return AdaptiveTextSelectionToolbar.buttonItems( + anchors: editableTextState.contextMenuAnchors, + buttonItems: [ + ...buttonItems, + if (selectedText.isNotEmpty) ...[ + ContextMenuButtonItem( + label: l10n.link, + onPressed: () async { + final input = await showTextInputDialog( + context: context, + title: l10n.addLink, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + validator: (text) { + if (text.isEmpty) { + return l10n.pleaseFillOut; + } + try { + text.startsWith('http') ? Uri.parse(text) : Uri.https(text); + } catch (_) { + return l10n.invalidUrl; + } + return null; + }, + hintText: 'www...', + keyboardType: TextInputType.url, + ); + final urlString = input; + if (urlString == null) return; + final url = urlString.startsWith('http') + ? Uri.parse(urlString) + : Uri.https(urlString); + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '[$selectedText](${url.toString()})', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.checkList, + onPressed: () { + final text = controller.text; + final selection = controller.selection; - const checkBox = '- [ ]'; + var start = selection.textBefore(text).lastIndexOf('\n'); + if (start == -1) start = 0; + final end = selection.end; - final replacedRange = fullLineSelection - .textInside(text) - .split('\n') - .map( - (line) => line.startsWith(checkBox) || line.isEmpty - ? line - : '$checkBox $line', - ) - .join('\n'); - controller.text = controller.text.replaceRange( - start, - end, - replacedRange, - ); - ContextMenuController.removeAny(); - }, - ), - ContextMenuButtonItem( - label: l10n.boldText, - onPressed: () { - final selection = controller.selection; - controller.text = controller.text.replaceRange( - selection.start, - selection.end, - '**$selectedText**', - ); - ContextMenuController.removeAny(); - }, - ), - ContextMenuButtonItem( - label: l10n.italicText, - onPressed: () { - final selection = controller.selection; - controller.text = controller.text.replaceRange( - selection.start, - selection.end, - '*$selectedText*', - ); - ContextMenuController.removeAny(); - }, - ), - ContextMenuButtonItem( - label: l10n.strikeThrough, - onPressed: () { - final selection = controller.selection; - controller.text = controller.text.replaceRange( - selection.start, - selection.end, - '~~$selectedText~~', - ); - ContextMenuController.removeAny(); - }, - ), + final fullLineSelection = TextSelection( + baseOffset: start, + extentOffset: end, + ); + + const checkBox = '- [ ]'; + + final replacedRange = fullLineSelection + .textInside(text) + .split('\n') + .map( + (line) => line.startsWith(checkBox) || line.isEmpty + ? line + : '$checkBox $line', + ) + .join('\n'); + controller.text = controller.text.replaceRange( + start, + end, + replacedRange, + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.boldText, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '**$selectedText**', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.italicText, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '*$selectedText*', + ); + ContextMenuController.removeAny(); + }, + ), + ContextMenuButtonItem( + label: l10n.strikeThrough, + onPressed: () { + final selection = controller.selection; + controller.text = controller.text.replaceRange( + selection.start, + selection.end, + '~~$selectedText~~', + ); + ContextMenuController.removeAny(); + }, + ), + ], ], - ], - ); + ); + } } diff --git a/lib/widgets/mxc_image.dart b/lib/widgets/mxc_image.dart index 1572fa6b..680fe9e2 100644 --- a/lib/widgets/mxc_image.dart +++ b/lib/widgets/mxc_image.dart @@ -128,15 +128,6 @@ class _MxcImageState extends State { WidgetsBinding.instance.addPostFrameCallback((_) => _tryLoad()); } - Widget placeholder(BuildContext context) => - widget.placeholder?.call(context) ?? - Container( - width: widget.width, - height: widget.height, - alignment: Alignment.center, - child: const CircularProgressIndicator.adaptive(strokeWidth: 2), - ); - @override Widget build(BuildContext context) { final data = _imageData; @@ -172,7 +163,34 @@ class _MxcImageState extends State { }, ), ) - : placeholder(context), + : _MxcImagePlaceholder( + width: widget.width, + height: widget.height, + placeholder: widget.placeholder, + ), ); } } + +class _MxcImagePlaceholder extends StatelessWidget { + final double? width; + final double? height; + final Widget Function(BuildContext context)? placeholder; + + const _MxcImagePlaceholder({ + required this.width, + required this.height, + required this.placeholder, + }); + + @override + Widget build(BuildContext context) { + return placeholder?.call(context) ?? + Container( + width: width, + height: height, + alignment: Alignment.center, + child: const CircularProgressIndicator.adaptive(strokeWidth: 2), + ); + } +} From 2d23f88e6b698f0486b880254219d43b48f0e3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Feb 2026 09:16:54 +0100 Subject: [PATCH 128/333] chore: Execute dart code linter in CI --- .github/workflows/integrate.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index f600c2f3..f852c976 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -25,6 +25,7 @@ jobs: - name: Check license compliance run: dart run license_checker check-licenses -c licenses.yaml --problematic - run: flutter analyze + - run: dart run dart_code_linter:metrics analyze lib --reporter=github - run: dart run dart_code_linter:metrics check-unused-code lib - run: dart run dart_code_linter:metrics check-unused-files lib - run: dart run dart_code_linter:metrics check-unused-l10n lib From 28af7bb0c76b4adc27fbc42b30db034fe118daad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Feb 2026 10:04:40 +0100 Subject: [PATCH 129/333] refactor: Enable more strict lints --- analysis_options.yaml | 11 ++++- lib/pages/archive/archive.dart | 4 +- lib/pages/bootstrap/bootstrap_dialog.dart | 4 +- lib/pages/chat/chat.dart | 45 ++++++++++--------- lib/pages/chat/events/audio_player.dart | 6 +-- lib/pages/chat/events/message_content.dart | 2 +- lib/pages/chat/input_bar.dart | 2 +- lib/pages/chat/recording_view_model.dart | 2 +- lib/pages/chat/reply_display.dart | 2 +- lib/pages/chat/send_location_dialog.dart | 2 +- lib/pages/chat/start_poll_bottom_sheet.dart | 2 +- .../chat_access_settings_controller.dart | 14 +++--- lib/pages/chat_details/chat_details.dart | 6 +-- .../chat_encryption_settings.dart | 4 +- lib/pages/chat_list/chat_list.dart | 23 +++++----- .../chat_list/client_chooser_button.dart | 2 +- lib/pages/chat_list/search_title.dart | 2 +- lib/pages/chat_list/space_view.dart | 13 +++--- lib/pages/chat_members/chat_members.dart | 4 +- .../chat_permissions_settings.dart | 2 +- lib/pages/chat_search/chat_search_page.dart | 2 +- .../device_settings/device_settings.dart | 12 ++--- lib/pages/dialer/dialer.dart | 6 +-- lib/pages/image_viewer/image_viewer.dart | 4 +- lib/pages/image_viewer/video_player.dart | 2 +- lib/pages/intro/intro_page_presenter.dart | 2 +- .../invitation_selection.dart | 8 +++- lib/pages/login/login.dart | 6 +-- lib/pages/new_group/new_group.dart | 4 +- .../new_private_chat/new_private_chat.dart | 6 +-- lib/pages/settings/settings.dart | 10 ++--- lib/pages/settings_3pid/settings_3pid.dart | 4 +- .../settings_emotes/settings_emotes.dart | 6 +-- .../settings_notifications.dart | 6 +-- .../settings_password/settings_password.dart | 2 +- .../settings_security/settings_security.dart | 6 +-- lib/pages/settings_style/settings_style.dart | 8 ++-- .../settings_style/settings_style_view.dart | 2 +- .../view_model/sign_in_view_model.dart | 2 +- lib/utils/background_push.dart | 2 +- .../client_download_content_extension.dart | 2 +- lib/utils/client_manager.dart | 2 +- lib/utils/error_reporter.dart | 4 +- lib/utils/markdown_context_builder.dart | 2 +- .../event_extension.dart | 4 +- .../cipher.dart | 2 +- .../matrix_file_extension.dart | 4 +- .../notification_background_handler.dart | 2 +- lib/utils/platform_infos.dart | 2 +- lib/utils/show_update_snackbar.dart | 2 +- lib/utils/sign_in_flows/check_homeserver.dart | 2 +- lib/utils/size_string.dart | 6 +-- lib/utils/url_launcher.dart | 4 +- .../adaptive_dialogs/public_room_dialog.dart | 2 +- lib/widgets/app_lock.dart | 2 +- lib/widgets/config_viewer.dart | 2 +- .../local_notifications_extension.dart | 2 +- lib/widgets/lock_screen.dart | 2 +- lib/widgets/log_view.dart | 4 +- lib/widgets/matrix.dart | 2 +- .../member_actions_popup_menu_button.dart | 2 +- lib/widgets/mxc_image.dart | 2 +- lib/widgets/qr_code_viewer.dart | 2 +- lib/widgets/share_scaffold_dialog.dart | 2 +- lib/widgets/theme_builder.dart | 2 +- 65 files changed, 170 insertions(+), 146 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 82dc170d..0b19afcf 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -11,6 +11,7 @@ linter: - omit_local_variable_types - cancel_subscriptions - always_declare_return_types + - avoid_void_async - no_adjacent_strings_in_list - test_types_in_equals - throw_in_finally @@ -19,6 +20,15 @@ linter: - prefer_single_quotes - prefer_const_declarations - unnecessary_lambdas + - combinators_ordering + - noop_primitive_operations + - unnecessary_null_checks + - unnecessary_null_in_if_null_operators + - unnecessary_to_list_in_spreads + - use_is_even_rather_than_modulo + - use_super_parameters + # Flutter specific: + - use_colored_box analyzer: plugins: @@ -61,7 +71,6 @@ dart_code_linter: - prefer-correct-edge-insets-constructor - avoid-returning-widgets # TODO: - # - avoid-returning-widgets # - prefer-single-widget-per-file: # ignore-private-widgets: true # - prefer-extracting-callbacks diff --git a/lib/pages/archive/archive.dart b/lib/pages/archive/archive.dart index a39840a3..2481dfdd 100644 --- a/lib/pages/archive/archive.dart +++ b/lib/pages/archive/archive.dart @@ -23,7 +23,7 @@ class ArchiveController extends State { return archive = await Matrix.of(context).client.loadArchive(); } - void forgetRoomAction(int i) async { + Future forgetRoomAction(int i) async { await showFutureLoadingDialog( context: context, future: () async { @@ -35,7 +35,7 @@ class ArchiveController extends State { setState(() {}); } - void forgetAllAction() async { + Future forgetAllAction() async { final archive = this.archive; final client = Matrix.of(context).client; if (archive.isEmpty) return; diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index 592bb3e8..e565d42d 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -71,7 +71,7 @@ class BootstrapDialogState extends State { _createBootstrap(widget.wipe); } - void _cancelAction() async { + Future _cancelAction() async { final consent = await showOkCancelAlertDialog( context: context, title: L10n.of(context).skipChatBackup, @@ -110,7 +110,7 @@ class BootstrapDialogState extends State { } } - void _createBootstrap(bool wipe) async { + Future _createBootstrap(bool wipe) async { await client.roomsLoading; await client.accountDataLoading; await client.userDeviceKeysLoading; diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 15b36b98..4fa0d513 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -121,7 +121,7 @@ class ChatController extends State void onDragExited(_) => setState(() => dragging = false); - void onDragDone(DropDoneDetails details) async { + Future onDragDone(DropDoneDetails details) async { setState(() => dragging = false); if (details.files.isEmpty) return; @@ -190,7 +190,7 @@ class ChatController extends State selectedEvents.clear(); }); - void recreateChat() async { + Future recreateChat() async { final room = this.room; final userId = room.directChatMatrixID; if (userId == null) { @@ -204,7 +204,7 @@ class ChatController extends State ); } - void leaveChat() async { + Future leaveChat() async { final success = await showFutureLoadingDialog( context: context, future: room.leave, @@ -213,12 +213,12 @@ class ChatController extends State context.go('/rooms'); } - void requestHistory([_]) async { + Future requestHistory([_]) async { Logs().v('Requesting history...'); await timeline?.requestHistory(historyCount: _loadHistoryCount); } - void requestFuture() async { + Future requestFuture() async { final timeline = this.timeline; if (timeline == null) return; Logs().v('Requesting future...'); @@ -392,7 +392,7 @@ class ChatController extends State }); } - void _tryLoadTimeline() async { + Future _tryLoadTimeline() async { final initialEventId = widget.eventId; loadTimelineFuture = _getTimeline(); try { @@ -625,7 +625,7 @@ class ChatController extends State }); } - void sendFileAction({FileType type = FileType.any}) async { + Future sendFileAction({FileType type = FileType.any}) async { final files = await selectFiles(context, allowMultiple: true, type: type); if (files.isEmpty) return; await showAdaptiveDialog( @@ -640,7 +640,7 @@ class ChatController extends State ); } - void sendImageFromClipBoard(Uint8List? image) async { + Future sendImageFromClipBoard(Uint8List? image) async { if (image == null) return; await showAdaptiveDialog( context: context, @@ -654,7 +654,7 @@ class ChatController extends State ); } - void openCameraAction() async { + Future openCameraAction() async { // Make sure the textfield is unfocused before opening the camera FocusScope.of(context).requestFocus(FocusNode()); final file = await ImagePicker().pickImage(source: ImageSource.camera); @@ -672,7 +672,7 @@ class ChatController extends State ); } - void openVideoCameraAction() async { + Future openVideoCameraAction() async { // Make sure the textfield is unfocused before opening the camera FocusScope.of(context).requestFocus(FocusNode()); final file = await ImagePicker().pickVideo( @@ -759,7 +759,7 @@ class ChatController extends State } } - void sendLocationAction() async { + Future sendLocationAction() async { await showAdaptiveDialog( context: context, builder: (c) => SendLocationDialog(room: room), @@ -793,7 +793,7 @@ class ChatController extends State }); } - void reportEventAction() async { + Future reportEventAction() async { final event = selectedEvents.single; final score = await showModalActionPopup( context: context, @@ -837,7 +837,7 @@ class ChatController extends State ); } - void deleteErrorEventsAction() async { + Future deleteErrorEventsAction() async { try { if (selectedEvents.any((event) => event.status != EventStatus.error)) { throw Exception( @@ -856,7 +856,7 @@ class ChatController extends State } } - void redactEventsAction() async { + Future redactEventsAction() async { final reasonInput = selectedEvents.any((event) => event.status.isSent) ? await showTextInputDialog( context: context, @@ -949,7 +949,7 @@ class ChatController extends State ); } - void forwardEventsAction() async { + Future forwardEventsAction() async { if (selectedEvents.isEmpty) return; final timeline = this.timeline; if (timeline == null) return; @@ -992,7 +992,10 @@ class ChatController extends State inputFocus.requestFocus(); } - void scrollToEventId(String eventId, {bool highlightEvent = true}) async { + Future scrollToEventId( + String eventId, { + bool highlightEvent = true, + }) async { final foundEvent = timeline!.events.firstWhereOrNull( (event) => event.eventId == eventId, ); @@ -1036,7 +1039,7 @@ class ChatController extends State _updateScrollController(); } - void scrollDown() async { + Future scrollDown() async { if (!timeline!.allowNewEvent) { setState(() { timeline = null; @@ -1117,7 +1120,7 @@ class ChatController extends State inputFocus.requestFocus(); } - void goToNewRoomAction() async { + Future goToNewRoomAction() async { final result = await showFutureLoadingDialog( context: context, future: () async { @@ -1216,7 +1219,7 @@ class ChatController extends State } } - void unpinEvent(String eventId) async { + Future unpinEvent(String eventId) async { final response = await showOkCancelAlertDialog( context: context, title: L10n.of(context).unpin, @@ -1309,7 +1312,7 @@ class ChatController extends State void showEventInfo([Event? event]) => (event ?? selectedEvents.single).showInfoDialog(context); - void onPhoneButtonTap() async { + Future onPhoneButtonTap() async { // VoIP required Android SDK 21 if (PlatformInfos.isAndroid) { DeviceInfoPlugin().androidInfo.then((value) { @@ -1365,7 +1368,7 @@ class ChatController extends State late final ValueNotifier _displayChatDetailsColumn; - void toggleDisplayChatDetailsColumn() async { + Future toggleDisplayChatDetailsColumn() async { await AppSettings.displayChatDetailsColumn.setItem( !_displayChatDetailsColumn.value, ); diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index fd631cbc..e7998083 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -124,7 +124,7 @@ class AudioPlayerState extends State { } } - void _onButtonTap() async { + Future _onButtonTap() async { WidgetsBinding.instance.addPostFrameCallback((_) { ScaffoldMessenger.of(matrix.context).clearMaterialBanners(); }); @@ -216,7 +216,7 @@ class AudioPlayerState extends State { ); } - void _toggleSpeed() async { + Future _toggleSpeed() async { final audioPlayer = matrix.audioPlayer; if (audioPlayer == null) return; switch (audioPlayer.speed) { @@ -459,7 +459,7 @@ class AudioPlayerState extends State { height: 20, child: Center( child: Text( - '${audioPlayer?.speed.toString()}x', + '${audioPlayer?.speed}x', style: TextStyle( color: widget.color, fontSize: 9, diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index cf1f07f4..cccd8d1a 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -47,7 +47,7 @@ class MessageContent extends StatelessWidget { required this.selected, }); - void _verifyOrRequestKey(BuildContext context) async { + Future _verifyOrRequestKey(BuildContext context) async { final l10n = L10n.of(context); if (event.content['can_request_session'] != true) { ScaffoldMessenger.of(context).showSnackBar( diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index 3c240d30..bc1261ff 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -411,7 +411,7 @@ class InputBar extends StatelessWidget { ), minLines: minLines, maxLines: maxLines, - keyboardType: keyboardType!, + keyboardType: keyboardType, textInputAction: textInputAction, autofocus: autofocus!, inputFormatters: [ diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index 0c75182c..2f401c1c 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -164,7 +164,7 @@ class RecordingViewModelState extends State { }); } - void stopAndSend( + Future stopAndSend( Future Function( String path, int duration, diff --git a/lib/pages/chat/reply_display.dart b/lib/pages/chat/reply_display.dart index 3e9fe0c2..2090cecc 100644 --- a/lib/pages/chat/reply_display.dart +++ b/lib/pages/chat/reply_display.dart @@ -35,7 +35,7 @@ class ReplyDisplay extends StatelessWidget { child: controller.replyEvent != null ? ReplyContent( controller.replyEvent!, - timeline: controller.timeline!, + timeline: controller.timeline, ) : _EditContent( controller.editEvent?.getDisplayEvent(controller.timeline!), diff --git a/lib/pages/chat/send_location_dialog.dart b/lib/pages/chat/send_location_dialog.dart index 8efc2cb6..91460467 100644 --- a/lib/pages/chat/send_location_dialog.dart +++ b/lib/pages/chat/send_location_dialog.dart @@ -73,7 +73,7 @@ class SendLocationDialogState extends State { } } - void sendAction() async { + Future sendAction() async { setState(() => isSending = true); final body = 'https://www.openstreetmap.org/?mlat=${position!.latitude}&mlon=${position!.longitude}#map=16/${position!.latitude}/${position!.longitude}'; diff --git a/lib/pages/chat/start_poll_bottom_sheet.dart b/lib/pages/chat/start_poll_bottom_sheet.dart index 25e18ad4..7c5bf176 100644 --- a/lib/pages/chat/start_poll_bottom_sheet.dart +++ b/lib/pages/chat/start_poll_bottom_sheet.dart @@ -28,7 +28,7 @@ class _StartPollBottomSheetState extends State { String? _txid; - void _createPoll() async { + Future _createPoll() async { try { var id = 0; _txid ??= widget.room.client.generateUniqueTransactionId(); diff --git a/lib/pages/chat_access_settings/chat_access_settings_controller.dart b/lib/pages/chat_access_settings/chat_access_settings_controller.dart index 4161099f..93f5cda0 100644 --- a/lib/pages/chat_access_settings/chat_access_settings_controller.dart +++ b/lib/pages/chat_access_settings/chat_access_settings_controller.dart @@ -78,7 +78,7 @@ class ChatAccessSettingsController extends State { return joinRules.toList(); } - void setJoinRule(JoinRules? newJoinRules) async { + Future setJoinRule(JoinRules? newJoinRules) async { if (newJoinRules == null) return; setState(() { joinRulesLoading = true; @@ -111,7 +111,9 @@ class ChatAccessSettingsController extends State { } } - void setHistoryVisibility(HistoryVisibility? historyVisibility) async { + Future setHistoryVisibility( + HistoryVisibility? historyVisibility, + ) async { if (historyVisibility == null) return; setState(() { historyVisibilityLoading = true; @@ -135,7 +137,7 @@ class ChatAccessSettingsController extends State { } } - void setGuestAccess(GuestAccess? guestAccess) async { + Future setGuestAccess(GuestAccess? guestAccess) async { if (guestAccess == null) return; setState(() { guestAccessLoading = true; @@ -159,7 +161,7 @@ class ChatAccessSettingsController extends State { } } - void updateRoomAction() async { + Future updateRoomAction() async { final roomVersion = room .getState(EventTypes.RoomCreate)! .content @@ -303,7 +305,7 @@ class ChatAccessSettingsController extends State { ); } - void deleteAlias(String alias) async { + Future deleteAlias(String alias) async { await showFutureLoadingDialog( context: context, future: () => room.client.deleteRoomAlias(alias), @@ -311,7 +313,7 @@ class ChatAccessSettingsController extends State { setState(() {}); } - void setChatVisibilityOnDirectory(bool? visibility) async { + Future setChatVisibilityOnDirectory(bool? visibility) async { if (visibility == null) return; setState(() { visibilityLoading = true; diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index ad2fa8dc..b9a02690 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -38,7 +38,7 @@ class ChatDetailsController extends State { String? get roomId => widget.roomId; - void setDisplaynameAction() async { + Future setDisplaynameAction() async { final room = Matrix.of(context).client.getRoomById(roomId!)!; final input = await showTextInputDialog( context: context, @@ -59,7 +59,7 @@ class ChatDetailsController extends State { } } - void setTopicAction() async { + Future setTopicAction() async { final room = Matrix.of(context).client.getRoomById(roomId!)!; final input = await showTextInputDialog( context: context, @@ -83,7 +83,7 @@ class ChatDetailsController extends State { } } - void setAvatarAction() async { + Future setAvatarAction() async { final room = Matrix.of(context).client.getRoomById(roomId!); final actions = [ if (PlatformInfos.isMobile) diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart index 704f3364..d8db6f25 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart @@ -30,7 +30,7 @@ class ChatEncryptionSettingsController extends State { } } - void enableEncryption(_) async { + Future enableEncryption(_) async { if (room.encrypted) { showOkAlertDialog( context: context, @@ -69,7 +69,7 @@ class ChatEncryptionSettingsController extends State { ); } - void startVerification() async { + Future startVerification() async { final consent = await showOkCancelAlertDialog( context: context, title: L10n.of(context).verifyOtherUser, diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index aae3a10c..e55b8251 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -78,7 +78,7 @@ class ChatListController extends State String? _activeSpaceId; String? get activeSpaceId => _activeSpaceId; - void setActiveSpace(String spaceId) async { + Future setActiveSpace(String spaceId) async { await Matrix.of(context).client.getRoomById(spaceId)!.postLoad(); setState(() { @@ -90,7 +90,7 @@ class ChatListController extends State _activeSpaceId = null; }); - void onChatTap(Room room) async { + Future onChatTap(Room room) async { if (room.membership == Membership.invite) { final joinResult = await showFutureLoadingDialog( context: context, @@ -156,7 +156,7 @@ class ChatListController extends State bool isSearching = false; static const String _serverStoreNamespace = 'im.fluffychat.search.server'; - void setServer() async { + Future setServer() async { final newServer = await showTextInputDialog( useRootNavigator: false, title: L10n.of(context).changeTheHomeserver, @@ -184,7 +184,7 @@ class ChatListController extends State final TextEditingController searchController = TextEditingController(); final FocusNode searchFocusNode = FocusNode(); - void _search() async { + Future _search() async { final client = Matrix.of(context).client; if (!isSearching) { setState(() { @@ -292,7 +292,7 @@ class ChatListController extends State } } - void editSpace(BuildContext context, String spaceId) async { + Future editSpace(BuildContext context, String spaceId) async { await Matrix.of(context).client.getRoomById(spaceId)!.postLoad(); if (mounted) { context.push('/rooms/$spaceId/details'); @@ -326,7 +326,7 @@ class ChatListController extends State ); } - void _processIncomingUris(Uri? uri) async { + Future _processIncomingUris(Uri? uri) async { if (uri == null) return; context.go('/rooms'); WidgetsBinding.instance.addPostFrameCallback((_) { @@ -399,7 +399,7 @@ class ChatListController extends State super.dispose(); } - void chatContextAction( + Future chatContextAction( Room room, BuildContext posContext, [ Room? space, @@ -671,7 +671,7 @@ class ChatListController extends State } } - void dismissStatusList() async { + Future dismissStatusList() async { final result = await showOkCancelAlertDialog( title: L10n.of(context).hidePresences, context: context, @@ -682,7 +682,7 @@ class ChatListController extends State } } - void setStatus() async { + Future setStatus() async { final client = Matrix.of(context).client; final currentPresence = await client.fetchCurrentPresence(client.userID!); final input = await showTextInputDialog( @@ -793,7 +793,10 @@ class ChatListController extends State }); } - void editBundlesForAccount(String? userId, String? activeBundle) async { + Future editBundlesForAccount( + String? userId, + String? activeBundle, + ) async { final l10n = L10n.of(context); final client = Matrix.of( context, diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index 50c9f4a7..d6431ad7 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -194,7 +194,7 @@ class ClientChooserButton extends StatelessWidget { ); } - void _clientSelected(Object object, BuildContext context) async { + Future _clientSelected(Object object, BuildContext context) async { if (object is Client) { controller.setActiveClient(object); } else if (object is String) { diff --git a/lib/pages/chat_list/search_title.dart b/lib/pages/chat_list/search_title.dart index 95bb5364..5f9b2f84 100644 --- a/lib/pages/chat_list/search_title.dart +++ b/lib/pages/chat_list/search_title.dart @@ -52,7 +52,7 @@ class SearchTitle extends StatelessWidget { Expanded( child: Align( alignment: Alignment.centerRight, - child: trailing!, + child: trailing, ), ), ], diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index 719fa2fb..9a1fdd56 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -60,7 +60,7 @@ class _SpaceViewState extends State { super.initState(); } - void _loadHierarchy() async { + Future _loadHierarchy() async { final matrix = Matrix.of(context); final room = matrix.client.getRoomById(widget.spaceId); if (room == null) return; @@ -127,7 +127,7 @@ class _SpaceViewState extends State { } } - void _joinChildRoom(SpaceRoomsChunk$2 item) async { + Future _joinChildRoom(SpaceRoomsChunk$2 item) async { final client = Matrix.of(context).client; final space = client.getRoomById(widget.spaceId); final via = space?.spaceChildren @@ -146,7 +146,7 @@ class _SpaceViewState extends State { if (room != null) widget.onChatTab(room); } - void _onSpaceAction(SpaceActions action) async { + Future _onSpaceAction(SpaceActions action) async { final space = Matrix.of(context).client.getRoomById(widget.spaceId); switch (action) { @@ -184,7 +184,7 @@ class _SpaceViewState extends State { } } - void _addChatOrSubspace(AddRoomType roomType) async { + Future _addChatOrSubspace(AddRoomType roomType) async { final names = await showTextInputDialog( context: context, title: roomType == AddRoomType.subspace @@ -261,7 +261,10 @@ class _SpaceViewState extends State { _loadHierarchy(); } - void _showSpaceChildEditMenu(BuildContext posContext, String roomId) async { + Future _showSpaceChildEditMenu( + BuildContext posContext, + String roomId, + ) async { final overlay = Overlay.of(posContext).context.findRenderObject() as RenderBox; diff --git a/lib/pages/chat_members/chat_members.dart b/lib/pages/chat_members/chat_members.dart index e4ce1a5a..a652eff0 100644 --- a/lib/pages/chat_members/chat_members.dart +++ b/lib/pages/chat_members/chat_members.dart @@ -29,7 +29,7 @@ class ChatMembersController extends State { setFilter(); } - void setFilter([_]) async { + Future setFilter([_]) async { final filter = filterController.text.toLowerCase().trim(); final members = this.members @@ -56,7 +56,7 @@ class ChatMembersController extends State { }); } - void refreshMembers([_]) async { + Future refreshMembers([_]) async { Logs().d('Load room members from', widget.roomId); try { setState(() { diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart index f9d5afb8..e3dbfde4 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -21,7 +21,7 @@ class ChatPermissionsSettings extends StatefulWidget { class ChatPermissionsSettingsController extends State { String? get roomId => GoRouterState.of(context).pathParameters['roomid']; - void editPowerLevel( + Future editPowerLevel( BuildContext context, String key, int currentLevel, { diff --git a/lib/pages/chat_search/chat_search_page.dart b/lib/pages/chat_search/chat_search_page.dart index 965658ee..579a2103 100644 --- a/lib/pages/chat_search/chat_search_page.dart +++ b/lib/pages/chat_search/chat_search_page.dart @@ -44,7 +44,7 @@ class ChatSearchController extends State }); } - void startSearch() async { + Future startSearch() async { switch (tabController.index) { case 0: final searchQuery = searchController.text.trim(); diff --git a/lib/pages/device_settings/device_settings.dart b/lib/pages/device_settings/device_settings.dart index df7c5f5d..014359a8 100644 --- a/lib/pages/device_settings/device_settings.dart +++ b/lib/pages/device_settings/device_settings.dart @@ -38,7 +38,7 @@ class DevicesSettingsController extends State { super.initState(); } - void _checkChatBackup() async { + Future _checkChatBackup() async { final client = Matrix.of(context).client; final state = await client.getCryptoIdentityState(); setState(() { @@ -46,7 +46,7 @@ class DevicesSettingsController extends State { }); } - void removeDevicesAction(List devices) async { + Future removeDevicesAction(List devices) async { final client = Matrix.of(context).client; final wellKnown = await client.getWellknown(); @@ -84,7 +84,7 @@ class DevicesSettingsController extends State { reload(); } - void renameDeviceAction(Device device) async { + Future renameDeviceAction(Device device) async { final displayName = await showTextInputDialog( context: context, title: L10n.of(context).changeDeviceName, @@ -104,7 +104,7 @@ class DevicesSettingsController extends State { } } - void verifyDeviceAction(Device device) async { + Future verifyDeviceAction(Device device) async { final consent = await showOkCancelAlertDialog( context: context, title: L10n.of(context).verifyOtherDevice, @@ -129,7 +129,7 @@ class DevicesSettingsController extends State { await KeyVerificationDialog(request: req).show(context); } - void blockDeviceAction(Device device) async { + Future blockDeviceAction(Device device) async { final key = Matrix.of(context) .client .userDeviceKeys[Matrix.of(context).client.userID!]! @@ -141,7 +141,7 @@ class DevicesSettingsController extends State { setState(() {}); } - void unblockDeviceAction(Device device) async { + Future unblockDeviceAction(Device device) async { final key = Matrix.of(context) .client .userDeviceKeys[Matrix.of(context).client.userID!]! diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index 753312b3..f7af5b54 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -171,7 +171,7 @@ class MyCallingPage extends State { EdgeInsetsGeometry? _localVideoMargin; CallState? _state; - void _playCallSound() async { + Future _playCallSound() async { const path = 'assets/sounds/call.ogg'; if (kIsWeb || PlatformInfos.isMobile || PlatformInfos.isMacOS) { final player = AudioPlayer(); @@ -245,7 +245,7 @@ class MyCallingPage extends State { } void _handleCallState(CallState state) { - Logs().v('CallingPage::handleCallState: ${state.toString()}'); + Logs().v('CallingPage::handleCallState: $state'); if ({CallState.kConnected, CallState.kEnded}.contains(state)) { HapticFeedback.heavyImpact(); } @@ -322,7 +322,7 @@ class MyCallingPage extends State { }); } - void _switchCamera() async { + Future _switchCamera() async { if (call.localUserMediaStream != null) { await Helper.switchCamera( call.localUserMediaStream!.stream!.getVideoTracks().first, diff --git a/lib/pages/image_viewer/image_viewer.dart b/lib/pages/image_viewer/image_viewer.dart index 1dba46b2..fc64d0f4 100644 --- a/lib/pages/image_viewer/image_viewer.dart +++ b/lib/pages/image_viewer/image_viewer.dart @@ -67,7 +67,7 @@ class ImageViewerController extends State { } } - void prevImage() async { + Future prevImage() async { await pageController.previousPage( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, @@ -76,7 +76,7 @@ class ImageViewerController extends State { setState(() {}); } - void nextImage() async { + Future nextImage() async { await pageController.nextPage( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index 5ca9fcc2..2fd5e0c2 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -35,7 +35,7 @@ class EventVideoPlayerState extends State { final _supportsVideoPlayer = !PlatformInfos.isWindows && !PlatformInfos.isLinux; - void _downloadAction() async { + Future _downloadAction() async { if (!_supportsVideoPlayer) { widget.event.saveFile(context); return; diff --git a/lib/pages/intro/intro_page_presenter.dart b/lib/pages/intro/intro_page_presenter.dart index dad35f34..fa702bee 100644 --- a/lib/pages/intro/intro_page_presenter.dart +++ b/lib/pages/intro/intro_page_presenter.dart @@ -35,7 +35,7 @@ class _IntroPagePresenterState extends State { if (kIsWeb) _finishOidcLogin(); } - void _finishOidcLogin() async { + Future _finishOidcLogin() async { final store = await SharedPreferences.getInstance(); final storedHomeserverString = store.getString( OidcSessionJsonExtension.homeserverStoreKey, diff --git a/lib/pages/invitation_selection/invitation_selection.dart b/lib/pages/invitation_selection/invitation_selection.dart index 50fcd266..b662829e 100644 --- a/lib/pages/invitation_selection/invitation_selection.dart +++ b/lib/pages/invitation_selection/invitation_selection.dart @@ -50,7 +50,11 @@ class InvitationSelectionController extends State { return contacts; } - void inviteAction(BuildContext context, String id, String displayname) async { + Future inviteAction( + BuildContext context, + String id, + String displayname, + ) async { final room = Matrix.of(context).client.getRoomById(roomId!)!; final success = await showFutureLoadingDialog( @@ -74,7 +78,7 @@ class InvitationSelectionController extends State { ); } - void searchUser(BuildContext context, String text) async { + Future searchUser(BuildContext context, String text) async { coolDown?.cancel(); if (text.isEmpty) { setState(() => foundProfiles = []); diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index fdc2f7ca..c0a3e10a 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -32,7 +32,7 @@ class LoginController extends State { void toggleShowPassword() => setState(() => showPassword = !loading && !showPassword); - void login() async { + Future login() async { final matrix = Matrix.of(context); if (usernameController.text.isEmpty) { setState(() => usernameError = L10n.of(context).pleaseEnterYourUsername); @@ -102,7 +102,7 @@ class LoginController extends State { ); } - void _checkWellKnown(String userId) async { + Future _checkWellKnown(String userId) async { if (mounted) setState(() => usernameError = null); if (!userId.isValidMatrixId) return; final oldHomeserver = widget.client.homeserver; @@ -158,7 +158,7 @@ class LoginController extends State { } } - void passwordForgotten() async { + Future passwordForgotten() async { final input = await showTextInputDialog( useRootNavigator: false, context: context, diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index 4c2e711a..51202f2b 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -47,7 +47,7 @@ class NewGroupController extends State { void setGroupCanBeFound(bool b) => setState(() => groupCanBeFound = b); - void selectPhoto() async { + Future selectPhoto() async { final photo = await selectFiles( context, type: FileType.image, @@ -108,7 +108,7 @@ class NewGroupController extends State { context.pop(spaceId); } - void submitAction([_]) async { + Future submitAction([_]) async { final client = Matrix.of(context).client; try { diff --git a/lib/pages/new_private_chat/new_private_chat.dart b/lib/pages/new_private_chat/new_private_chat.dart index 982290c4..55435cc1 100644 --- a/lib/pages/new_private_chat/new_private_chat.dart +++ b/lib/pages/new_private_chat/new_private_chat.dart @@ -33,7 +33,7 @@ class NewPrivateChatController extends State { static const Duration _coolDown = Duration(milliseconds: 500); - void searchUsers([String? input]) async { + Future searchUsers([String? input]) async { final searchTerm = input ?? controller.text; if (searchTerm.isEmpty) { _searchCoolDown?.cancel(); @@ -68,7 +68,7 @@ class NewPrivateChatController extends State { void inviteAction() => FluffyShare.shareInviteLink(context); - void openScannerAction() async { + Future openScannerAction() async { if (PlatformInfos.isAndroid) { final info = await DeviceInfoPlugin().androidInfo; if (info.version.sdkInt < 21) { @@ -88,7 +88,7 @@ class NewPrivateChatController extends State { ); } - void copyUserId() async { + Future copyUserId() async { await Clipboard.setData( ClipboardData(text: Matrix.of(context).client.userID!), ); diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 3f6c7411..4f5be9a8 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -35,7 +35,7 @@ class SettingsController extends State { profileFuture = null; }); - void setDisplaynameAction() async { + Future setDisplaynameAction() async { final profile = await profileFuture; final input = await showTextInputDialog( useRootNavigator: false, @@ -61,7 +61,7 @@ class SettingsController extends State { } } - void logoutAction() async { + Future logoutAction() async { if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, @@ -81,7 +81,7 @@ class SettingsController extends State { ); } - void setAvatarAction() async { + Future setAvatarAction() async { final profile = await profileFuture; final actions = [ if (PlatformInfos.isMobile) @@ -159,7 +159,7 @@ class SettingsController extends State { super.initState(); } - void checkBootstrap() async { + Future checkBootstrap() async { final client = Matrix.of(context).client; if (!client.encryptionEnabled) return; await client.accountDataLoading; @@ -176,7 +176,7 @@ class SettingsController extends State { bool? cryptoIdentityConnected; - void firstRunBootstrapAction([_]) async { + Future firstRunBootstrapAction([_]) async { if (cryptoIdentityConnected == true) { showOkAlertDialog( context: context, diff --git a/lib/pages/settings_3pid/settings_3pid.dart b/lib/pages/settings_3pid/settings_3pid.dart index f35c5c1f..765399ec 100644 --- a/lib/pages/settings_3pid/settings_3pid.dart +++ b/lib/pages/settings_3pid/settings_3pid.dart @@ -19,7 +19,7 @@ class Settings3Pid extends StatefulWidget { } class Settings3PidController extends State { - void add3PidAction() async { + Future add3PidAction() async { final input = await showTextInputDialog( useRootNavigator: false, context: context, @@ -63,7 +63,7 @@ class Settings3PidController extends State { Future?>? request; - void delete3Pid(ThirdPartyIdentifier identifier) async { + Future delete3Pid(ThirdPartyIdentifier identifier) async { if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart index c2f68a15..8b8cb2f5 100644 --- a/lib/pages/settings_emotes/settings_emotes.dart +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -245,7 +245,7 @@ class EmotesSettingsController extends State { }); } - void createImagePack() async { + Future createImagePack() async { final room = this.room; if (room == null) throw Exception('Cannot create image pack without room'); @@ -287,14 +287,14 @@ class EmotesSettingsController extends State { setState(() {}); } - void saveAction() async { + Future saveAction() async { await save(context); setState(() { showSave = false; }); } - void createStickers() async { + Future createStickers() async { final pickedFiles = await selectFiles( context, type: FileType.image, diff --git a/lib/pages/settings_notifications/settings_notifications.dart b/lib/pages/settings_notifications/settings_notifications.dart index 98e43030..05c9e3e5 100644 --- a/lib/pages/settings_notifications/settings_notifications.dart +++ b/lib/pages/settings_notifications/settings_notifications.dart @@ -26,7 +26,7 @@ class SettingsNotifications extends StatefulWidget { class SettingsNotificationsController extends State { bool isLoading = false; - void onPusherTap(Pusher pusher) async { + Future onPusherTap(Pusher pusher) async { final delete = await showModalActionPopup( context: context, title: pusher.deviceDisplayName, @@ -58,7 +58,7 @@ class SettingsNotificationsController extends State { Future?>? pusherFuture; - void togglePushRule(PushRuleKind kind, PushRule pushRule) async { + Future togglePushRule(PushRuleKind kind, PushRule pushRule) async { setState(() { isLoading = true; }); @@ -91,7 +91,7 @@ class SettingsNotificationsController extends State { } } - void editPushRule(PushRule rule, PushRuleKind kind) async { + Future editPushRule(PushRule rule, PushRuleKind kind) async { final theme = Theme.of(context); final action = await showAdaptiveDialog( context: context, diff --git a/lib/pages/settings_password/settings_password.dart b/lib/pages/settings_password/settings_password.dart index 413f8025..d2fe2621 100644 --- a/lib/pages/settings_password/settings_password.dart +++ b/lib/pages/settings_password/settings_password.dart @@ -25,7 +25,7 @@ class SettingsPasswordController extends State { bool loading = false; - void changePassword() async { + Future changePassword() async { setState(() { oldPasswordError = newPassword1Error = newPassword2Error = null; }); diff --git a/lib/pages/settings_security/settings_security.dart b/lib/pages/settings_security/settings_security.dart index 688feb4b..f73a0e18 100644 --- a/lib/pages/settings_security/settings_security.dart +++ b/lib/pages/settings_security/settings_security.dart @@ -19,7 +19,7 @@ class SettingsSecurity extends StatefulWidget { } class SettingsSecurityController extends State { - void setAppLockAction() async { + Future setAppLockAction() async { if (AppLock.of(context).isActive) { AppLock.of(context).showLockScreen(); } @@ -46,7 +46,7 @@ class SettingsSecurityController extends State { } } - void deleteAccountAction() async { + Future deleteAccountAction() async { if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, @@ -93,7 +93,7 @@ class SettingsSecurityController extends State { Future dehydrateAction() => Matrix.of(context).dehydrateAction(context); - void changeShareKeysWith(ShareKeysWith? shareKeysWith) async { + Future changeShareKeysWith(ShareKeysWith? shareKeysWith) async { if (shareKeysWith == null) return; AppSettings.shareKeysWith.setItem(shareKeysWith.name); Matrix.of(context).client.shareKeysWith = shareKeysWith; diff --git a/lib/pages/settings_style/settings_style.dart b/lib/pages/settings_style/settings_style.dart index c30492cf..c4749568 100644 --- a/lib/pages/settings_style/settings_style.dart +++ b/lib/pages/settings_style/settings_style.dart @@ -26,7 +26,7 @@ class SettingsStyleController extends State { ThemeController.of(context).setPrimaryColor(color); } - void setWallpaper() async { + Future setWallpaper() async { final client = Matrix.of(context).client; final picked = await selectFiles(context, type: FileType.image); final pickedFile = picked.firstOrNull; @@ -53,7 +53,7 @@ class SettingsStyleController extends State { double? _wallpaperOpacity; - void saveWallpaperOpacity(double opacity) async { + Future saveWallpaperOpacity(double opacity) async { final client = Matrix.of(context).client; final result = await showFutureLoadingDialog( context: context, @@ -80,7 +80,7 @@ class SettingsStyleController extends State { 0.5; double? _wallpaperBlur; - void saveWallpaperBlur(double blur) async { + Future saveWallpaperBlur(double blur) async { final client = Matrix.of(context).client; final result = await showFutureLoadingDialog( context: context, @@ -153,7 +153,7 @@ class SettingsStyleController extends State { setState(() {}); } - void changeFontSizeFactor(double d) async { + Future changeFontSizeFactor(double d) async { await AppSettings.fontSizeFactor.setItem(d); setState(() {}); } diff --git a/lib/pages/settings_style/settings_style_view.dart b/lib/pages/settings_style/settings_style_view.dart index 213cf5d5..9391bbf3 100644 --- a/lib/pages/settings_style/settings_style_view.dart +++ b/lib/pages/settings_style/settings_style_view.dart @@ -201,7 +201,7 @@ class SettingsStyleView extends StatelessWidget { type: EventTypes.RoomMember, senderId: client.userID!, originServerTs: DateTime.now(), - stateKey: client.userID!, + stateKey: client.userID, ), ), Padding( diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart index 23d0028f..6d9bcc87 100644 --- a/lib/pages/sign_in/view_model/sign_in_view_model.dart +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -52,7 +52,7 @@ class SignInViewModel extends ValueNotifier { ); } - void refreshPublicHomeservers() async { + Future refreshPublicHomeservers() async { value = value.copyWith(publicHomeservers: AsyncSnapshot.waiting()); final defaultHomeserverData = PublicHomeserverData( name: AppSettings.defaultHomeserver.value, diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index bec7d5ef..2713073b 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -72,7 +72,7 @@ class BackgroundPush { bool upAction = false; - void _init() async { + Future _init() async { //firebaseEnabled = true; try { mainIsolateReceivePort?.listen((message) async { diff --git a/lib/utils/client_download_content_extension.dart b/lib/utils/client_download_content_extension.dart index b93357a0..24a5868d 100644 --- a/lib/utils/client_download_content_extension.dart +++ b/lib/utils/client_download_content_extension.dart @@ -22,7 +22,7 @@ extension ClientDownloadContentExtension on Client { width: width, height: height, animated: animated, - method: thumbnailMethod!, + method: thumbnailMethod, ) : mxc; diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 452d8956..817727e9 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -145,7 +145,7 @@ abstract class ClientManager { ); } - static void sendInitNotification(String title, String body) async { + static Future sendInitNotification(String title, String body) async { if (kIsWeb) { html.Notification(title, body: body); return; diff --git a/lib/utils/error_reporter.dart b/lib/utils/error_reporter.dart index 514d8162..670d2f8a 100644 --- a/lib/utils/error_reporter.dart +++ b/lib/utils/error_reporter.dart @@ -22,14 +22,14 @@ class ErrorReporter { 'HandshakeException', }; - void onErrorCallback(Object error, [StackTrace? stackTrace]) { + Future onErrorCallback(Object error, [StackTrace? stackTrace]) async { if (ingoredTypes.contains(error.runtimeType.toString())) return; Logs().e(message ?? 'Error caught', error, stackTrace); final text = '$error\n${stackTrace ?? ''}'; return _onErrorCallback(text); } - void _onErrorCallback(String text) async { + Future _onErrorCallback(String text) async { await showAdaptiveDialog( context: context!, builder: (context) => AlertDialog.adaptive( diff --git a/lib/utils/markdown_context_builder.dart b/lib/utils/markdown_context_builder.dart index f03da17f..57d44d4c 100644 --- a/lib/utils/markdown_context_builder.dart +++ b/lib/utils/markdown_context_builder.dart @@ -56,7 +56,7 @@ class MarkdownContextBuilder extends StatelessWidget { controller.text = controller.text.replaceRange( selection.start, selection.end, - '[$selectedText](${url.toString()})', + '[$selectedText]($url)', ); ContextMenuController.removeAny(); }, diff --git a/lib/utils/matrix_sdk_extensions/event_extension.dart b/lib/utils/matrix_sdk_extensions/event_extension.dart index 09cbe534..6f1138bf 100644 --- a/lib/utils/matrix_sdk_extensions/event_extension.dart +++ b/lib/utils/matrix_sdk_extensions/event_extension.dart @@ -26,13 +26,13 @@ extension LocalizedBody on Event { }, ); - void saveFile(BuildContext context) async { + Future saveFile(BuildContext context) async { final matrixFile = await _getFile(context); matrixFile.result?.save(context); } - void shareFile(BuildContext context) async { + Future shareFile(BuildContext context) async { final matrixFile = await _getFile(context); inspect(matrixFile); diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart index a91c79f2..3862346f 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart @@ -47,7 +47,7 @@ Future getDatabaseCipher() async { return password; } -void _sendNoEncryptionWarning(Object exception) async { +Future _sendNoEncryptionWarning(Object exception) async { final isStored = AppSettings.noEncryptionWarningShown.value; if (isStored == true) return; diff --git a/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart index dffea0c6..857c8095 100644 --- a/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart +++ b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart @@ -8,7 +8,7 @@ import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/size_string.dart'; extension MatrixFileExtension on MatrixFile { - void save(BuildContext context) async { + Future save(BuildContext context) async { final scaffoldMessenger = ScaffoldMessenger.of(context); final l10n = L10n.of(context); final downloadPath = await FilePicker.platform.saveFile( @@ -31,7 +31,7 @@ extension MatrixFileExtension on MatrixFile { return FileType.any; } - void share(BuildContext context) async { + Future share(BuildContext context) async { // Workaround for iPad from // https://github.com/fluttercommunity/plus_plugins/tree/main/packages/share_plus/share_plus#ipad final box = context.findRenderObject() as RenderBox?; diff --git a/lib/utils/notification_background_handler.dart b/lib/utils/notification_background_handler.dart index 81213d82..6c257e9a 100644 --- a/lib/utils/notification_background_handler.dart +++ b/lib/utils/notification_background_handler.dart @@ -53,7 +53,7 @@ Future waitForPushIsolateDone() async { } @pragma('vm:entry-point') -void notificationTapBackground( +Future notificationTapBackground( NotificationResponse notificationResponse, ) async { final sendPort = IsolateNameServer.lookupPortByName( diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index 36cd454c..0f225b73 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -47,7 +47,7 @@ abstract class PlatformInfos { return version; } - static void showDialog(BuildContext context) async { + static Future showDialog(BuildContext context) async { final version = await PlatformInfos.getVersion(); showAboutDialog( context: context, diff --git a/lib/utils/show_update_snackbar.dart b/lib/utils/show_update_snackbar.dart index 27078943..7d47f1bf 100644 --- a/lib/utils/show_update_snackbar.dart +++ b/lib/utils/show_update_snackbar.dart @@ -10,7 +10,7 @@ import 'package:fluffychat/utils/platform_infos.dart'; abstract class UpdateNotifier { static const String versionStoreKey = 'last_known_version'; - static void showUpdateSnackBar(BuildContext context) async { + static Future showUpdateSnackBar(BuildContext context) async { final scaffoldMessenger = ScaffoldMessenger.of(context); final currentVersion = await PlatformInfos.getVersion(); final store = await SharedPreferences.getInstance(); diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index bd822c99..6a0e441c 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -13,7 +13,7 @@ import 'package:fluffychat/utils/sign_in_flows/sso_login.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; -void connectToHomeserverFlow( +Future connectToHomeserverFlow( PublicHomeserverData homeserverData, BuildContext context, void Function(AsyncSnapshot) setState, diff --git a/lib/utils/size_string.dart b/lib/utils/size_string.dart index 31503307..619462ab 100644 --- a/lib/utils/size_string.dart +++ b/lib/utils/size_string.dart @@ -7,15 +7,15 @@ extension SizeString on num { if (size < 1000 * 1000) { size = size / 1000; size = (size * 10).round() / 10; - return '${size.toString()} KB'; + return '$size KB'; } if (size < 1000 * 1000 * 1000) { size = size / 1000000; size = (size * 10).round() / 10; - return '${size.toString()} MB'; + return '$size MB'; } size = size / 1000 * 1000 * 1000 * 1000; size = (size * 10).round() / 10; - return '${size.toString()} GB'; + return '$size GB'; } } diff --git a/lib/utils/url_launcher.dart b/lib/utils/url_launcher.dart index 994d40c4..d3644e49 100644 --- a/lib/utils/url_launcher.dart +++ b/lib/utils/url_launcher.dart @@ -27,7 +27,7 @@ class UrlLauncher { const UrlLauncher(this.context, this.url, [this.name]); - void launchUrl() async { + Future launchUrl() async { if (url!.toLowerCase().startsWith(AppConfig.deepLinkPrefix) || url!.toLowerCase().startsWith(AppConfig.inviteLinkPrefix) || {'#', '@', '!', '+', '\$'}.contains(url![0]) || @@ -117,7 +117,7 @@ class UrlLauncher { ); } - void openMatrixToUrl() async { + Future openMatrixToUrl() async { final matrix = Matrix.of(context); final url = this.url!.replaceFirst( AppConfig.deepLinkPrefix, diff --git a/lib/widgets/adaptive_dialogs/public_room_dialog.dart b/lib/widgets/adaptive_dialogs/public_room_dialog.dart index 7fee87bf..4d5ac858 100644 --- a/lib/widgets/adaptive_dialogs/public_room_dialog.dart +++ b/lib/widgets/adaptive_dialogs/public_room_dialog.dart @@ -23,7 +23,7 @@ class PublicRoomDialog extends StatelessWidget { const PublicRoomDialog({super.key, this.roomAlias, this.chunk, this.via}); - void _joinRoom(BuildContext context) async { + Future _joinRoom(BuildContext context) async { final client = Matrix.of(context).client; final chunk = this.chunk; final knock = chunk?.joinRule == 'knock'; diff --git a/lib/widgets/app_lock.dart b/lib/widgets/app_lock.dart index 636b38df..70f0a9ef 100644 --- a/lib/widgets/app_lock.dart +++ b/lib/widgets/app_lock.dart @@ -41,7 +41,7 @@ class AppLock extends State with WidgetsBindingObserver { WidgetsBinding.instance.addPostFrameCallback(_checkLoggedIn); } - void _checkLoggedIn(_) async { + Future _checkLoggedIn(_) async { if (widget.clients.any((client) => client.isLogged())) return; await changePincode(null); diff --git a/lib/widgets/config_viewer.dart b/lib/widgets/config_viewer.dart index 080ea494..82a9d4ba 100644 --- a/lib/widgets/config_viewer.dart +++ b/lib/widgets/config_viewer.dart @@ -16,7 +16,7 @@ class ConfigViewer extends StatefulWidget { } class _ConfigViewerState extends State { - void _changeSetting( + Future _changeSetting( AppSettings appSetting, SharedPreferences store, String initialValue, diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index c2dcb7bc..ee5708a5 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -22,7 +22,7 @@ extension LocalNotificationsExtension on MatrixState { ..src = 'assets/assets/sounds/notification.ogg' ..load(); - void showLocalNotification(Event event) async { + Future showLocalNotification(Event event) async { final roomId = event.room.id; if (activeRoomId == roomId) { if (WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed) { diff --git a/lib/widgets/lock_screen.dart b/lib/widgets/lock_screen.dart index ea4bcf8c..66a90951 100644 --- a/lib/widgets/lock_screen.dart +++ b/lib/widgets/lock_screen.dart @@ -20,7 +20,7 @@ class _LockScreenState extends State { bool _inputBlocked = false; final TextEditingController _textEditingController = TextEditingController(); - void tryUnlock(String text) async { + Future tryUnlock(String text) async { text = text.trim(); setState(() { _errorText = null; diff --git a/lib/widgets/log_view.dart b/lib/widgets/log_view.dart index 402e6406..9d34ddf2 100644 --- a/lib/widgets/log_view.dart +++ b/lib/widgets/log_view.dart @@ -81,10 +81,10 @@ extension on LogEvent { String toDisplayString() { var str = '# [${level.toString().split('.').last.toUpperCase()}] $title'; if (exception != null) { - str += ' - ${exception.toString()}'; + str += ' - $exception'; } if (stackTrace != null) { - str += '\n${stackTrace.toString()}'; + str += '\n$stackTrace'; } return str; } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 3e3fa8ef..6c66b16d 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -342,7 +342,7 @@ class MatrixState extends State with WidgetsBindingObserver { createVoipPlugin(); } - void createVoipPlugin() async { + Future createVoipPlugin() async { if (AppSettings.experimentalVoip.value) { voipPlugin = null; return; diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart index 56ecd993..e985be01 100644 --- a/lib/widgets/member_actions_popup_menu_button.dart +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -10,7 +10,7 @@ import 'adaptive_dialogs/user_dialog.dart'; import 'avatar.dart'; import 'future_loading_dialog.dart'; -void showMemberActionsPopupMenu({ +Future showMemberActionsPopupMenu({ required BuildContext context, required User user, void Function()? onMention, diff --git a/lib/widgets/mxc_image.dart b/lib/widgets/mxc_image.dart index 680fe9e2..a92338aa 100644 --- a/lib/widgets/mxc_image.dart +++ b/lib/widgets/mxc_image.dart @@ -109,7 +109,7 @@ class _MxcImageState extends State { } } - void _tryLoad() async { + Future _tryLoad() async { if (_imageData != null) { return; } diff --git a/lib/widgets/qr_code_viewer.dart b/lib/widgets/qr_code_viewer.dart index 32024f11..ac87d994 100644 --- a/lib/widgets/qr_code_viewer.dart +++ b/lib/widgets/qr_code_viewer.dart @@ -24,7 +24,7 @@ class QrCodeViewer extends StatelessWidget { const QrCodeViewer({required this.content, super.key}); - void _save(BuildContext context) async { + Future _save(BuildContext context) async { final imageResult = await showFutureLoadingDialog( context: context, future: () { diff --git a/lib/widgets/share_scaffold_dialog.dart b/lib/widgets/share_scaffold_dialog.dart index fa80896b..2a23e050 100644 --- a/lib/widgets/share_scaffold_dialog.dart +++ b/lib/widgets/share_scaffold_dialog.dart @@ -48,7 +48,7 @@ class _ShareScaffoldDialogState extends State { }); } - void _forwardAction() async { + Future _forwardAction() async { final roomId = selectedRoomId; if (roomId == null) { throw Exception( diff --git a/lib/widgets/theme_builder.dart b/lib/widgets/theme_builder.dart index 0be03731..77bda417 100644 --- a/lib/widgets/theme_builder.dart +++ b/lib/widgets/theme_builder.dart @@ -41,7 +41,7 @@ class ThemeController extends State { static ThemeController of(BuildContext context) => Provider.of(context, listen: false); - void _loadData(_) async { + Future _loadData(_) async { final preferences = _sharedPreferences ??= await SharedPreferences.getInstance(); From 00c95e008c9d5ea9fae57497e8449f04fa3eac1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Feb 2026 13:12:33 +0100 Subject: [PATCH 130/333] build: Update native imaging --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 7a779236..8a807745 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1160,10 +1160,10 @@ packages: dependency: "direct main" description: name: native_imaging - sha256: b910bd7c4fae77d9f91fb59840995e4fb91505b20a46ee1be88db3e4c4e219c4 + sha256: ced7acb18b80a431578c9068eb9c3ee75f8df39491e8adaf471635bac282d651 url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.4.0" native_toolchain_c: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5fd6fa5a..abd45f5d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -55,7 +55,7 @@ dependencies: linkify: ^5.0.0 matrix: ^6.1.1 mime: ^2.0.0 - native_imaging: ^0.3.0 + native_imaging: ^0.4.0 opus_caf_converter_dart: ^1.0.1 package_info_plus: ^9.0.0 particles_network: ^1.9.3 From 0401456481982ee8a02a657bad988bb0b1545bb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Feb 2026 19:08:09 +0100 Subject: [PATCH 131/333] feat: Remember last successful logged in homeserver --- lib/utils/sign_in_flows/check_homeserver.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index 6a0e441c..1466215b 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/config/setting_keys.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -65,6 +66,8 @@ Future connectToHomeserverFlow( return; } + await AppSettings.defaultHomeserver.setItem(homeserverInput); + if (context.mounted) { setState(AsyncSnapshot.withData(ConnectionState.done, true)); } From becdff56b1a2c16115c922fdb78fa98aa0d0aeff Mon Sep 17 00:00:00 2001 From: SpikyBee Date: Mon, 23 Feb 2026 20:12:16 +0100 Subject: [PATCH 132/333] chore(translations): Translated using Weblate (English) Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/en/ --- lib/l10n/intl_en.arb | 6627 ++++++++++++++++++++---------------------- 1 file changed, 3127 insertions(+), 3500 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index eef06b29..fa06a944 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1,3503 +1,3130 @@ { - "@@locale": "en", - "@@last_modified": "2021-08-14 12:38:37.885451", - "alwaysUse24HourFormat": "false", - "@alwaysUse24HourFormat": { - "description": "Set to true to always display time of day in 24 hour format." - }, - "repeatPassword": "Repeat password", - "@repeatPassword": {}, - "notAnImage": "Not an image file.", - "@notAnImage": {}, - "setCustomPermissionLevel": "Set custom permission level", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Please choose a predefined role below or enter a custom permission level between 0 and 100.", - "@setPermissionsLevelDescription": {}, - "ignoreUser": "Ignore user", - "@ignoreUser": {}, - "normalUser": "Normal user", - "@normalUser": {}, - "remove": "Remove", - "@remove": { - "type": "String", - "placeholders": {} - }, - "importNow": "Import now", - "@importNow": {}, - "importEmojis": "Import Emojis", - "@importEmojis": {}, - "importFromZipFile": "Import from .zip file", - "@importFromZipFile": {}, - "exportEmotePack": "Export Emote pack as .zip", - "@exportEmotePack": {}, - "replace": "Replace", - "@replace": {}, - "about": "About", - "@about": {}, - "aboutHomeserver": "About {homeserver}", - "@aboutHomeserver": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "accept": "Accept", - "@accept": { - "type": "String", - "placeholders": {} - }, - "acceptedTheInvitation": "👍 {username} accepted the invitation", - "@acceptedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "account": "Account", - "@account": { - "type": "String", - "placeholders": {} - }, - "activatedEndToEndEncryption": "🔐 {username} activated end to end encryption", - "@activatedEndToEndEncryption": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "addEmail": "Add email", - "@addEmail": { - "type": "String", - "placeholders": {} - }, - "confirmMatrixId": "Please confirm your Matrix ID in order to delete your account.", - "@confirmMatrixId": {}, - "supposedMxid": "This should be {mxid}", - "@supposedMxid": { - "type": "String", - "placeholders": { - "mxid": { - "type": "String" - } - } - }, - "addChatDescription": "Add a chat description...", - "@addChatDescription": {}, - "addToSpace": "Add to space", - "@addToSpace": {}, - "admin": "Admin", - "@admin": { - "type": "String", - "placeholders": {} - }, - "alias": "alias", - "@alias": { - "type": "String", - "placeholders": {} - }, - "all": "All", - "@all": { - "type": "String", - "placeholders": {} - }, - "allChats": "All chats", - "@allChats": { - "type": "String", - "placeholders": {} - }, - "commandHint_roomupgrade": "Upgrade this room to the given room version", - "@commandHint_roomupgrade": {}, - "commandHint_googly": "Send some googly eyes", - "@commandHint_googly": {}, - "commandHint_cuddle": "Send a cuddle", - "@commandHint_cuddle": {}, - "commandHint_hug": "Send a hug", - "@commandHint_hug": {}, - "googlyEyesContent": "{senderName} sends you googly eyes", - "@googlyEyesContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "cuddleContent": "{senderName} cuddles you", - "@cuddleContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "hugContent": "{senderName} hugs you", - "@hugContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "answeredTheCall": "{senderName} answered the call", - "@answeredTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "anyoneCanJoin": "Anyone can join", - "@anyoneCanJoin": { - "type": "String", - "placeholders": {} - }, - "appLock": "App lock", - "@appLock": { - "type": "String", - "placeholders": {} - }, - "appLockDescription": "Lock the app when not using with a pin code", - "@appLockDescription": {}, - "archive": "Archive", - "@archive": { - "type": "String", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "Are guest users allowed to join", - "@areGuestsAllowedToJoin": { - "type": "String", - "placeholders": {} - }, - "areYouSure": "Are you sure?", - "@areYouSure": { - "type": "String", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "Are you sure you want to log out?", - "@areYouSureYouWantToLogout": { - "type": "String", - "placeholders": {} - }, - "askSSSSSign": "To be able to sign the other person, please enter your secure store passphrase or recovery key.", - "@askSSSSSign": { - "type": "String", - "placeholders": {} - }, - "askVerificationRequest": "Accept this verification request from {username}?", - "@askVerificationRequest": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "autoplayImages": "Automatically play animated stickers and emotes", - "@autoplayImages": { - "type": "String", - "placeholder": {} - }, - "badServerLoginTypesException": "The homeserver supports the login types:\n{serverVersions}\nBut this app supports only:\n{supportedVersions}", - "@badServerLoginTypesException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "sendTypingNotifications": "Send typing notifications", - "@sendTypingNotifications": {}, - "swipeRightToLeftToReply": "Swipe right to left to reply", - "@swipeRightToLeftToReply": {}, - "sendOnEnter": "Send on enter", - "@sendOnEnter": {}, - "badServerVersionsException": "The homeserver supports the Spec versions:\n{serverVersions}\nBut this app supports only {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "countChatsAndCountParticipants": "{chats} chats and {participants} participants", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, - "noMoreChatsFound": "No more chats found...", - "@noMoreChatsFound": {}, - "noChatsFoundHere": "No chats found here yet. Start a new chat with someone by using the button below. ⤵️", - "@noChatsFoundHere": {}, - "joinedChats": "Joined chats", - "@joinedChats": {}, - "unread": "Unread", - "@unread": {}, - "space": "Space", - "@space": {}, - "spaces": "Spaces", - "@spaces": {}, - "banFromChat": "Ban from chat", - "@banFromChat": { - "type": "String", - "placeholders": {} - }, - "banned": "Banned", - "@banned": { - "type": "String", - "placeholders": {} - }, - "bannedUser": "{username} banned {targetName}", - "@bannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "blockDevice": "Block Device", - "@blockDevice": { - "type": "String", - "placeholders": {} - }, - "blocked": "Blocked", - "@blocked": { - "type": "String", - "placeholders": {} - }, - "botMessages": "Bot messages", - "@botMessages": { - "type": "String", - "placeholders": {} - }, - "cancel": "Cancel", - "@cancel": { - "type": "String", - "placeholders": {} - }, - "cantOpenUri": "Can't open the URI {uri}", - "@cantOpenUri": { - "type": "String", - "placeholders": { - "uri": { - "type": "String" - } - } - }, - "changeDeviceName": "Change device name", - "@changeDeviceName": { - "type": "String", - "placeholders": {} - }, - "changedTheChatAvatar": "{username} changed the chat avatar", - "@changedTheChatAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheChatDescription": "{username} changed the chat description", - "changedTheChatDescriptionTo": "{username} changed the chat description to: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "description": { - "type": "String" - } - } - }, - "changedTheChatName": "{username} changed the chat name", - "changedTheChatNameTo": "{username} changed the chat name to: '{chatname}'", - "@changedTheChatNameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "chatname": { - "type": "String" - } - } - }, - "changedTheChatPermissions": "{username} changed the chat permissions", - "@changedTheChatPermissions": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheDisplaynameTo": "{username} changed their displayname to: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "displayname": { - "type": "String" - } - } - }, - "changedTheGuestAccessRules": "{username} changed the guest access rules", - "@changedTheGuestAccessRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheGuestAccessRulesTo": "{username} changed the guest access rules to: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheHistoryVisibility": "{username} changed the history visibility", - "@changedTheHistoryVisibility": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheHistoryVisibilityTo": "{username} changed the history visibility to: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheJoinRules": "{username} changed the join rules", - "@changedTheJoinRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheJoinRulesTo": "{username} changed the join rules to: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "joinRules": { - "type": "String" - } - } - }, - "changedTheProfileAvatar": "{username} changed their avatar", - "@changedTheProfileAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheRoomAliases": "{username} changed the room aliases", - "@changedTheRoomAliases": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheRoomInvitationLink": "{username} changed the invitation link", - "@changedTheRoomInvitationLink": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changePassword": "Change password", - "@changePassword": { - "type": "String", - "placeholders": {} - }, - "changeTheHomeserver": "Change the homeserver", - "@changeTheHomeserver": { - "type": "String", - "placeholders": {} - }, - "changeTheme": "Change your style", - "@changeTheme": { - "type": "String", - "placeholders": {} - }, - "changeTheNameOfTheGroup": "Change the name of the group", - "@changeTheNameOfTheGroup": { - "type": "String", - "placeholders": {} - }, - "changeYourAvatar": "Change your avatar", - "@changeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "channelCorruptedDecryptError": "The encryption has been corrupted", - "@channelCorruptedDecryptError": { - "type": "String", - "placeholders": {} - }, - "chat": "Chat", - "@chat": { - "type": "String", - "placeholders": {} - }, - "yourChatBackupHasBeenSetUp": "Your chat backup has been set up.", - "@yourChatBackupHasBeenSetUp": {}, - "chatBackup": "Chat backup", - "@chatBackup": { - "type": "String", - "placeholders": {} - }, - "chatBackupDescription": "Your messages are secured with a recovery key. Please make sure you don't lose it.", - "@chatBackupDescription": { - "type": "String", - "placeholders": {} - }, - "chatDetails": "Chat details", - "@chatDetails": { - "type": "String", - "placeholders": {} - }, - "chatHasBeenAddedToThisSpace": "Chat has been added to this space", - "@chatHasBeenAddedToThisSpace": {}, - "chats": "Chats", - "@chats": { - "type": "String", - "placeholders": {} - }, - "chooseAStrongPassword": "Choose a strong password", - "@chooseAStrongPassword": { - "type": "String", - "placeholders": {} - }, - "clearArchive": "Clear archive", - "@clearArchive": {}, - "close": "Close", - "@close": { - "type": "String", - "placeholders": {} - }, - "commandHint_markasdm": "Mark as direct message room for the giving Matrix ID", - "@commandHint_markasdm": {}, - "commandHint_markasgroup": "Mark as group", - "@commandHint_markasgroup": {}, - "commandHint_ban": "Ban the given user from this room", - "@commandHint_ban": { - "type": "String", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "Clear cache", - "@commandHint_clearcache": { - "type": "String", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_create": "Create an empty group chat\nUse --no-encryption to disable encryption", - "@commandHint_create": { - "type": "String", - "description": "Usage hint for the command /create" - }, - "commandHint_discardsession": "Discard session", - "@commandHint_discardsession": { - "type": "String", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_dm": "Start a direct chat\nUse --no-encryption to disable encryption", - "@commandHint_dm": { - "type": "String", - "description": "Usage hint for the command /dm" - }, - "commandHint_html": "Send HTML-formatted text", - "@commandHint_html": { - "type": "String", - "description": "Usage hint for the command /html" - }, - "commandHint_invite": "Invite the given user to this room", - "@commandHint_invite": { - "type": "String", - "description": "Usage hint for the command /invite" - }, - "commandHint_join": "Join the given room", - "@commandHint_join": { - "type": "String", - "description": "Usage hint for the command /join" - }, - "commandHint_kick": "Remove the given user from this room", - "@commandHint_kick": { - "type": "String", - "description": "Usage hint for the command /kick" - }, - "commandHint_leave": "Leave this room", - "@commandHint_leave": { - "type": "String", - "description": "Usage hint for the command /leave" - }, - "commandHint_me": "Describe yourself", - "@commandHint_me": { - "type": "String", - "description": "Usage hint for the command /me" - }, - "commandHint_myroomavatar": "Set your picture for this room (by mxc-uri)", - "@commandHint_myroomavatar": { - "type": "String", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "Set your display name for this room", - "@commandHint_myroomnick": { - "type": "String", - "description": "Usage hint for the command /myroomnick" - }, - "commandHint_op": "Set the given user's power level (default: 50)", - "@commandHint_op": { - "type": "String", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "Send unformatted text", - "@commandHint_plain": { - "type": "String", - "description": "Usage hint for the command /plain" - }, - "commandHint_react": "Send reply as a reaction", - "@commandHint_react": { - "type": "String", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "Send text", - "@commandHint_send": { - "type": "String", - "description": "Usage hint for the command /send" - }, - "commandHint_unban": "Unban the given user from this room", - "@commandHint_unban": { - "type": "String", - "description": "Usage hint for the command /unban" - }, - "commandInvalid": "Command invalid", - "@commandInvalid": { - "type": "String" - }, - "commandMissing": "{command} is not a command.", - "@commandMissing": { - "type": "String", - "placeholders": { - "command": { - "type": "String" - } + "@@locale": "en", + "@@last_modified": "2021-08-14 12:38:37.885451", + "alwaysUse24HourFormat": "false", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." }, - "description": "State that {command} is not a valid /command." - }, - "compareEmojiMatch": "Please compare the emojis", - "@compareEmojiMatch": { - "type": "String", - "placeholders": {} - }, - "compareNumbersMatch": "Please compare the numbers", - "@compareNumbersMatch": { - "type": "String", - "placeholders": {} - }, - "configureChat": "Configure chat", - "@configureChat": { - "type": "String", - "placeholders": {} - }, - "confirm": "Confirm", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Connect", - "@connect": { - "type": "String", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "Contact has been invited to the group", - "@contactHasBeenInvitedToTheGroup": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "Contains display name", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Contains username", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "contentHasBeenReported": "The content has been reported to the server admins", - "@contentHasBeenReported": { - "type": "String", - "placeholders": {} - }, - "copiedToClipboard": "Copied to clipboard", - "@copiedToClipboard": { - "type": "String", - "placeholders": {} - }, - "copy": "Copy", - "@copy": { - "type": "String", - "placeholders": {} - }, - "copyToClipboard": "Copy to clipboard", - "@copyToClipboard": { - "type": "String", - "placeholders": {} - }, - "couldNotDecryptMessage": "Could not decrypt message: {error}", - "@couldNotDecryptMessage": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "checkList": "Check list", - "@checkList": {}, - "countParticipants": "{count} participants", - "@countParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "countInvited": "{count} invited", - "@countInvited": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "create": "Create", - "@create": { - "type": "String", - "placeholders": {} - }, - "createdTheChat": "💬 {username} created the chat", - "@createdTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "createGroup": "Create group", - "@createGroup": {}, - "createNewSpace": "New space", - "@createNewSpace": { - "type": "String", - "placeholders": {} - }, - "currentlyActive": "Currently active", - "@currentlyActive": { - "type": "String", - "placeholders": {} - }, - "darkTheme": "Dark", - "@darkTheme": { - "type": "String", - "placeholders": {} - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "String", - "placeholders": { - "date": { - "type": "String" - }, - "timeOfDay": { - "type": "String" - } - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "deactivateAccountWarning": "This will deactivate your user account. This can not be undone! Are you sure?", - "@deactivateAccountWarning": { - "type": "String", - "placeholders": {} - }, - "defaultPermissionLevel": "Default permission level for new users", - "@defaultPermissionLevel": { - "type": "String", - "placeholders": {} - }, - "delete": "Delete", - "@delete": { - "type": "String", - "placeholders": {} - }, - "deleteAccount": "Delete account", - "@deleteAccount": { - "type": "String", - "placeholders": {} - }, - "deleteMessage": "Delete message", - "@deleteMessage": { - "type": "String", - "placeholders": {} - }, - "device": "Device", - "@device": { - "type": "String", - "placeholders": {} - }, - "deviceId": "Device ID", - "@deviceId": { - "type": "String", - "placeholders": {} - }, - "devices": "Devices", - "@devices": { - "type": "String", - "placeholders": {} - }, - "directChats": "Direct Chats", - "@directChats": { - "type": "String", - "placeholders": {} - }, - "allRooms": "All Group Chats", - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "displaynameHasBeenChanged": "Displayname has been changed", - "@displaynameHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "downloadFile": "Download file", - "@downloadFile": { - "type": "String", - "placeholders": {} - }, - "edit": "Edit", - "@edit": { - "type": "String", - "placeholders": {} - }, - "editBlockedServers": "Edit blocked servers", - "@editBlockedServers": { - "type": "String", - "placeholders": {} - }, - "chatPermissions": "Chat permissions", - "@chatPermissions": {}, - "editDisplayname": "Edit displayname", - "@editDisplayname": { - "type": "String", - "placeholders": {} - }, - "editRoomAliases": "Edit room aliases", - "@editRoomAliases": { - "type": "String", - "placeholders": {} - }, - "editRoomAvatar": "Edit room avatar", - "@editRoomAvatar": { - "type": "String", - "placeholders": {} - }, - "emoteExists": "Emote already exists!", - "@emoteExists": { - "type": "String", - "placeholders": {} - }, - "emoteInvalid": "Invalid emote shortcode!", - "@emoteInvalid": { - "type": "String", - "placeholders": {} - }, - "emoteKeyboardNoRecents": "Recently-used emotes will appear here...", - "@emoteKeyboardNoRecents": { - "type": "String", - "placeholders": {} - }, - "emotePacks": "Emote packs for room", - "@emotePacks": { - "type": "String", - "placeholders": {} - }, - "emoteSettings": "Emote Settings", - "@emoteSettings": { - "type": "String", - "placeholders": {} - }, - "globalChatId": "Global chat ID", - "@globalChatId": {}, - "accessAndVisibility": "Access and visibility", - "@accessAndVisibility": {}, - "accessAndVisibilityDescription": "Who is allowed to join this chat and how the chat can be discovered.", - "@accessAndVisibilityDescription": {}, - "calls": "Calls", - "@calls": {}, - "customEmojisAndStickers": "Custom emojis and stickers", - "@customEmojisAndStickers": {}, - "customEmojisAndStickersBody": "Add or share custom emojis or stickers which can be used in any chat.", - "@customEmojisAndStickersBody": {}, - "emoteShortcode": "Emote shortcode", - "@emoteShortcode": { - "type": "String", - "placeholders": {} - }, - "emoteWarnNeedToPick": "You need to pick an emote shortcode and an image!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, - "emptyChat": "Empty chat", - "@emptyChat": { - "type": "String", - "placeholders": {} - }, - "enableEmotesGlobally": "Enable emote pack globally", - "@enableEmotesGlobally": { - "type": "String", - "placeholders": {} - }, - "enableEncryption": "Enable encryption", - "@enableEncryption": { - "type": "String", - "placeholders": {} - }, - "enableEncryptionWarning": "You won't be able to disable the encryption anymore. Are you sure?", - "@enableEncryptionWarning": { - "type": "String", - "placeholders": {} - }, - "encrypted": "Encrypted", - "@encrypted": { - "type": "String", - "placeholders": {} - }, - "encryption": "Encryption", - "@encryption": { - "type": "String", - "placeholders": {} - }, - "encryptionNotEnabled": "Encryption is not enabled", - "@encryptionNotEnabled": { - "type": "String", - "placeholders": {} - }, - "endedTheCall": "{senderName} ended the call", - "@endedTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "enterAnEmailAddress": "Enter an email address", - "@enterAnEmailAddress": { - "type": "String", - "placeholders": {} - }, - "homeserver": "Homeserver", - "@homeserver": {}, - "enterYourHomeserver": "Enter your homeserver", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, - "errorObtainingLocation": "Error obtaining location: {error}", - "@errorObtainingLocation": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "everythingReady": "Everything ready!", - "@everythingReady": { - "type": "String", - "placeholders": {} - }, - "extremeOffensive": "Extremely offensive", - "@extremeOffensive": { - "type": "String", - "placeholders": {} - }, - "fileName": "File name", - "@fileName": { - "type": "String", - "placeholders": {} - }, - "fluffychat": "FluffyChat", - "@fluffychat": { - "type": "String", - "placeholders": {} - }, - "fontSize": "Font size", - "@fontSize": { - "type": "String", - "placeholders": {} - }, - "forward": "Forward", - "@forward": { - "type": "String", - "placeholders": {} - }, - "fromJoining": "From joining", - "@fromJoining": { - "type": "String", - "placeholders": {} - }, - "fromTheInvitation": "From the invitation", - "@fromTheInvitation": { - "type": "String", - "placeholders": {} - }, - "goToTheNewRoom": "Go to the new room", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, - "group": "Group", - "@group": { - "type": "String", - "placeholders": {} - }, - "chatDescription": "Chat description", - "@chatDescription": {}, - "chatDescriptionHasBeenChanged": "Chat description changed", - "@chatDescriptionHasBeenChanged": {}, - "groupIsPublic": "Group is public", - "@groupIsPublic": { - "type": "String", - "placeholders": {} - }, - "groups": "Groups", - "@groups": { - "type": "String", - "placeholders": {} - }, - "groupWith": "Group with {displayname}", - "@groupWith": { - "type": "String", - "placeholders": { - "displayname": { - "type": "String" - } - } - }, - "guestsAreForbidden": "Guests are forbidden", - "@guestsAreForbidden": { - "type": "String", - "placeholders": {} - }, - "guestsCanJoin": "Guests can join", - "@guestsCanJoin": { - "type": "String", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{username} has withdrawn the invitation for {targetName}", - "@hasWithdrawnTheInvitationFor": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "help": "Help", - "@help": { - "type": "String", - "placeholders": {} - }, - "hideRedactedEvents": "Hide redacted events", - "@hideRedactedEvents": { - "type": "String", - "placeholders": {} - }, - "hideRedactedMessages": "Hide redacted messages", - "@hideRedactedMessages": {}, - "hideRedactedMessagesBody": "If someone redacts a message, this message won't be visible in the chat anymore.", - "@hideRedactedMessagesBody": {}, - "hideInvalidOrUnknownMessageFormats": "Hide invalid or unknown message formats", - "@hideInvalidOrUnknownMessageFormats": {}, - "howOffensiveIsThisContent": "How offensive is this content?", - "@howOffensiveIsThisContent": { - "type": "String", - "placeholders": {} - }, - "id": "ID", - "@id": { - "type": "String", - "placeholders": {} - }, - "identity": "Identity", - "@identity": { - "type": "String", - "placeholders": {} - }, - "block": "Block", - "@block": {}, - "blockedUsers": "Blocked users", - "@blockedUsers": {}, - "blockListDescription": "You can block users who are disturbing you. You won't be able to receive any messages or room invites from the users on your personal block list.", - "@blockListDescription": {}, - "blockUsername": "Ignore username", - "@blockUsername": {}, - "iHaveClickedOnLink": "I have clicked on the link", - "@iHaveClickedOnLink": { - "type": "String", - "placeholders": {} - }, - "incorrectPassphraseOrKey": "Incorrect passphrase or recovery key", - "@incorrectPassphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "inoffensive": "Inoffensive", - "@inoffensive": { - "type": "String", - "placeholders": {} - }, - "inviteContact": "Invite contact", - "@inviteContact": { - "type": "String", - "placeholders": {} - }, - "inviteContactToGroupQuestion": "Do you want to invite {contact} to the chat \"{groupName}\"?", - "@inviteContactToGroupQuestion": {}, - "inviteContactToGroup": "Invite contact to {groupName}", - "@inviteContactToGroup": { - "type": "String", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "noChatDescriptionYet": "No chat description created yet.", - "@noChatDescriptionYet": {}, - "tryAgain": "Try again", - "@tryAgain": {}, - "invalidServerName": "Invalid server name", - "@invalidServerName": {}, - "invited": "Invited", - "@invited": { - "type": "String", - "placeholders": {} - }, - "redactMessageDescription": "The message will be redacted for all participants in this conversation. This cannot be undone.", - "@redactMessageDescription": {}, - "optionalRedactReason": "(Optional) Reason for redacting this message...", - "@optionalRedactReason": {}, - "invitedUser": "📩 {username} invited {targetName}", - "@invitedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "invitedUsersOnly": "Invited users only", - "@invitedUsersOnly": { - "type": "String", - "placeholders": {} - }, - "inviteForMe": "Invite for me", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, - "inviteText": "{username} invited you to FluffyChat.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n {link}", - "@inviteText": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "isTyping": "is typing…", - "@isTyping": { - "type": "String", - "placeholders": {} - }, - "joinedTheChat": "👋 {username} joined the chat", - "@joinedTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "joinRoom": "Join room", - "@joinRoom": { - "type": "String", - "placeholders": {} - }, - "kicked": "👞 {username} kicked {targetName}", - "@kicked": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "kickedAndBanned": "🙅 {username} kicked and banned {targetName}", - "@kickedAndBanned": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "kickFromChat": "Kick from chat", - "@kickFromChat": { - "type": "String", - "placeholders": {} - }, - "lastActiveAgo": "Last active: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "String", - "placeholders": { - "localizedTimeShort": { - "type": "String" - } - } - }, - "leave": "Leave", - "@leave": { - "type": "String", - "placeholders": {} - }, - "leftTheChat": "Left the chat", - "@leftTheChat": { - "type": "String", - "placeholders": {} - }, - "license": "License", - "@license": { - "type": "String", - "placeholders": {} - }, - "lightTheme": "Light", - "@lightTheme": { - "type": "String", - "placeholders": {} - }, - "loadCountMoreParticipants": "Load {count} more participants", - "@loadCountMoreParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dehydrate": "Export session and wipe device", - "@dehydrate": {}, - "dehydrateWarning": "This action cannot be undone. Ensure you safely store the backup file.", - "@dehydrateWarning": {}, - "dehydrateTor": "TOR Users: Export session", - "@dehydrateTor": {}, - "dehydrateTorLong": "For TOR users, it is recommended to export the session before closing the window.", - "@dehydrateTorLong": {}, - "hydrateTor": "TOR Users: Import session export", - "@hydrateTor": {}, - "hydrateTorLong": "Did you export your session last time on TOR? Quickly import it and continue chatting.", - "@hydrateTorLong": {}, - "hydrate": "Restore from backup file", - "@hydrate": {}, - "loadingPleaseWait": "Loading… Please wait.", - "@loadingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "loadMore": "Load more…", - "@loadMore": { - "type": "String", - "placeholders": {} - }, - "locationDisabledNotice": "Location services are disabled. Please enable them to be able to share your location.", - "@locationDisabledNotice": { - "type": "String", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "Location permission denied. Please grant them to be able to share your location.", - "@locationPermissionDeniedNotice": { - "type": "String", - "placeholders": {} - }, - "login": "Login", - "@login": { - "type": "String", - "placeholders": {} - }, - "logInTo": "Log in to {homeserver}", - "@logInTo": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "logout": "Logout", - "@logout": { - "type": "String", - "placeholders": {} - }, - "memberChanges": "Member changes", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, - "mention": "Mention", - "@mention": { - "type": "String", - "placeholders": {} - }, - "messages": "Messages", - "@messages": { - "type": "String", - "placeholders": {} - }, - "messagesStyle": "Messages:", - "@messagesStyle": {}, - "moderator": "Moderator", - "@moderator": { - "type": "String", - "placeholders": {} - }, - "muteChat": "Mute chat", - "@muteChat": { - "type": "String", - "placeholders": {} - }, - "needPantalaimonWarning": "Please be aware that you need Pantalaimon to use end-to-end encryption for now.", - "@needPantalaimonWarning": { - "type": "String", - "placeholders": {} - }, - "newChat": "New chat", - "@newChat": { - "type": "String", - "placeholders": {} - }, - "newMessageInFluffyChat": "💬 New message in FluffyChat", - "@newMessageInFluffyChat": { - "type": "String", - "placeholders": {} - }, - "newVerificationRequest": "New verification request!", - "@newVerificationRequest": { - "type": "String", - "placeholders": {} - }, - "next": "Next", - "@next": { - "type": "String", - "placeholders": {} - }, - "no": "No", - "@no": { - "type": "String", - "placeholders": {} - }, - "noConnectionToTheServer": "No connection to the server", - "@noConnectionToTheServer": { - "type": "String", - "placeholders": {} - }, - "noEmotesFound": "No emotes found. 😕", - "@noEmotesFound": { - "type": "String", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "You can only activate encryption as soon as the room is no longer publicly accessible.", - "@noEncryptionForPublicRooms": { - "type": "String", - "placeholders": {} - }, - "noGoogleServicesWarning": "Firebase Cloud Messaging doesn't appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.", - "@noGoogleServicesWarning": { - "type": "String", - "placeholders": {} - }, - "noMatrixServer": "{server1} is no matrix server, use {server2} instead?", - "@noMatrixServer": { - "type": "String", - "placeholders": { - "server1": { - "type": "String" - }, - "server2": { - "type": "String" - } - } - }, - "shareInviteLink": "Share invite link", - "@shareInviteLink": {}, - "scanQrCode": "Scan QR code", - "@scanQrCode": {}, - "none": "None", - "@none": { - "type": "String", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "You have not added a way to recover your password yet.", - "@noPasswordRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "noPermission": "No permission", - "@noPermission": { - "type": "String", - "placeholders": {} - }, - "noRoomsFound": "No rooms found…", - "@noRoomsFound": { - "type": "String", - "placeholders": {} - }, - "notifications": "Notifications", - "@notifications": { - "type": "String", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Notifications enabled for this account", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, - "numUsersTyping": "{count} users are typing…", - "@numUsersTyping": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "obtainingLocation": "Obtaining location…", - "@obtainingLocation": { - "type": "String", - "placeholders": {} - }, - "offensive": "Offensive", - "@offensive": { - "type": "String", - "placeholders": {} - }, - "offline": "Offline", - "@offline": { - "type": "String", - "placeholders": {} - }, - "ok": "Ok", - "@ok": { - "type": "String", - "placeholders": {} - }, - "online": "Online", - "@online": { - "type": "String", - "placeholders": {} - }, - "onlineKeyBackupEnabled": "Online Key Backup is enabled", - "@onlineKeyBackupEnabled": { - "type": "String", - "placeholders": {} - }, - "oopsPushError": "Oops! Unfortunately, an error occurred when setting up the push notifications.", - "@oopsPushError": { - "type": "String", - "placeholders": {} - }, - "oopsSomethingWentWrong": "Oops, something went wrong…", - "@oopsSomethingWentWrong": { - "type": "String", - "placeholders": {} - }, - "openAppToReadMessages": "Open app to read messages", - "@openAppToReadMessages": { - "type": "String", - "placeholders": {} - }, - "openCamera": "Open camera", - "@openCamera": { - "type": "String", - "placeholders": {} - }, - "openVideoCamera": "Open camera for a video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "oneClientLoggedOut": "One of your clients has been logged out", - "@oneClientLoggedOut": {}, - "addAccount": "Add account", - "@addAccount": {}, - "editBundlesForAccount": "Edit bundles for this account", - "@editBundlesForAccount": {}, - "addToBundle": "Add to bundle", - "@addToBundle": {}, - "removeFromBundle": "Remove from this bundle", - "@removeFromBundle": {}, - "bundleName": "Bundle name", - "@bundleName": {}, - "enableMultiAccounts": "(BETA) Enable multi accounts on this device", - "@enableMultiAccounts": {}, - "openInMaps": "Open in maps", - "@openInMaps": { - "type": "String", - "placeholders": {} - }, - "link": "Link", - "@link": {}, - "serverRequiresEmail": "This server needs to validate your email address for registration.", - "@serverRequiresEmail": {}, - "or": "Or", - "@or": { - "type": "String", - "placeholders": {} - }, - "participant": "Participant", - "@participant": { - "type": "String", - "placeholders": {} - }, - "passphraseOrKey": "passphrase or recovery key", - "@passphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "password": "Password", - "@password": { - "type": "String", - "placeholders": {} - }, - "passwordForgotten": "Password forgotten", - "@passwordForgotten": { - "type": "String", - "placeholders": {} - }, - "passwordHasBeenChanged": "Password has been changed", - "@passwordHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "hideMemberChangesInPublicChats": "Hide member changes in public chats", - "@hideMemberChangesInPublicChats": {}, - "hideMemberChangesInPublicChatsBody": "Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.", - "@hideMemberChangesInPublicChatsBody": {}, - "overview": "Overview", - "@overview": {}, - "notifyMeFor": "Notify me for", - "@notifyMeFor": {}, - "passwordRecoverySettings": "Password recovery settings", - "@passwordRecoverySettings": {}, - "passwordRecovery": "Password recovery", - "@passwordRecovery": { - "type": "String", - "placeholders": {} - }, - "people": "People", - "@people": { - "type": "String", - "placeholders": {} - }, - "pickImage": "Pick an image", - "@pickImage": { - "type": "String", - "placeholders": {} - }, - "pin": "Pin", - "@pin": { - "type": "String", - "placeholders": {} - }, - "play": "Play {fileName}", - "@play": { - "type": "String", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "pleaseChoose": "Please choose", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, - "pleaseChooseAPasscode": "Please choose a pass code", - "@pleaseChooseAPasscode": { - "type": "String", - "placeholders": {} - }, - "pleaseClickOnLink": "Please click on the link in the email and then proceed.", - "@pleaseClickOnLink": { - "type": "String", - "placeholders": {} - }, - "pleaseEnter4Digits": "Please enter 4 digits or leave empty to disable app lock.", - "@pleaseEnter4Digits": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterRecoveryKey": "Please enter your recovery key:", - "@pleaseEnterRecoveryKey": {}, - "pleaseEnterYourPassword": "Please enter your password", - "@pleaseEnterYourPassword": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourPin": "Please enter your pin", - "@pleaseEnterYourPin": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourUsername": "Please enter your username", - "@pleaseEnterYourUsername": { - "type": "String", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "Please follow the instructions on the website and tap on next.", - "@pleaseFollowInstructionsOnWeb": { - "type": "String", - "placeholders": {} - }, - "privacy": "Privacy", - "@privacy": { - "type": "String", - "placeholders": {} - }, - "publicRooms": "Public Rooms", - "@publicRooms": { - "type": "String", - "placeholders": {} - }, - "pushRules": "Push rules", - "@pushRules": { - "type": "String", - "placeholders": {} - }, - "reason": "Reason", - "@reason": { - "type": "String", - "placeholders": {} - }, - "recording": "Recording", - "@recording": { - "type": "String", - "placeholders": {} - }, - "redactedBy": "Redacted by {username}", - "@redactedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "directChat": "Direct chat", - "@directChat": {}, - "redactedByBecause": "Redacted by {username} because: \"{reason}\"", - "@redactedByBecause": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "reason": { - "type": "String" - } - } - }, - "redactedAnEvent": "{username} redacted an event", - "@redactedAnEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "redactMessage": "Redact message", - "@redactMessage": { - "type": "String", - "placeholders": {} - }, - "register": "Register", - "@register": { - "type": "String", - "placeholders": {} - }, - "reject": "Reject", - "@reject": { - "type": "String", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} rejected the invitation", - "@rejectedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "rejoin": "Rejoin", - "@rejoin": { - "type": "String", - "placeholders": {} - }, - "removeAllOtherDevices": "Remove all other devices", - "@removeAllOtherDevices": { - "type": "String", - "placeholders": {} - }, - "removedBy": "Removed by {username}", - "@removedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "removeDevice": "Remove device", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, - "unbanFromChat": "Unban from chat", - "@unbanFromChat": { - "type": "String", - "placeholders": {} - }, - "removeYourAvatar": "Remove your avatar", - "@removeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "Replace room with newer version", - "@replaceRoomWithNewerVersion": { - "type": "String", - "placeholders": {} - }, - "reply": "Reply", - "@reply": { - "type": "String", - "placeholders": {} - }, - "reportMessage": "Report message", - "@reportMessage": { - "type": "String", - "placeholders": {} - }, - "requestPermission": "Request permission", - "@requestPermission": { - "type": "String", - "placeholders": {} - }, - "roomHasBeenUpgraded": "Room has been upgraded", - "@roomHasBeenUpgraded": { - "type": "String", - "placeholders": {} - }, - "roomVersion": "Room version", - "@roomVersion": { - "type": "String", - "placeholders": {} - }, - "saveFile": "Save file", - "@saveFile": { - "type": "String", - "placeholders": {} - }, - "search": "Search", - "@search": { - "type": "String", - "placeholders": {} - }, - "security": "Security", - "@security": { - "type": "String", - "placeholders": {} - }, - "recoveryKey": "Recovery key", - "@recoveryKey": {}, - "recoveryKeyLost": "Recovery key lost?", - "@recoveryKeyLost": {}, - "seenByUser": "Seen by {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "send": "Send", - "@send": { - "type": "String", - "placeholders": {} - }, - "sendAMessage": "Send a message", - "@sendAMessage": { - "type": "String", - "placeholders": {} - }, - "sendAsText": "Send as text", - "@sendAsText": { - "type": "String" - }, - "sendAudio": "Send audio", - "@sendAudio": { - "type": "String", - "placeholders": {} - }, - "sendFile": "Send file", - "@sendFile": { - "type": "String", - "placeholders": {} - }, - "sendImage": "Send image", - "@sendImage": { - "type": "String", - "placeholders": {} - }, - "sendImages": "Send {count} image", - "@sendImages": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "sendMessages": "Send messages", - "@sendMessages": { - "type": "String", - "placeholders": {} - }, - "sendOriginal": "Send original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Send sticker", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "sendVideo": "Send video", - "@sendVideo": { - "type": "String", - "placeholders": {} - }, - "sentAFile": "📁 {username} sent a file", - "@sentAFile": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAnAudio": "🎤 {username} sent an audio", - "@sentAnAudio": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAPicture": "🖼️ {username} sent a picture", - "@sentAPicture": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentASticker": "😊 {username} sent a sticker", - "@sentASticker": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAVideo": "🎥 {username} sent a video", - "@sentAVideo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentCallInformations": "{senderName} sent call information", - "@sentCallInformations": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "separateChatTypes": "Separate Direct Chats and Groups", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "setAsCanonicalAlias": "Set as main alias", - "@setAsCanonicalAlias": { - "type": "String", - "placeholders": {} - }, - "setCustomEmotes": "Set custom emotes", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setChatDescription": "Set chat description", - "@setChatDescription": {}, - "setInvitationLink": "Set invitation link", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Set permissions level", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "setStatus": "Set status", - "@setStatus": { - "type": "String", - "placeholders": {} - }, - "settings": "Settings", - "@settings": { - "type": "String", - "placeholders": {} - }, - "share": "Share", - "@share": { - "type": "String", - "placeholders": {} - }, - "sharedTheLocation": "{username} shared their location", - "@sharedTheLocation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "shareLocation": "Share location", - "@shareLocation": { - "type": "String", - "placeholders": {} - }, - "showPassword": "Show password", - "@showPassword": { - "type": "String", - "placeholders": {} - }, - "presenceStyle": "Presence:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, - "presencesToggle": "Show status messages from other users", - "@presencesToggle": { - "type": "String", - "placeholders": {} - }, - "singlesignon": "Single Sign on", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "skip": "Skip", - "@skip": { - "type": "String", - "placeholders": {} - }, - "sourceCode": "Source code", - "@sourceCode": { - "type": "String", - "placeholders": {} - }, - "spaceIsPublic": "Space is public", - "@spaceIsPublic": { - "type": "String", - "placeholders": {} - }, - "spaceName": "Space name", - "@spaceName": { - "type": "String", - "placeholders": {} - }, - "startedACall": "{senderName} started a call", - "@startedACall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "startFirstChat": "Start your first chat", - "@startFirstChat": {}, - "status": "Status", - "@status": { - "type": "String", - "placeholders": {} - }, - "statusExampleMessage": "How are you today?", - "@statusExampleMessage": { - "type": "String", - "placeholders": {} - }, - "submit": "Submit", - "@submit": { - "type": "String", - "placeholders": {} - }, - "synchronizingPleaseWait": "Synchronizing… Please wait.", - "@synchronizingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "synchronizingPleaseWaitCounter": " Synchronizing… ({percentage}%)", - "@synchronizingPleaseWaitCounter": { - "type": "String", - "placeholders": { - "percentage": { - "type": "String" - } - } - }, - "systemTheme": "System", - "@systemTheme": { - "type": "String", - "placeholders": {} - }, - "theyDontMatch": "They Don't Match", - "@theyDontMatch": { - "type": "String", - "placeholders": {} - }, - "theyMatch": "They Match", - "@theyMatch": { - "type": "String", - "placeholders": {} - }, - "title": "FluffyChat", - "@title": { - "description": "Title for the application", - "type": "String", - "placeholders": {} - }, - "toggleFavorite": "Toggle Favorite", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Toggle Muted", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Mark Read/Unread", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "tooManyRequestsWarning": "Too many requests. Please try again later!", - "@tooManyRequestsWarning": { - "type": "String", - "placeholders": {} - }, - "transferFromAnotherDevice": "Transfer from another device", - "@transferFromAnotherDevice": { - "type": "String", - "placeholders": {} - }, - "tryToSendAgain": "Try to send again", - "@tryToSendAgain": { - "type": "String", - "placeholders": {} - }, - "unavailable": "Unavailable", - "@unavailable": { - "type": "String", - "placeholders": {} - }, - "unbannedUser": "{username} unbanned {targetName}", - "@unbannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "unblockDevice": "Unblock Device", - "@unblockDevice": { - "type": "String", - "placeholders": {} - }, - "unknownDevice": "Unknown device", - "@unknownDevice": { - "type": "String", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "Unknown encryption algorithm", - "@unknownEncryptionAlgorithm": { - "type": "String", - "placeholders": {} - }, - "unknownEvent": "Unknown event '{type}'", - "@unknownEvent": { - "type": "String", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "unmuteChat": "Unmute chat", - "@unmuteChat": { - "type": "String", - "placeholders": {} - }, - "unpin": "Unpin", - "@unpin": { - "type": "String", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, - "userAndOthersAreTyping": "{username} and {count} others are typing…", - "@userAndOthersAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "userAndUserAreTyping": "{username} and {username2} are typing…", - "@userAndUserAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "username2": { - "type": "String" - } - } - }, - "userIsTyping": "{username} is typing…", - "@userIsTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "userLeftTheChat": "🚪 {username} left the chat", - "@userLeftTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "username": "Username", - "@username": { - "type": "String", - "placeholders": {} - }, - "userSentUnknownEvent": "{username} sent a {type} event", - "@userSentUnknownEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "type": { - "type": "String" - } - } - }, - "unverified": "Unverified", - "@unverified": {}, - "verified": "Verified", - "@verified": { - "type": "String", - "placeholders": {} - }, - "verify": "Verify", - "@verify": { - "type": "String", - "placeholders": {} - }, - "verifyStart": "Start Verification", - "@verifyStart": { - "type": "String", - "placeholders": {} - }, - "verifySuccess": "You successfully verified!", - "@verifySuccess": { - "type": "String", - "placeholders": {} - }, - "verifyTitle": "Verifying other account", - "@verifyTitle": { - "type": "String", - "placeholders": {} - }, - "videoCall": "Video call", - "@videoCall": { - "type": "String", - "placeholders": {} - }, - "visibilityOfTheChatHistory": "Visibility of the chat history", - "@visibilityOfTheChatHistory": { - "type": "String", - "placeholders": {} - }, - "visibleForAllParticipants": "Visible for all participants", - "@visibleForAllParticipants": { - "type": "String", - "placeholders": {} - }, - "visibleForEveryone": "Visible for everyone", - "@visibleForEveryone": { - "type": "String", - "placeholders": {} - }, - "voiceMessage": "Voice message", - "@voiceMessage": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerAcceptRequest": "Waiting for partner to accept the request…", - "@waitingPartnerAcceptRequest": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerEmoji": "Waiting for partner to accept the emoji…", - "@waitingPartnerEmoji": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerNumbers": "Waiting for partner to accept the numbers…", - "@waitingPartnerNumbers": { - "type": "String", - "placeholders": {} - }, - "wallpaper": "Wallpaper:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, - "warning": "Warning!", - "@warning": { - "type": "String", - "placeholders": {} - }, - "weSentYouAnEmail": "We sent you an email", - "@weSentYouAnEmail": { - "type": "String", - "placeholders": {} - }, - "whoCanPerformWhichAction": "Who can perform which action", - "@whoCanPerformWhichAction": { - "type": "String", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "Who is allowed to join this group", - "@whoIsAllowedToJoinThisGroup": { - "type": "String", - "placeholders": {} - }, - "whyDoYouWantToReportThis": "Why do you want to report this?", - "@whyDoYouWantToReportThis": { - "type": "String", - "placeholders": {} - }, - "wipeChatBackup": "Wipe your chat backup to create a new recovery key?", - "@wipeChatBackup": { - "type": "String", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "With these addresses you can recover your password.", - "@withTheseAddressesRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "writeAMessage": "Write a message…", - "@writeAMessage": { - "type": "String", - "placeholders": {} - }, - "yes": "Yes", - "@yes": { - "type": "String", - "placeholders": {} - }, - "you": "You", - "@you": { - "type": "String", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "You are no longer participating in this chat", - "@youAreNoLongerParticipatingInThisChat": { - "type": "String", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "You have been banned from this chat", - "@youHaveBeenBannedFromThisChat": { - "type": "String", - "placeholders": {} - }, - "yourPublicKey": "Your public key", - "@yourPublicKey": { - "type": "String", - "placeholders": {} - }, - "messageInfo": "Message info", - "@messageInfo": {}, - "time": "Time", - "@time": {}, - "messageType": "Message Type", - "@messageType": {}, - "sender": "Sender", - "@sender": {}, - "openGallery": "Open gallery", - "@openGallery": {}, - "removeFromSpace": "Remove from space", - "@removeFromSpace": {}, - "addToSpaceDescription": "Select a space to add this chat to it.", - "@addToSpaceDescription": {}, - "start": "Start", - "@start": {}, - "pleaseEnterRecoveryKeyDescription": "To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.", - "@pleaseEnterRecoveryKeyDescription": {}, - "publish": "Publish", - "@publish": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "openChat": "Open Chat", - "@openChat": {}, - "markAsRead": "Mark as read", - "@markAsRead": {}, - "reportUser": "Report user", - "@reportUser": {}, - "dismiss": "Dismiss", - "@dismiss": {}, - "reactedWith": "{sender} reacted with {reaction}", - "@reactedWith": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - }, - "reaction": { - "type": "String" - } - } - }, - "pinMessage": "Pin to room", - "@pinMessage": {}, - "confirmEventUnpin": "Are you sure to permanently unpin the event?", - "@confirmEventUnpin": {}, - "emojis": "Emojis", - "@emojis": {}, - "placeCall": "Place call", - "@placeCall": {}, - "voiceCall": "Voice call", - "@voiceCall": {}, - "unsupportedAndroidVersion": "Unsupported Android version", - "@unsupportedAndroidVersion": {}, - "unsupportedAndroidVersionLong": "This feature requires a newer Android version. Please check for updates or Lineage OS support.", - "@unsupportedAndroidVersionLong": {}, - "videoCallsBetaWarning": "Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "Experimental video calls", - "@experimentalVideoCalls": {}, - "emailOrUsername": "Email or username", - "@emailOrUsername": {}, - "indexedDbErrorTitle": "Private mode issues", - "@indexedDbErrorTitle": {}, - "indexedDbErrorLong": "The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run FluffyChat.", - "@indexedDbErrorLong": {}, - "switchToAccount": "Switch to account {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Next account", - "@nextAccount": {}, - "previousAccount": "Previous account", - "@previousAccount": {}, - "addWidget": "Add widget", - "@addWidget": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetEtherpad": "Text note", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Custom", - "@widgetCustom": {}, - "widgetName": "Name", - "@widgetName": {}, - "widgetUrlError": "This is not a valid URL.", - "@widgetUrlError": {}, - "widgetNameError": "Please provide a display name.", - "@widgetNameError": {}, - "errorAddingWidget": "Error adding the widget.", - "@errorAddingWidget": {}, - "youRejectedTheInvitation": "You rejected the invitation", - "@youRejectedTheInvitation": {}, - "youJoinedTheChat": "You joined the chat", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "👍 You accepted the invitation", - "@youAcceptedTheInvitation": {}, - "youBannedUser": "You banned {user}", - "@youBannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youHaveWithdrawnTheInvitationFor": "You have withdrawn the invitation for {user}", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youInvitedToBy": "📩 You have been invited via link to:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "youInvitedBy": "📩 You have been invited by {user}", - "@youInvitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "invitedBy": "📩 Invited by {user}", - "@invitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youInvitedUser": "📩 You invited {user}", - "@youInvitedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youKicked": "👞 You kicked {user}", - "@youKicked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youKickedAndBanned": "🙅 You kicked and banned {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youUnbannedUser": "You unbanned {user}", - "@youUnbannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "hasKnocked": "🚪 {user} has knocked", - "@hasKnocked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "usersMustKnock": "Users must knock", - "@usersMustKnock": {}, - "noOneCanJoin": "No one can join", - "@noOneCanJoin": {}, - "userWouldLikeToChangeTheChat": "{user} would like to join the chat.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "No public link has been created yet", - "@noPublicLinkHasBeenCreatedYet": {}, - "knock": "Knock", - "@knock": {}, - "users": "Users", - "@users": {}, - "unlockOldMessages": "Unlock old messages", - "@unlockOldMessages": {}, - "storeInSecureStorageDescription": "Store the recovery key in the secure storage of this device.", - "@storeInSecureStorageDescription": {}, - "saveKeyManuallyDescription": "Save this key manually by triggering the system share dialog or clipboard.", - "@saveKeyManuallyDescription": {}, - "storeInAndroidKeystore": "Store in Android KeyStore", - "@storeInAndroidKeystore": {}, - "storeInAppleKeyChain": "Store in Apple KeyChain", - "@storeInAppleKeyChain": {}, - "storeSecurlyOnThisDevice": "Store securely on this device", - "@storeSecurlyOnThisDevice": {}, - "countFiles": "{count} files", - "@countFiles": { - "placeholders": { - "count": { - "type": "int" - } - } - }, - "user": "User", - "@user": {}, - "custom": "Custom", - "@custom": {}, - "foregroundServiceRunning": "This notification appears when the foreground service is running.", - "@foregroundServiceRunning": {}, - "screenSharingTitle": "screen sharing", - "@screenSharingTitle": {}, - "screenSharingDetail": "You are sharing your screen in FuffyChat", - "@screenSharingDetail": {}, - "callingPermissions": "Calling permissions", - "@callingPermissions": {}, - "callingAccount": "Calling account", - "@callingAccount": {}, - "callingAccountDetails": "Allows FluffyChat to use the native android dialer app.", - "@callingAccountDetails": {}, - "appearOnTop": "Appear on top", - "@appearOnTop": {}, - "appearOnTopDetails": "Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)", - "@appearOnTopDetails": {}, - "otherCallingPermissions": "Microphone, camera and other FluffyChat permissions", - "@otherCallingPermissions": {}, - "whyIsThisMessageEncrypted": "Why is this message unreadable?", - "@whyIsThisMessageEncrypted": {}, - "noKeyForThisMessage": "This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.", - "@noKeyForThisMessage": {}, - "newGroup": "New group", - "@newGroup": {}, - "newSpace": "New space", - "@newSpace": {}, - "enterSpace": "Enter space", - "@enterSpace": {}, - "enterRoom": "Enter room", - "@enterRoom": {}, - "allSpaces": "All spaces", - "@allSpaces": {}, - "numChats": "{number} chats", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Hide unimportant state events", - "@hideUnimportantStateEvents": {}, - "hidePresences": "Hide Status List?", - "@hidePresences": {}, - "doNotShowAgain": "Do not show again", - "@doNotShowAgain": {}, - "wasDirectChatDisplayName": "Empty chat (was {oldDisplayName})", - "@wasDirectChatDisplayName": { - "type": "String", - "placeholders": { - "oldDisplayName": { - "type": "String" - } - } - }, - "newSpaceDescription": "Spaces allows you to consolidate your chats and build private or public communities.", - "@newSpaceDescription": {}, - "encryptThisChat": "Encrypt this chat", - "@encryptThisChat": {}, - "disableEncryptionWarning": "For security reasons you can not disable encryption in a chat, where it has been enabled before.", - "@disableEncryptionWarning": {}, - "sorryThatsNotPossible": "Sorry... that is not possible", - "@sorryThatsNotPossible": {}, - "deviceKeys": "Device keys:", - "@deviceKeys": {}, - "reopenChat": "Reopen chat", - "@reopenChat": {}, - "noBackupWarning": "Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.", - "@noBackupWarning": {}, - "noOtherDevicesFound": "No other devices found", - "@noOtherDevicesFound": {}, - "fileIsTooBigForServer": "Unable to send! The server only supports attachments up to {max}.", - "@fileIsTooBigForServer": { - "type": "String", - "placeholders": { - "max": { - "type": "String" - } - } - }, - "fileHasBeenSavedAt": "File has been saved at {path}", - "@fileHasBeenSavedAt": { - "type": "String", - "placeholders": { - "path": { - "type": "String" - } - } - }, - "jumpToLastReadMessage": "Jump to last read message", - "@jumpToLastReadMessage": {}, - "readUpToHere": "Read up to here", - "@readUpToHere": {}, - "jump": "Jump", - "@jump": {}, - "openLinkInBrowser": "Open link in browser", - "@openLinkInBrowser": {}, - "reportErrorDescription": "😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.", - "@reportErrorDescription": {}, - "report": "report", - "@report": {}, - "signInWithPassword": "Sign in with password", - "@signInWithPassword": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Please try again later or choose a different server.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "profileNotFound": "The user could not be found on the server. Maybe there is a connection problem or the user doesn't exist.", - "@profileNotFound": {}, - "setTheme": "Set theme:", - "@setTheme": {}, - "setColorTheme": "Set color theme:", - "@setColorTheme": {}, - "invite": "Invite", - "@invite": {}, - "inviteGroupChat": "📨 Group chat invite", - "@inviteGroupChat": {}, - "invitePrivateChat": "📨 Private chat invite", - "@invitePrivateChat": {}, - "invalidInput": "Invalid input!", - "@invalidInput": {}, - "wrongPinEntered": "Wrong pin entered! Try again in {seconds} seconds...", - "@wrongPinEntered": { - "type": "String", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "pleaseEnterANumber": "Please enter a number greater than 0", - "@pleaseEnterANumber": {}, - "archiveRoomDescription": "The chat will be moved to the archive. Other users will be able to see that you have left the chat.", - "@archiveRoomDescription": {}, - "roomUpgradeDescription": "The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, - "removeDevicesDescription": "You will be logged out of this device and will no longer be able to receive messages.", - "@removeDevicesDescription": {}, - "banUserDescription": "The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.", - "@banUserDescription": {}, - "unbanUserDescription": "The user will be able to enter the chat again if they try.", - "@unbanUserDescription": {}, - "kickUserDescription": "The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.", - "@kickUserDescription": {}, - "makeAdminDescription": "Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.", - "@makeAdminDescription": {}, - "pushNotificationsNotAvailable": "Push notifications not available", - "@pushNotificationsNotAvailable": {}, - "learnMore": "Learn more", - "@learnMore": {}, - "yourGlobalUserIdIs": "Your global user-ID is: ", - "@yourGlobalUserIdIs": {}, - "noUsersFoundWithQuery": "Unfortunately no user could be found with \"{query}\". Please check whether you made a typo.", - "@noUsersFoundWithQuery": { - "type": "String", - "placeholders": { - "query": { - "type": "String" - } - } - }, - "knocking": "Knocking", - "@knocking": {}, - "chatCanBeDiscoveredViaSearchOnServer": "Chat can be discovered via the search on {server}", - "@chatCanBeDiscoveredViaSearchOnServer": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "searchChatsRooms": "Search for #chats, @users...", - "@searchChatsRooms": {}, - "nothingFound": "Nothing found...", - "@nothingFound": {}, - "groupName": "Group name", - "@groupName": {}, - "createGroupAndInviteUsers": "Create a group and invite users", - "@createGroupAndInviteUsers": {}, - "groupCanBeFoundViaSearch": "Group can be found via search", - "@groupCanBeFoundViaSearch": {}, - "wrongRecoveryKey": "Sorry... this does not seem to be the correct recovery key.", - "@wrongRecoveryKey": {}, - "startConversation": "Start conversation", - "@startConversation": {}, - "commandHint_sendraw": "Send raw json", - "@commandHint_sendraw": {}, - "databaseMigrationTitle": "Database is optimized", - "@databaseMigrationTitle": {}, - "databaseMigrationBody": "Please wait. This may take a moment.", - "@databaseMigrationBody": {}, - "leaveEmptyToClearStatus": "Leave empty to clear your status.", - "@leaveEmptyToClearStatus": {}, - "select": "Select", - "@select": {}, - "searchForUsers": "Search for @users...", - "@searchForUsers": {}, - "pleaseEnterYourCurrentPassword": "Please enter your current password", - "@pleaseEnterYourCurrentPassword": {}, - "newPassword": "New password", - "@newPassword": {}, - "pleaseChooseAStrongPassword": "Please choose a strong password", - "@pleaseChooseAStrongPassword": {}, - "passwordsDoNotMatch": "Passwords do not match", - "@passwordsDoNotMatch": {}, - "passwordIsWrong": "Your entered password is wrong", - "@passwordIsWrong": {}, - "publicLink": "Public link", - "@publicLink": {}, - "publicChatAddresses": "Public chat addresses", - "@publicChatAddresses": {}, - "createNewAddress": "Create new address", - "@createNewAddress": {}, - "joinSpace": "Join space", - "@joinSpace": {}, - "publicSpaces": "Public spaces", - "@publicSpaces": {}, - "addChatOrSubSpace": "Add chat or sub space", - "@addChatOrSubSpace": {}, - "subspace": "Subspace", - "@subspace": {}, - "decline": "Decline", - "@decline": {}, - "thisDevice": "This device:", - "@thisDevice": {}, - "initAppError": "An error occured while init the app", - "@initAppError": {}, - "userRole": "User role", - "@userRole": {}, - "minimumPowerLevel": "{level} is the minimum power level.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, - "searchIn": "Search in chat \"{chat}\"...", - "@searchIn": { - "type": "String", - "placeholders": { - "chat": { - "type": "String" - } - } - }, - "searchMore": "Search more...", - "@searchMore": {}, - "gallery": "Gallery", - "@gallery": {}, - "files": "Files", - "@files": {}, - "databaseBuildErrorBody": "Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at {url}. The error message is: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "sessionLostBody": "Your session is lost. Please report this error to the developers at {url}. The error message is: {error}", - "@sessionLostBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "restoreSessionBody": "The app now tries to restore your session from the backup. Please report this error to the developers at {url}. The error message is: {error}", - "@restoreSessionBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "forwardMessageTo": "Forward message to {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, - "sendReadReceipts": "Send read receipts", - "@sendReadReceipts": {}, - "sendTypingNotificationsDescription": "Other participants in a chat can see when you are typing a new message.", - "@sendTypingNotificationsDescription": {}, - "sendReadReceiptsDescription": "Other participants in a chat can see when you have read a message.", - "@sendReadReceiptsDescription": {}, - "formattedMessages": "Formatted messages", - "@formattedMessages": {}, - "formattedMessagesDescription": "Display rich message content like bold text using markdown.", - "@formattedMessagesDescription": {}, - "verifyOtherUser": "🔐 Verify other user", - "@verifyOtherUser": {}, - "verifyOtherUserDescription": "If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭", - "@verifyOtherUserDescription": {}, - "verifyOtherDevice": "🔐 Verify other device", - "@verifyOtherDevice": {}, - "verifyOtherDeviceDescription": "When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It's best to have both devices handy before you start the verification. 🤳", - "@verifyOtherDeviceDescription": {}, - "acceptedKeyVerification": "{sender} accepted key verification", - "@acceptedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "canceledKeyVerification": "{sender} canceled key verification", - "@canceledKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "completedKeyVerification": "{sender} completed key verification", - "@completedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "isReadyForKeyVerification": "{sender} is ready for key verification", - "@isReadyForKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "requestedKeyVerification": "{sender} requested key verification", - "@requestedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "startedKeyVerification": "{sender} started key verification", - "@startedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "transparent": "Transparent", - "@transparent": {}, - "incomingMessages": "Incoming messages", - "@incomingMessages": {}, - "stickers": "Stickers", - "@stickers": {}, - "discover": "Discover", - "@discover": {}, - "commandHint_ignore": "Ignore the given matrix ID", - "@commandHint_ignore": {}, - "commandHint_unignore": "Unignore the given matrix ID", - "@commandHint_unignore": {}, - "unreadChatsInApp": "{appname}: {unread} unread chats", - "@unreadChatsInApp": { - "type": "String", - "placeholders": { - "appname": { - "type": "String" - }, - "unread": { - "type": "String" - } - } - }, - "noDatabaseEncryption": "Database encryption is not supported on this platform", - "@noDatabaseEncryption": {}, - "thereAreCountUsersBlocked": "Right now there are {count} users blocked.", - "@thereAreCountUsersBlocked": { - "type": "String", - "count": {} - }, - "restricted": "Restricted", - "@restricted": {}, - "knockRestricted": "Knock restricted", - "@knockRestricted": {}, - "goToSpace": "Go to space: {space}", - "@goToSpace": { - "type": "String", - "space": {} - }, - "markAsUnread": "Mark as unread", - "@markAsUnread": {}, - "userLevel": "{level} - User", - "@userLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "moderatorLevel": "{level} - Moderator", - "@moderatorLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "adminLevel": "{level} - Admin", - "@adminLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "changeGeneralChatSettings": "Change general chat settings", - "@changeGeneralChatSettings": {}, - "inviteOtherUsers": "Invite other users to this chat", - "@inviteOtherUsers": {}, - "changeTheChatPermissions": "Change the chat permissions", - "@changeTheChatPermissions": {}, - "changeTheVisibilityOfChatHistory": "Change the visibility of the chat history", - "@changeTheVisibilityOfChatHistory": {}, - "changeTheCanonicalRoomAlias": "Change the main public chat address", - "@changeTheCanonicalRoomAlias": {}, - "sendRoomNotifications": "Send a @room notifications", - "@sendRoomNotifications": {}, - "changeTheDescriptionOfTheGroup": "Change the description of the chat", - "@changeTheDescriptionOfTheGroup": {}, - "chatPermissionsDescription": "Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.", - "@chatPermissionsDescription": {}, - "updateInstalled": "🎉 Update {version} installed!", - "@updateInstalled": { - "type": "String", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "changelog": "Changelog", - "@changelog": {}, - "sendCanceled": "Sending canceled", - "@sendCanceled": {}, - "loginWithMatrixId": "Login with Matrix-ID", - "@loginWithMatrixId": {}, - "discoverHomeservers": "Discover homeservers", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "What is a homeserver?", - "@whatIsAHomeserver": {}, - "homeserverDescription": "All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.", - "@homeserverDescription": {}, - "doesNotSeemToBeAValidHomeserver": "Doesn't seem to be a compatible homeserver. Wrong URL?", - "@doesNotSeemToBeAValidHomeserver": {}, - "calculatingFileSize": "Calculating file size...", - "@calculatingFileSize": {}, - "prepareSendingAttachment": "Prepare sending attachment...", - "@prepareSendingAttachment": {}, - "sendingAttachment": "Sending attachment...", - "@sendingAttachment": {}, - "generatingVideoThumbnail": "Generating video thumbnail...", - "@generatingVideoThumbnail": {}, - "compressVideo": "Compressing video...", - "@compressVideo": {}, - "sendingAttachmentCountOfCount": "Sending attachment {index} of {length}...", - "@sendingAttachmentCountOfCount": { - "type": "integer", - "placeholders": { - "index": { - "type": "int" - }, - "length": { - "type": "int" - } - } - }, - "serverLimitReached": "Server limit reached! Waiting {seconds} seconds...", - "@serverLimitReached": { - "type": "integer", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "oneOfYourDevicesIsNotVerified": "One of your devices is not verified", - "@oneOfYourDevicesIsNotVerified": {}, - "noticeChatBackupDeviceVerification": "Note: When you connect all your devices to the chat backup, they are automatically verified.", - "@noticeChatBackupDeviceVerification": {}, - "continueText": "Continue", - "@continueText": {}, - "welcomeText": "Hey Hey 👋 This is FluffyChat. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It's a huge decentralized messaging network!", - "@welcomeText": {}, - "blur": "Blur:", - "@blur": {}, - "opacity": "Opacity:", - "@opacity": {}, - "setWallpaper": "Set wallpaper", - "@setWallpaper": {}, - "manageAccount": "Manage account", - "@manageAccount": {}, - "noContactInformationProvided": "Server does not provide any valid contact information", - "@noContactInformationProvided": {}, - "contactServerAdmin": "Contact server admin", - "@contactServerAdmin": {}, - "contactServerSecurity": "Contact server security", - "@contactServerSecurity": {}, - "supportPage": "Support page", - "@supportPage": {}, - "serverInformation": "Server information:", - "@serverInformation": {}, - "name": "Name", - "@name": {}, - "version": "Version", - "@version": {}, - "website": "Website", - "@website": {}, - "compress": "Compress", - "@compress": {}, - "boldText": "Bold text", - "@boldText": {}, - "italicText": "Italic text", - "@italicText": {}, - "strikeThrough": "Strikethrough", - "@strikeThrough": {}, - "pleaseFillOut": "Please fill out", - "@pleaseFillOut": {}, - "invalidUrl": "Invalid url", - "@invalidUrl": {}, - "addLink": "Add link", - "@addLink": {}, - "unableToJoinChat": "Unable to join chat. Maybe the other party has already closed the conversation.", - "@unableToJoinChat": {}, - "previous": "Previous", - "@previous": {}, - "otherPartyNotLoggedIn": "The other party is currently not logged in and therefore cannot receive messages!", - "@otherPartyNotLoggedIn": {}, - "appWantsToUseForLogin": "Use '{server}' to log in", - "@appWantsToUseForLogin": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "appWantsToUseForLoginDescription": "You hereby allow the app and website to share information about you.", - "@appWantsToUseForLoginDescription": {}, - "open": "Open", - "@open": {}, - "waitingForServer": "Waiting for server...", - "@waitingForServer": {}, - "appIntroduction": "FluffyChat lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.", - "@appIntroduction": {}, - "newChatRequest": "📩 New chat request", - "@newChatRequest": {}, - "contentNotificationSettings": "Content notification settings", - "@contentNotificationSettings": {}, - "generalNotificationSettings": "General notification settings", - "@generalNotificationSettings": {}, - "roomNotificationSettings": "Room notification settings", - "@roomNotificationSettings": {}, - "userSpecificNotificationSettings": "User specific notification settings", - "@userSpecificNotificationSettings": {}, - "otherNotificationSettings": "Other notification settings", - "@otherNotificationSettings": {}, - "notificationRuleContainsUserName": "Contains User Name", - "@notificationRuleContainsUserName": {}, - "notificationRuleContainsUserNameDescription": "Notifies the user when a message contains their username.", - "@notificationRuleContainsUserNameDescription": {}, - "notificationRuleMaster": "Mute all notifications", - "@notificationRuleMaster": {}, - "notificationRuleMasterDescription": "Overrides all other rules and disables all notifications.", - "@notificationRuleMasterDescription": {}, - "notificationRuleSuppressNotices": "Suppress Automated Messages", - "@notificationRuleSuppressNotices": {}, - "notificationRuleSuppressNoticesDescription": "Suppresses notifications from automated clients like bots.", - "@notificationRuleSuppressNoticesDescription": {}, - "notificationRuleInviteForMe": "Invite for Me", - "@notificationRuleInviteForMe": {}, - "notificationRuleInviteForMeDescription": "Notifies the user when they are invited to a room.", - "@notificationRuleInviteForMeDescription": {}, - "notificationRuleMemberEvent": "Member Event", - "@notificationRuleMemberEvent": {}, - "notificationRuleMemberEventDescription": "Suppresses notifications for membership events.", - "@notificationRuleMemberEventDescription": {}, - "notificationRuleIsUserMention": "User Mention", - "@notificationRuleIsUserMention": {}, - "notificationRuleIsUserMentionDescription": "Notifies the user when they are directly mentioned in a message.", - "@notificationRuleIsUserMentionDescription": {}, - "notificationRuleContainsDisplayName": "Contains Display Name", - "@notificationRuleContainsDisplayName": {}, - "notificationRuleContainsDisplayNameDescription": "Notifies the user when a message contains their display name.", - "@notificationRuleContainsDisplayNameDescription": {}, - "notificationRuleIsRoomMention": "Room Mention", - "@notificationRuleIsRoomMention": {}, - "notificationRuleIsRoomMentionDescription": "Notifies the user when there is a room mention.", - "@notificationRuleIsRoomMentionDescription": {}, - "notificationRuleRoomnotif": "Room Notification", - "@notificationRuleRoomnotif": {}, - "notificationRuleRoomnotifDescription": "Notifies the user when a message contains '@room'.", - "@notificationRuleRoomnotifDescription": {}, - "notificationRuleTombstone": "Tombstone", - "@notificationRuleTombstone": {}, - "notificationRuleTombstoneDescription": "Notifies the user about room deactivation messages.", - "@notificationRuleTombstoneDescription": {}, - "notificationRuleReaction": "Reaction", - "@notificationRuleReaction": {}, - "notificationRuleReactionDescription": "Suppresses notifications for reactions.", - "@notificationRuleReactionDescription": {}, - "notificationRuleRoomServerAcl": "Room Server ACL", - "@notificationRuleRoomServerAcl": {}, - "notificationRuleRoomServerAclDescription": "Suppresses notifications for room server access control lists (ACL).", - "@notificationRuleRoomServerAclDescription": {}, - "notificationRuleSuppressEdits": "Suppress Edits", - "@notificationRuleSuppressEdits": {}, - "notificationRuleSuppressEditsDescription": "Suppresses notifications for edited messages.", - "@notificationRuleSuppressEditsDescription": {}, - "notificationRuleCall": "Call", - "@notificationRuleCall": {}, - "notificationRuleCallDescription": "Notifies the user about calls.", - "@notificationRuleCallDescription": {}, - "notificationRuleEncryptedRoomOneToOne": "Encrypted Room One-to-One", - "@notificationRuleEncryptedRoomOneToOne": {}, - "notificationRuleEncryptedRoomOneToOneDescription": "Notifies the user about messages in encrypted one-to-one rooms.", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, - "notificationRuleRoomOneToOne": "Room One-to-One", - "@notificationRuleRoomOneToOne": {}, - "notificationRuleRoomOneToOneDescription": "Notifies the user about messages in one-to-one rooms.", - "@notificationRuleRoomOneToOneDescription": {}, - "notificationRuleMessage": "Message", - "@notificationRuleMessage": {}, - "notificationRuleMessageDescription": "Notifies the user about general messages.", - "@notificationRuleMessageDescription": {}, - "notificationRuleEncrypted": "Encrypted", - "@notificationRuleEncrypted": {}, - "notificationRuleEncryptedDescription": "Notifies the user about messages in encrypted rooms.", - "@notificationRuleEncryptedDescription": {}, - "notificationRuleJitsi": "Jitsi", - "@notificationRuleJitsi": {}, - "notificationRuleJitsiDescription": "Notifies the user about Jitsi widget events.", - "@notificationRuleJitsiDescription": {}, - "notificationRuleServerAcl": "Suppress Server ACL Events", - "@notificationRuleServerAcl": {}, - "notificationRuleServerAclDescription": "Suppresses notifications for Server ACL events.", - "@notificationRuleServerAclDescription": {}, - "unknownPushRule": "Unknown push rule '{rule}'", - "@unknownPushRule": { - "type": "String", - "placeholders": { - "rule": { - "type": "String" - } - } - }, - "sentVoiceMessage": "🎙️ {duration} - Voice message from {sender}", - "@sentVoiceMessage": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - }, - "duration": { - "type": "String" - } - } - }, - "deletePushRuleCanNotBeUndone": "If you delete this notification setting, this can not be undone.", - "@deletePushRuleCanNotBeUndone": {}, - "more": "More", - "@more": {}, - "shareKeysWith": "Share keys with...", - "@shareKeysWith": {}, - "shareKeysWithDescription": "Which devices should be trusted so that they can read along your messages in encrypted chats?", - "@shareKeysWithDescription": {}, - "allDevices": "All devices", - "@allDevices": {}, - "crossVerifiedDevicesIfEnabled": "Cross verified devices if enabled", - "@crossVerifiedDevicesIfEnabled": {}, - "crossVerifiedDevices": "Cross verified devices", - "@crossVerifiedDevices": {}, - "verifiedDevicesOnly": "Verified devices only", - "@verifiedDevicesOnly": {}, - "takeAPhoto": "Take a photo", - "@takeAPhoto": {}, - "recordAVideo": "Record a video", - "@recordAVideo": {}, - "optionalMessage": "(Optional) message...", - "@optionalMessage": {}, - "notSupportedOnThisDevice": "Not supported on this device", - "@notSupportedOnThisDevice": {}, - "enterNewChat": "Enter new chat", - "@enterNewChat": {}, - "approve": "Approve", - "@approve": {}, - "youHaveKnocked": "You have knocked", - "@youHaveKnocked": {}, - "pleaseWaitUntilInvited": "Please wait now, until someone from the room invites you.", - "@pleaseWaitUntilInvited": {}, - "commandHint_logout": "Logout your current device", - "@commandHint_logout": {}, - "commandHint_logoutall": "Logout all active devices", - "@commandHint_logoutall": {}, - "displayNavigationRail": "Show navigation rail on mobile", - "@displayNavigationRail": {}, - "customReaction": "Custom reaction", - "@customReaction": {}, - "moreEvents": "More events", - "@moreEvents": {}, - "declineInvitation": "Decline invitation", - "@declineInvitation": {}, - "noMessagesYet": "No messages yet", - "longPressToRecordVoiceMessage": "Long press to record voice message.", - "pause": "Pause", - "resume": "Resume", - "newSubSpace": "New sub space", - "moveToDifferentSpace": "Move to different space", - "moveUp": "Move up", - "moveDown": "Move down", - "removeFromSpaceDescription": "The chat will be removed from the space but still appear in your chat list.", - "countChats": "{chats} chats", - "@countChats": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - } - } - }, - "spaceMemberOf": "Space member of {spaces}", - "@spaceMemberOf": { - "type": "String", - "placeholders": { - "spaces": { - "type": "String" - } - } - }, - "spaceMemberOfCanKnock": "Space member of {spaces} can knock", - "@spaceMemberOfCanKnock": { - "type": "String", - "placeholders": { - "spaces": { - "type": "String" - } - } - }, - "donate": "Donate", - "startedAPoll": "{username} started a poll.", - "@startedAPoll": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "poll": "Poll", - "startPoll": "Start poll", - "endPoll": "End poll", - "answersVisible": "Answers visible", - "answersHidden": "Answers hidden", - "pollQuestion": "Poll question", - "answerOption": "Answer option", - "addAnswerOption": "Add answer option", - "allowMultipleAnswers": "Allow multiple answers", - "pollHasBeenEnded": "Poll has been ended", - "countVotes": "{count, plural, =1{One vote} other{{count} votes}}", - "@countVotes": { - "type": "int", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "answersWillBeVisibleWhenPollHasEnded": "Answers will be visible when poll has ended", - "replyInThread": "Reply in thread", - "countReplies": "{count, plural, =1{One reply} other{{count} replies}}", - "@countReplies": { - "type": "int", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "thread": "Thread", - "backToMainChat": "Back to main chat", - "saveChanges": "Save changes", - "createSticker": "Create sticker or emoji", - "useAsSticker": "Use as sticker", - "useAsEmoji": "Use as emoji", - "stickerPackNameAlreadyExists": "Sticker pack name already exists", - "newStickerPack": "New sticker pack", - "stickerPackName": "Sticker pack name", - "attribution": "Attribution", - "skipChatBackup": "Skip chat backup", - "skipChatBackupWarning": "Are you sure? Without enabling the chat backup you may lose access to your messages if you switch your device.", - "loadingMessages": "Loading messages", - "setupChatBackup": "Set up chat backup", - "noMoreResultsFound": "No more results found", - "chatSearchedUntil": "Chat searched until {time}", - "@chatSearchedUntil": { - "type": "String", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "federationBaseUrl": "Federation Base URL", - "@federationBaseUrl": {}, - "clientWellKnownInformation": "Client-Well-Known Information:", - "@clientWellKnownInformation": {}, - "baseUrl": "Base URL", - "@baseUrl": {}, - "identityServer": "Identity Server:", - "@identityServer": {}, - "versionWithNumber": "Version: {version}", - "@versionWithNumber": { - "type": "String", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "logs": "Logs", - "@logs": {}, - "advancedConfigs": "Advanced Configs", - "@advancedConfigs": {}, - "advancedConfigurations": "Advanced configurations", - "@advancedConfigurations": {}, - "signIn": "Sign in", - "createNewAccount": "Create new account", - "signUpGreeting": "FluffyChat is decentralized! Select a server where you want to create your account and let's go!", - "signInGreeting": "You already have an account in Matrix? Welcome back! Select your homeserver and sign in.", - "appIntro": "With FluffyChat you can chat with your friends. It's a secure decentralized [matrix] messenger! Learn more on https://matrix.org if you like or just sign up.", - "theProcessWasCanceled": "The process was canceled.", - "join": "Join", - "searchOrEnterHomeserverAddress": "Search or enter homeserver address", - "matrixId": "Matrix ID" + "repeatPassword": "Repeat password", + "notAnImage": "Not an image file.", + "setCustomPermissionLevel": "Set custom permission level", + "setPermissionsLevelDescription": "Please choose a predefined role below or enter a custom permission level between 0 and 100.", + "ignoreUser": "Ignore user", + "normalUser": "Normal user", + "remove": "Remove", + "@remove": { + "type": "String", + "placeholders": {} + }, + "importNow": "Import now", + "importEmojis": "Import Emojis", + "importFromZipFile": "Import from .zip file", + "exportEmotePack": "Export Emote pack as .zip", + "replace": "Replace", + "about": "About", + "aboutHomeserver": "About {homeserver}", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "Accept", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} accepted the invitation", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "Account", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} activated end to end encryption", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "Add email", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "Please confirm your Matrix ID in order to delete your account.", + "supposedMxid": "This should be {mxid}", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addChatDescription": "Add a chat description...", + "addToSpace": "Add to space", + "admin": "Admin", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "alias", + "@alias": { + "type": "String", + "placeholders": {} + }, + "all": "All", + "@all": { + "type": "String", + "placeholders": {} + }, + "allChats": "All chats", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "commandHint_roomupgrade": "Upgrade this room to the given room version", + "commandHint_googly": "Send some googly eyes", + "commandHint_cuddle": "Send a cuddle", + "commandHint_hug": "Send a hug", + "googlyEyesContent": "{senderName} sends you googly eyes", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "cuddleContent": "{senderName} cuddles you", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} hugs you", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "answeredTheCall": "{senderName} answered the call", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "anyoneCanJoin": "Anyone can join", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "appLock": "App lock", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "Lock the app when not using with a pin code", + "archive": "Archive", + "@archive": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "Are guest users allowed to join?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSure": "Are you sure?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "Are you sure you want to log out?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "To be able to sign the other person, please enter your secure store passphrase or recovery key.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "Accept this verification request from {username}?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "Automatically play animated stickers and emotes", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "The homeserver supports the login types:\n{serverVersions}\nBut this app supports only:\n{supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "sendTypingNotifications": "Send typing notifications", + "swipeRightToLeftToReply": "Swipe right to left to reply", + "sendOnEnter": "Send on enter", + "badServerVersionsException": "The homeserver supports the Spec versions:\n{serverVersions}\nBut this app supports only {supportedVersions}", + "@badServerVersionsException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "countChatsAndCountParticipants": "{chats} chats and {participants} participants", + "@countChatsAndCountParticipants": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + }, + "participants": { + "type": "int" + } + } + }, + "noMoreChatsFound": "No more chats found...", + "noChatsFoundHere": "No chats found here yet. Start a new chat with someone by using the button below. ⤵️", + "joinedChats": "Joined chats", + "unread": "Unread", + "space": "Space", + "spaces": "Spaces", + "banFromChat": "Ban from chat", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "banned": "Banned", + "@banned": { + "type": "String", + "placeholders": {} + }, + "bannedUser": "{username} banned {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "Block Device", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "Blocked", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "botMessages": "Bot messages", + "@botMessages": { + "type": "String", + "placeholders": {} + }, + "cancel": "Cancel", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "Can't open the URI {uri}", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "changeDeviceName": "Change device name", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheChatAvatar": "{username} changed the chat avatar", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheChatDescription": "{username} changed the chat description", + "changedTheChatDescriptionTo": "{username} changed the chat description to: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "changedTheChatName": "{username} changed the chat name", + "changedTheChatNameTo": "{username} changed the chat name to: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheChatPermissions": "{username} changed the chat permissions", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheDisplaynameTo": "{username} changed their displayname to: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} changed the guest access rules", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} changed the guest access rules to: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} changed the history visibility", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} changed the history visibility to: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} changed the join rules", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} changed the join rules to: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} changed their avatar", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} changed the room aliases", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} changed the invitation link", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "Change password", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "Change the homeserver", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "Change your style", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "changeTheNameOfTheGroup": "Change the name of the group", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "Change your avatar", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "The encryption has been corrupted", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "Chat", + "@chat": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "Your chat backup has been set up.", + "chatBackup": "Chat backup", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "chatBackupDescription": "Your messages are secured with a recovery key. Please make sure you don't lose it.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "chatDetails": "Chat details", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "chatHasBeenAddedToThisSpace": "Chat has been added to this space", + "chats": "Chats", + "@chats": { + "type": "String", + "placeholders": {} + }, + "chooseAStrongPassword": "Choose a strong password", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "Clear archive", + "close": "Close", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "Mark as direct message room for the giving Matrix ID", + "commandHint_markasgroup": "Mark as group", + "commandHint_ban": "Ban the given user from this room", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "Clear cache", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_create": "Create an empty group chat\nUse --no-encryption to disable encryption", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "commandHint_discardsession": "Discard session", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_dm": "Start a direct chat\nUse --no-encryption to disable encryption", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_html": "Send HTML-formatted text", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_invite": "Invite the given user to this room", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_join": "Join the given room", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_kick": "Remove the given user from this room", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "commandHint_leave": "Leave this room", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "commandHint_me": "Describe yourself", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_myroomavatar": "Set your picture for this room (by mxc-uri)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "Set your display name for this room", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandHint_op": "Set the given user's power level (default: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "Send unformatted text", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandHint_react": "Send reply as a reaction", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "Send text", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "commandHint_unban": "Unban the given user from this room", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "commandInvalid": "Command invalid", + "@commandInvalid": { + "type": "String" + }, + "commandMissing": "{command} is not a command.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "compareEmojiMatch": "Please compare the emojis", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "compareNumbersMatch": "Please compare the numbers", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "configureChat": "Configure chat", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "confirm": "Confirm", + "@confirm": { + "type": "String", + "placeholders": {} + }, + "connect": "Connect", + "@connect": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "Contact has been invited to the group", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "containsDisplayName": "Contains display name", + "@containsDisplayName": { + "type": "String", + "placeholders": {} + }, + "containsUserName": "Contains username", + "@containsUserName": { + "type": "String", + "placeholders": {} + }, + "contentHasBeenReported": "The content has been reported to the server admins", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "Copied to clipboard", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "Copy", + "@copy": { + "type": "String", + "placeholders": {} + }, + "copyToClipboard": "Copy to clipboard", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "Could not decrypt message: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "checkList": "Check list", + "countParticipants": "{count} participants", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "countInvited": "{count} invited", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "create": "Create", + "@create": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} created the chat", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "createGroup": "Create group", + "createNewSpace": "New space", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "currentlyActive": "Currently active", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "darkTheme": "Dark", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "dateWithoutYear": "{month}-{day}", + "@dateWithoutYear": { + "type": "String", + "placeholders": { + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "dateWithYear": "{year}-{month}-{day}", + "@dateWithYear": { + "type": "String", + "placeholders": { + "year": { + "type": "String" + }, + "month": { + "type": "String" + }, + "day": { + "type": "String" + } + } + }, + "deactivateAccountWarning": "This will deactivate your user account. This can not be undone! Are you sure?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "Default permission level for new users", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "Delete", + "@delete": { + "type": "String", + "placeholders": {} + }, + "deleteAccount": "Delete account", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deleteMessage": "Delete message", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "device": "Device", + "@device": { + "type": "String", + "placeholders": {} + }, + "deviceId": "Device ID", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "devices": "Devices", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "Direct Chats", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "allRooms": "All Group Chats", + "@allRooms": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "Displayname has been changed", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "Download file", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "edit": "Edit", + "@edit": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "Edit blocked servers", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "Chat permissions", + "editDisplayname": "Edit displayname", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "editRoomAliases": "Edit room aliases", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "Edit room avatar", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "Emote already exists!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "Invalid emote shortcode!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "Recently-used emotes will appear here...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "Emote packs for room", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "Emote Settings", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "Global chat ID", + "accessAndVisibility": "Access and visibility", + "accessAndVisibilityDescription": "Who is allowed to join this chat and how the chat can be discovered.", + "calls": "Calls", + "customEmojisAndStickers": "Custom emojis and stickers", + "customEmojisAndStickersBody": "Add or share custom emojis or stickers which can be used in any chat.", + "emoteShortcode": "Emote shortcode", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "emoteWarnNeedToPick": "You need to pick an emote shortcode and an image!", + "@emoteWarnNeedToPick": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "Empty chat", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "Enable emote pack globally", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "Enable encryption", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "You won't be able to disable the encryption anymore. Are you sure?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encrypted": "Encrypted", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "encryption": "Encryption", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "Encryption is not enabled", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} ended the call", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "enterAnEmailAddress": "Enter an email address", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "homeserver": "Homeserver", + "enterYourHomeserver": "Enter your homeserver", + "@enterYourHomeserver": { + "type": "String", + "placeholders": {} + }, + "errorObtainingLocation": "Error obtaining location: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "Everything ready!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "Extremely offensive", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "fileName": "File name", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "FluffyChat", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "fontSize": "Font size", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "forward": "Forward", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "From joining", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "From the invitation", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "goToTheNewRoom": "Go to the new room", + "@goToTheNewRoom": { + "type": "String", + "placeholders": {} + }, + "group": "Group", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "Chat description", + "chatDescriptionHasBeenChanged": "Chat description changed", + "groupIsPublic": "Group is public", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "groups": "Groups", + "@groups": { + "type": "String", + "placeholders": {} + }, + "groupWith": "Group with {displayname}", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "guestsAreForbidden": "Guests are forbidden", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "Guests can join", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{username} has withdrawn the invitation for {targetName}", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "help": "Help", + "@help": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "Hide redacted events", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideRedactedMessages": "Hide redacted messages", + "hideRedactedMessagesBody": "If someone redacts a message, this message won't be visible in the chat anymore.", + "hideInvalidOrUnknownMessageFormats": "Hide invalid or unknown message formats", + "howOffensiveIsThisContent": "How offensive is this content?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "id": "ID", + "@id": { + "type": "String", + "placeholders": {} + }, + "identity": "Identity", + "@identity": { + "type": "String", + "placeholders": {} + }, + "block": "Block", + "blockedUsers": "Blocked users", + "blockListDescription": "You can block users who are disturbing you. You won't be able to receive any messages or room invites from the users on your personal block list.", + "blockUsername": "Ignore username", + "iHaveClickedOnLink": "I have clicked on the link", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "incorrectPassphraseOrKey": "Incorrect passphrase or recovery key", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "Inoffensive", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "Invite contact", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "inviteContactToGroupQuestion": "Do you want to invite {contact} to the chat \"{groupName}\"?", + "inviteContactToGroup": "Invite contact to {groupName}", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "No chat description created yet.", + "tryAgain": "Try again", + "invalidServerName": "Invalid server name", + "invited": "Invited", + "@invited": { + "type": "String", + "placeholders": {} + }, + "redactMessageDescription": "The message will be redacted for all participants in this conversation. This cannot be undone.", + "optionalRedactReason": "(Optional) Reason for redacting this message...", + "invitedUser": "📩 {username} invited {targetName}", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "invitedUsersOnly": "Invited users only", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "inviteForMe": "Invite for me", + "@inviteForMe": { + "type": "String", + "placeholders": {} + }, + "inviteText": "{username} invited you to FluffyChat.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "isTyping": "is typing…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} joined the chat", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "joinRoom": "Join room", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} kicked {targetName}", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickedAndBanned": "🙅 {username} kicked and banned {targetName}", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "kickFromChat": "Kick from chat", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "lastActiveAgo": "Last active: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leave": "Leave", + "@leave": { + "type": "String", + "placeholders": {} + }, + "leftTheChat": "Left the chat", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "license": "License", + "@license": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "Light", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "Load {count} more participants", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrate": "Export session and wipe device", + "dehydrateWarning": "This action cannot be undone. Ensure you safely store the backup file.", + "dehydrateTor": "TOR Users: Export session", + "dehydrateTorLong": "For TOR users, it is recommended to export the session before closing the window.", + "hydrateTor": "TOR Users: Import session export", + "hydrateTorLong": "Did you export your session last time on TOR? Quickly import it and continue chatting.", + "hydrate": "Restore from backup file", + "loadingPleaseWait": "Loading… Please wait.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "loadMore": "Load more…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "locationDisabledNotice": "Location services are disabled. Please enable them to be able to share your location.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "Location permission denied. Please grant them to be able to share your location.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "Login", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "Log in to {homeserver}", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "logout": "Logout", + "@logout": { + "type": "String", + "placeholders": {} + }, + "memberChanges": "Member changes", + "@memberChanges": { + "type": "String", + "placeholders": {} + }, + "mention": "Mention", + "@mention": { + "type": "String", + "placeholders": {} + }, + "messages": "Messages", + "@messages": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "Messages:", + "moderator": "Moderator", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "muteChat": "Mute chat", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "needPantalaimonWarning": "Please be aware that you need Pantalaimon to use end-to-end encryption for now.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newChat": "New chat", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "💬 New message in FluffyChat", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "New verification request!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "next": "Next", + "@next": { + "type": "String", + "placeholders": {} + }, + "no": "No", + "@no": { + "type": "String", + "placeholders": {} + }, + "noConnectionToTheServer": "No connection to the server", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "No emotes found. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "You can only activate encryption as soon as the room is no longer publicly accessible.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noGoogleServicesWarning": "Firebase Cloud Messaging doesn't appear to be available on your device. To still receive push notifications, we recommend installing ntfy. With ntfy or another Unified Push provider you can receive push notifications in a data secure way. You can download ntfy from the PlayStore or from F-Droid.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} is no matrix server, use {server2} instead?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "shareInviteLink": "Share invite link", + "scanQrCode": "Scan QR code", + "none": "None", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "You have not added a way to recover your password yet.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "noPermission": "No permission", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "No rooms found…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "Notifications", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "notificationsEnabledForThisAccount": "Notifications enabled for this account", + "@notificationsEnabledForThisAccount": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} users are typing…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "obtainingLocation": "Obtaining location…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offensive": "Offensive", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "offline": "Offline", + "@offline": { + "type": "String", + "placeholders": {} + }, + "ok": "Ok", + "@ok": { + "type": "String", + "placeholders": {} + }, + "online": "Online", + "@online": { + "type": "String", + "placeholders": {} + }, + "onlineKeyBackupEnabled": "Online Key Backup is enabled", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "Oops! Unfortunately, an error occurred when setting up the push notifications.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "Oops, something went wrong…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "Open app to read messages", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "openCamera": "Open camera", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "openVideoCamera": "Open camera for a video", + "@openVideoCamera": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "One of your clients has been logged out", + "addAccount": "Add account", + "editBundlesForAccount": "Edit bundles for this account", + "addToBundle": "Add to bundle", + "removeFromBundle": "Remove from this bundle", + "bundleName": "Bundle name", + "enableMultiAccounts": "(BETA) Enable multi accounts on this device", + "openInMaps": "Open in maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "Link", + "serverRequiresEmail": "This server needs to validate your email address for registration.", + "or": "Or", + "@or": { + "type": "String", + "placeholders": {} + }, + "participant": "Participant", + "@participant": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "passphrase or recovery key", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "password": "Password", + "@password": { + "type": "String", + "placeholders": {} + }, + "passwordForgotten": "Password forgotten", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "Password has been changed", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "hideMemberChangesInPublicChats": "Hide member changes in public chats", + "hideMemberChangesInPublicChatsBody": "Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.", + "overview": "Overview", + "notifyMeFor": "Notify me for", + "passwordRecoverySettings": "Password recovery settings", + "passwordRecovery": "Password recovery", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "people": "People", + "@people": { + "type": "String", + "placeholders": {} + }, + "pickImage": "Pick an image", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "Pin", + "@pin": { + "type": "String", + "placeholders": {} + }, + "play": "Play {fileName}", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseChoose": "Please choose", + "@pleaseChoose": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "Please choose a pass code", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "Please click on the link in the email and then proceed.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseEnter4Digits": "Please enter 4 digits or leave empty to disable app lock.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterRecoveryKey": "Please enter your recovery key:", + "pleaseEnterYourPassword": "Please enter your password", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "Please enter your pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Please enter your username", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Please follow the instructions on the website and tap on next.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "Privacy", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Public Rooms", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "pushRules": "Push rules", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "reason": "Reason", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Recording", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "Redacted by {username}", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "Direct chat", + "redactedByBecause": "Redacted by {username} because: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "redactedAnEvent": "{username} redacted an event", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "redactMessage": "Redact message", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "register": "Register", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Reject", + "@reject": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} rejected the invitation", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "Rejoin", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "Remove all other devices", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "removedBy": "Removed by {username}", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "removeDevice": "Remove device", + "@removeDevice": { + "type": "String", + "placeholders": {} + }, + "unbanFromChat": "Unban from chat", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "Remove your avatar", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "Replace room with newer version", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "reply": "Reply", + "@reply": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Report message", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Request permission", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Room has been upgraded", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Room version", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Save file", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "search": "Search", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Security", + "@security": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "Recovery key", + "recoveryKeyLost": "Recovery key lost?", + "seenByUser": "Seen by {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Send", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Send a message", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Send as text", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Send audio", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Send file", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Send image", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "Send {count} image", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendMessages": "Send messages", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Send original", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Send sticker", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Send video", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} sent a file", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} sent an audio", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} sent a picture", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} sent a sticker", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} sent a video", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} sent call information", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "separateChatTypes": "Separate Direct Chats and Groups", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "setAsCanonicalAlias": "Set as main alias", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setCustomEmotes": "Set custom emotes", + "@setCustomEmotes": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "Set chat description", + "setInvitationLink": "Set invitation link", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Set permissions level", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "setStatus": "Set status", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "settings": "Settings", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Share", + "@share": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} shared their location", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "shareLocation": "Share location", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Show password", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "presenceStyle": "Presence:", + "@presenceStyle": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "Show status messages from other users", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Single Sign on", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "skip": "Skip", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Source code", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Space is public", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Space name", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} started a call", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "startFirstChat": "Start your first chat", + "status": "Status", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "How are you today?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Submit", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Synchronizing… Please wait.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " Synchronizing… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "systemTheme": "System", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "They Don't Match", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "They Match", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Toggle Favorite", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Toggle Muted", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Mark Read/Unread", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Too many requests. Please try again later!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Transfer from another device", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Try to send again", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Unavailable", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} unbanned {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Unblock Device", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Unknown device", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "Unknown encryption algorithm", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Unknown event '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Unmute chat", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unpin": "Unpin", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", + "@unreadChats": { + "type": "String", + "placeholders": { + "unreadCount": { + "type": "int" + } + } + }, + "userAndOthersAreTyping": "{username} and {count} others are typing…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userAndUserAreTyping": "{username} and {username2} are typing…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userIsTyping": "{username} is typing…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} left the chat", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "username": "Username", + "@username": { + "type": "String", + "placeholders": {} + }, + "userSentUnknownEvent": "{username} sent a {type} event", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "unverified": "Unverified", + "verified": "Verified", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verify": "Verify", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "Start Verification", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "You successfully verified!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "Verifying other account", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "Video call", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibilityOfTheChatHistory": "Visibility of the chat history", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "Visible for all participants", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "Visible for everyone", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "Voice message", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerAcceptRequest": "Waiting for partner to accept the request…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "Waiting for partner to accept the emoji…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "Waiting for partner to accept the numbers…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "wallpaper": "Wallpaper:", + "@wallpaper": { + "type": "String", + "placeholders": {} + }, + "warning": "Warning!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "We sent you an email", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "Who can perform which action", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "Who is allowed to join this group", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "whyDoYouWantToReportThis": "Why do you want to report this?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "Wipe your chat backup to create a new recovery key?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "With these addresses you can recover your password.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "Write a message…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "Yes", + "@yes": { + "type": "String", + "placeholders": {} + }, + "you": "You", + "@you": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "You are no longer participating in this chat", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "You have been banned from this chat", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "Your public key", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "Message info", + "time": "Time", + "messageType": "Message Type", + "sender": "Sender", + "openGallery": "Open gallery", + "removeFromSpace": "Remove from space", + "addToSpaceDescription": "Select a space to add this chat to it.", + "start": "Start", + "pleaseEnterRecoveryKeyDescription": "To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.", + "publish": "Publish", + "videoWithSize": "Video ({size})", + "@videoWithSize": { + "type": "String", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "openChat": "Open Chat", + "markAsRead": "Mark as read", + "reportUser": "Report user", + "dismiss": "Dismiss", + "reactedWith": "{sender} reacted with {reaction}", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "pinMessage": "Pin to room", + "confirmEventUnpin": "Are you sure to permanently unpin the event?", + "emojis": "Emojis", + "placeCall": "Place call", + "voiceCall": "Voice call", + "unsupportedAndroidVersion": "Unsupported Android version", + "unsupportedAndroidVersionLong": "This feature requires a newer Android version. Please check for updates or Lineage OS support.", + "videoCallsBetaWarning": "Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.", + "experimentalVideoCalls": "Experimental video calls", + "emailOrUsername": "Email or username", + "indexedDbErrorTitle": "Private mode issues", + "indexedDbErrorLong": "The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run FluffyChat.", + "switchToAccount": "Switch to account {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Next account", + "previousAccount": "Previous account", + "addWidget": "Add widget", + "widgetVideo": "Video", + "widgetEtherpad": "Text note", + "widgetJitsi": "Jitsi Meet", + "widgetCustom": "Custom", + "widgetName": "Name", + "widgetUrlError": "This is not a valid URL.", + "widgetNameError": "Please provide a display name.", + "errorAddingWidget": "Error adding the widget.", + "youRejectedTheInvitation": "You rejected the invitation", + "youJoinedTheChat": "You joined the chat", + "youAcceptedTheInvitation": "👍 You accepted the invitation", + "youBannedUser": "You banned {user}", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "You have withdrawn the invitation for {user}", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedToBy": "📩 You have been invited via link to:\n{alias}", + "@youInvitedToBy": { + "placeholders": { + "alias": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 You have been invited by {user}", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "invitedBy": "📩 Invited by {user}", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 You invited {user}", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 You kicked {user}", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKickedAndBanned": "🙅 You kicked and banned {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "You unbanned {user}", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} has knocked", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "Users must knock", + "noOneCanJoin": "No one can join", + "userWouldLikeToChangeTheChat": "{user} would like to join the chat.", + "@userWouldLikeToChangeTheChat": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "noPublicLinkHasBeenCreatedYet": "No public link has been created yet", + "knock": "Knock", + "users": "Users", + "unlockOldMessages": "Unlock old messages", + "storeInSecureStorageDescription": "Store the recovery key in the secure storage of this device.", + "saveKeyManuallyDescription": "Save this key manually by triggering the system share dialog or clipboard.", + "storeInAndroidKeystore": "Store in Android KeyStore", + "storeInAppleKeyChain": "Store in Apple KeyChain", + "storeSecurlyOnThisDevice": "Store securely on this device", + "countFiles": "{count} files", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "user": "User", + "custom": "Custom", + "foregroundServiceRunning": "This notification appears when the foreground service is running.", + "screenSharingTitle": "screen sharing", + "screenSharingDetail": "You are sharing your screen in FuffyChat", + "callingPermissions": "Calling permissions", + "callingAccount": "Calling account", + "callingAccountDetails": "Allows FluffyChat to use the native android dialer app.", + "appearOnTop": "Appear on top", + "appearOnTopDetails": "Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)", + "otherCallingPermissions": "Microphone, camera and other FluffyChat permissions", + "whyIsThisMessageEncrypted": "Why is this message unreadable?", + "noKeyForThisMessage": "This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.", + "newGroup": "New group", + "newSpace": "New space", + "enterSpace": "Enter space", + "enterRoom": "Enter room", + "allSpaces": "All spaces", + "numChats": "{number} chats", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "hideUnimportantStateEvents": "Hide unimportant state events", + "hidePresences": "Hide Status List?", + "doNotShowAgain": "Do not show again", + "wasDirectChatDisplayName": "Empty chat (was {oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "newSpaceDescription": "Spaces allows you to consolidate your chats and build private or public communities.", + "encryptThisChat": "Encrypt this chat", + "disableEncryptionWarning": "For security reasons you can not disable encryption in a chat, where it has been enabled before.", + "sorryThatsNotPossible": "Sorry... that is not possible", + "deviceKeys": "Device keys:", + "reopenChat": "Reopen chat", + "noBackupWarning": "Warning! Without enabling chat backup, you will lose access to your encrypted messages. It is highly recommended to enable the chat backup first before logging out.", + "noOtherDevicesFound": "No other devices found", + "fileIsTooBigForServer": "Unable to send! The server only supports attachments up to {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "File has been saved at {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Jump to last read message", + "readUpToHere": "Read up to here", + "jump": "Jump", + "openLinkInBrowser": "Open link in browser", + "reportErrorDescription": "😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.", + "report": "report", + "signInWithPassword": "Sign in with password", + "pleaseTryAgainLaterOrChooseDifferentServer": "Please try again later or choose a different server.", + "profileNotFound": "The user could not be found on the server. Maybe there is a connection problem or the user doesn't exist.", + "setTheme": "Set theme:", + "setColorTheme": "Set color theme:", + "invite": "Invite", + "inviteGroupChat": "📨 Group chat invite", + "invitePrivateChat": "📨 Private chat invite", + "invalidInput": "Invalid input!", + "wrongPinEntered": "Wrong pin entered! Try again in {seconds} seconds...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "Please enter a number greater than 0", + "archiveRoomDescription": "The chat will be moved to the archive. Other users will be able to see that you have left the chat.", + "roomUpgradeDescription": "The chat will then be recreated with the new room version. All participants will be notified that they need to switch to the new chat. You can find out more about room versions at https://spec.matrix.org/latest/rooms/", + "removeDevicesDescription": "You will be logged out of this device and will no longer be able to receive messages.", + "banUserDescription": "The user will be banned from the chat and will not be able to enter the chat again until they are unbanned.", + "unbanUserDescription": "The user will be able to enter the chat again if they try.", + "kickUserDescription": "The user is kicked out of the chat but not banned. In public chats, the user can rejoin at any time.", + "makeAdminDescription": "Once you make this user admin, you may not be able to undo this as they will then have the same permissions as you.", + "pushNotificationsNotAvailable": "Push notifications not available", + "learnMore": "Learn more", + "yourGlobalUserIdIs": "Your global user-ID is: ", + "noUsersFoundWithQuery": "Unfortunately no user could be found with \"{query}\". Please check whether you made a typo.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "knocking": "Knocking", + "chatCanBeDiscoveredViaSearchOnServer": "Chat can be discovered via the search on {server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "searchChatsRooms": "Search for #chats, @users...", + "nothingFound": "Nothing found...", + "groupName": "Group name", + "createGroupAndInviteUsers": "Create a group and invite users", + "groupCanBeFoundViaSearch": "Group can be found via search", + "wrongRecoveryKey": "Sorry... this does not seem to be the correct recovery key.", + "startConversation": "Start conversation", + "commandHint_sendraw": "Send raw json", + "databaseMigrationTitle": "Database is optimized", + "databaseMigrationBody": "Please wait. This may take a moment.", + "leaveEmptyToClearStatus": "Leave empty to clear your status.", + "select": "Select", + "searchForUsers": "Search for @users...", + "pleaseEnterYourCurrentPassword": "Please enter your current password", + "newPassword": "New password", + "pleaseChooseAStrongPassword": "Please choose a strong password", + "passwordsDoNotMatch": "Passwords do not match", + "passwordIsWrong": "Your entered password is wrong", + "publicLink": "Public link", + "publicChatAddresses": "Public chat addresses", + "createNewAddress": "Create new address", + "joinSpace": "Join space", + "publicSpaces": "Public spaces", + "addChatOrSubSpace": "Add chat or sub space", + "subspace": "Subspace", + "decline": "Decline", + "thisDevice": "This device:", + "initAppError": "An error occured while init the app", + "userRole": "User role", + "minimumPowerLevel": "{level} is the minimum power level.", + "@minimumPowerLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "String" + } + } + }, + "searchIn": "Search in chat \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "Search more...", + "gallery": "Gallery", + "files": "Files", + "databaseBuildErrorBody": "Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at {url}. The error message is: {error}", + "@databaseBuildErrorBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sessionLostBody": "Your session is lost. Please report this error to the developers at {url}. The error message is: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "restoreSessionBody": "The app now tries to restore your session from the backup. Please report this error to the developers at {url}. The error message is: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "forwardMessageTo": "Forward message to {roomName}?", + "@forwardMessageTo": { + "type": "String", + "placeholders": { + "roomName": { + "type": "String" + } + } + }, + "sendReadReceipts": "Send read receipts", + "sendTypingNotificationsDescription": "Other participants in a chat can see when you are typing a new message.", + "sendReadReceiptsDescription": "Other participants in a chat can see when you have read a message.", + "formattedMessages": "Formatted messages", + "formattedMessagesDescription": "Display rich message content like bold text using markdown.", + "verifyOtherUser": "🔐 Verify other user", + "verifyOtherUserDescription": "If you verify another user, you can be sure that you know who you are really writing to. 💪\n\nWhen you start a verification, you and the other user will see a popup in the app. There you will then see a series of emojis or numbers that you have to compare with each other.\n\nThe best way to do this is to meet up or start a video call. 👭", + "verifyOtherDevice": "🔐 Verify other device", + "verifyOtherDeviceDescription": "When you verify another device, those devices can exchange keys, increasing your overall security. 💪 When you start a verification, a popup will appear in the app on both devices. There you will then see a series of emojis or numbers that you have to compare with each other. It's best to have both devices handy before you start the verification. 🤳", + "acceptedKeyVerification": "{sender} accepted key verification", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "canceledKeyVerification": "{sender} canceled key verification", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "completedKeyVerification": "{sender} completed key verification", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "{sender} is ready for key verification", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} requested key verification", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "startedKeyVerification": "{sender} started key verification", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "Transparent", + "incomingMessages": "Incoming messages", + "stickers": "Stickers", + "discover": "Discover", + "commandHint_ignore": "Ignore the given matrix ID", + "commandHint_unignore": "Unignore the given matrix ID", + "unreadChatsInApp": "{appname}: {unread} unread chats", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "noDatabaseEncryption": "Database encryption is not supported on this platform", + "thereAreCountUsersBlocked": "Right now there are {count} users blocked.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "restricted": "Restricted", + "knockRestricted": "Knock restricted", + "goToSpace": "Go to space: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "Mark as unread", + "userLevel": "{level} - User", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - Moderator", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - Admin", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "Change general chat settings", + "inviteOtherUsers": "Invite other users to this chat", + "changeTheChatPermissions": "Change the chat permissions", + "changeTheVisibilityOfChatHistory": "Change the visibility of the chat history", + "changeTheCanonicalRoomAlias": "Change the main public chat address", + "sendRoomNotifications": "Send a @room notifications", + "changeTheDescriptionOfTheGroup": "Change the description of the chat", + "chatPermissionsDescription": "Define which power level is necessary for certain actions in this chat. The power levels 0, 50 and 100 are usually representing users, moderators and admins, but any gradation is possible.", + "updateInstalled": "🎉 Update {version} installed!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "Changelog", + "sendCanceled": "Sending canceled", + "loginWithMatrixId": "Login with Matrix-ID", + "discoverHomeservers": "Discover homeservers", + "whatIsAHomeserver": "What is a homeserver?", + "homeserverDescription": "All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.", + "doesNotSeemToBeAValidHomeserver": "Doesn't seem to be a compatible homeserver. Wrong URL?", + "calculatingFileSize": "Calculating file size...", + "prepareSendingAttachment": "Prepare sending attachment...", + "sendingAttachment": "Sending attachment...", + "generatingVideoThumbnail": "Generating video thumbnail...", + "compressVideo": "Compressing video...", + "sendingAttachmentCountOfCount": "Sending attachment {index} of {length}...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "Server limit reached! Waiting {seconds} seconds...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "One of your devices is not verified", + "noticeChatBackupDeviceVerification": "Note: When you connect all your devices to the chat backup, they are automatically verified.", + "continueText": "Continue", + "welcomeText": "Hey Hey 👋 This is FluffyChat. You can sign in to any homeserver, which is compatible with https://matrix.org. And then chat with anyone. It's a huge decentralized messaging network!", + "blur": "Blur:", + "opacity": "Opacity:", + "setWallpaper": "Set wallpaper", + "manageAccount": "Manage account", + "noContactInformationProvided": "Server does not provide any valid contact information", + "contactServerAdmin": "Contact server admin", + "contactServerSecurity": "Contact server security", + "supportPage": "Support page", + "serverInformation": "Server information:", + "name": "Name", + "version": "Version", + "website": "Website", + "compress": "Compress", + "boldText": "Bold text", + "italicText": "Italic text", + "strikeThrough": "Strikethrough", + "pleaseFillOut": "Please fill out", + "invalidUrl": "Invalid url", + "addLink": "Add link", + "unableToJoinChat": "Unable to join chat. Maybe the other party has already closed the conversation.", + "previous": "Previous", + "otherPartyNotLoggedIn": "The other party is currently not logged in and therefore cannot receive messages!", + "appWantsToUseForLogin": "Use '{server}' to log in", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "You hereby allow the app and website to share information about you.", + "open": "Open", + "waitingForServer": "Waiting for server...", + "appIntroduction": "FluffyChat lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.", + "newChatRequest": "📩 New chat request", + "contentNotificationSettings": "Content notification settings", + "generalNotificationSettings": "General notification settings", + "roomNotificationSettings": "Room notification settings", + "userSpecificNotificationSettings": "User specific notification settings", + "otherNotificationSettings": "Other notification settings", + "notificationRuleContainsUserName": "Contains User Name", + "notificationRuleContainsUserNameDescription": "Notifies the user when a message contains their username.", + "notificationRuleMaster": "Mute all notifications", + "notificationRuleMasterDescription": "Overrides all other rules and disables all notifications.", + "notificationRuleSuppressNotices": "Suppress Automated Messages", + "notificationRuleSuppressNoticesDescription": "Suppresses notifications from automated clients like bots.", + "notificationRuleInviteForMe": "Invite for Me", + "notificationRuleInviteForMeDescription": "Notifies the user when they are invited to a room.", + "notificationRuleMemberEvent": "Member Event", + "notificationRuleMemberEventDescription": "Suppresses notifications for membership events.", + "notificationRuleIsUserMention": "User Mention", + "notificationRuleIsUserMentionDescription": "Notifies the user when they are directly mentioned in a message.", + "notificationRuleContainsDisplayName": "Contains Display Name", + "notificationRuleContainsDisplayNameDescription": "Notifies the user when a message contains their display name.", + "notificationRuleIsRoomMention": "Room Mention", + "notificationRuleIsRoomMentionDescription": "Notifies the user when there is a room mention.", + "notificationRuleRoomnotif": "Room Notification", + "notificationRuleRoomnotifDescription": "Notifies the user when a message contains '@room'.", + "notificationRuleTombstone": "Tombstone", + "notificationRuleTombstoneDescription": "Notifies the user about room deactivation messages.", + "notificationRuleReaction": "Reaction", + "notificationRuleReactionDescription": "Suppresses notifications for reactions.", + "notificationRuleRoomServerAcl": "Room Server ACL", + "notificationRuleRoomServerAclDescription": "Suppresses notifications for room server access control lists (ACL).", + "notificationRuleSuppressEdits": "Suppress Edits", + "notificationRuleSuppressEditsDescription": "Suppresses notifications for edited messages.", + "notificationRuleCall": "Call", + "notificationRuleCallDescription": "Notifies the user about calls.", + "notificationRuleEncryptedRoomOneToOne": "Encrypted Room One-to-One", + "notificationRuleEncryptedRoomOneToOneDescription": "Notifies the user about messages in encrypted one-to-one rooms.", + "notificationRuleRoomOneToOne": "Room One-to-One", + "notificationRuleRoomOneToOneDescription": "Notifies the user about messages in one-to-one rooms.", + "notificationRuleMessage": "Message", + "notificationRuleMessageDescription": "Notifies the user about general messages.", + "notificationRuleEncrypted": "Encrypted", + "notificationRuleEncryptedDescription": "Notifies the user about messages in encrypted rooms.", + "notificationRuleJitsi": "Jitsi", + "notificationRuleJitsiDescription": "Notifies the user about Jitsi widget events.", + "notificationRuleServerAcl": "Suppress Server ACL Events", + "notificationRuleServerAclDescription": "Suppresses notifications for Server ACL events.", + "unknownPushRule": "Unknown push rule '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️ {duration} - Voice message from {sender}", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "If you delete this notification setting, this can not be undone.", + "more": "More", + "shareKeysWith": "Share keys with...", + "shareKeysWithDescription": "Which devices should be trusted so that they can read along your messages in encrypted chats?", + "allDevices": "All devices", + "crossVerifiedDevicesIfEnabled": "Cross verified devices if enabled", + "crossVerifiedDevices": "Cross verified devices", + "verifiedDevicesOnly": "Verified devices only", + "takeAPhoto": "Take a photo", + "recordAVideo": "Record a video", + "optionalMessage": "(Optional) message...", + "notSupportedOnThisDevice": "Not supported on this device", + "enterNewChat": "Enter new chat", + "approve": "Approve", + "youHaveKnocked": "You have knocked", + "pleaseWaitUntilInvited": "Please wait now, until someone from the room invites you.", + "commandHint_logout": "Logout your current device", + "commandHint_logoutall": "Logout all active devices", + "displayNavigationRail": "Show navigation rail on mobile", + "customReaction": "Custom reaction", + "moreEvents": "More events", + "declineInvitation": "Decline invitation", + "noMessagesYet": "No messages yet", + "longPressToRecordVoiceMessage": "Long press to record voice message.", + "pause": "Pause", + "resume": "Resume", + "newSubSpace": "New sub space", + "moveToDifferentSpace": "Move to different space", + "moveUp": "Move up", + "moveDown": "Move down", + "removeFromSpaceDescription": "The chat will be removed from the space but still appear in your chat list.", + "countChats": "{chats} chats", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "Space member of {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Space member of {spaces} can knock", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "donate": "Donate", + "startedAPoll": "{username} started a poll.", + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "poll": "Poll", + "startPoll": "Start poll", + "endPoll": "End poll", + "answersVisible": "Answers visible", + "answersHidden": "Answers hidden", + "pollQuestion": "Poll question", + "answerOption": "Answer option", + "addAnswerOption": "Add answer option", + "allowMultipleAnswers": "Allow multiple answers", + "pollHasBeenEnded": "Poll has been ended", + "countVotes": "{count, plural, =1{One vote} other{{count} votes}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Answers will be visible when poll has ended", + "replyInThread": "Reply in thread", + "countReplies": "{count, plural, =1{One reply} other{{count} replies}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Thread", + "backToMainChat": "Back to main chat", + "saveChanges": "Save changes", + "createSticker": "Create sticker or emoji", + "useAsSticker": "Use as sticker", + "useAsEmoji": "Use as emoji", + "stickerPackNameAlreadyExists": "Sticker pack name already exists", + "newStickerPack": "New sticker pack", + "stickerPackName": "Sticker pack name", + "attribution": "Attribution", + "skipChatBackup": "Skip chat backup", + "skipChatBackupWarning": "Are you sure? Without enabling the chat backup you may lose access to your messages if you switch your device.", + "loadingMessages": "Loading messages", + "setupChatBackup": "Set up chat backup", + "noMoreResultsFound": "No more results found", + "chatSearchedUntil": "Chat searched until {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Federation Base URL", + "clientWellKnownInformation": "Client-Well-Known Information:", + "baseUrl": "Base URL", + "identityServer": "Identity Server:", + "versionWithNumber": "Version: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Logs", + "advancedConfigs": "Advanced Configs", + "advancedConfigurations": "Advanced configurations", + "signIn": "Sign in", + "createNewAccount": "Create new account", + "signUpGreeting": "FluffyChat is decentralized! Select a server where you want to create your account and let's go!", + "signInGreeting": "You already have an account in Matrix? Welcome back! Select your homeserver and sign in.", + "appIntro": "With FluffyChat you can chat with your friends. It's a secure decentralized [matrix] messenger! Learn more on https://matrix.org if you like or just sign up.", + "theProcessWasCanceled": "The process was canceled.", + "join": "Join", + "searchOrEnterHomeserverAddress": "Search or enter homeserver address", + "matrixId": "Matrix ID" } From 03d1b279d340932acda8edeb79f76b409dcf5e19 Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Tue, 24 Feb 2026 11:41:35 +0100 Subject: [PATCH 133/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 2e3b4e6a..42eb43b9 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -72,7 +72,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "Skal gjester tillates å ta del", + "areGuestsAllowedToJoin": "Kan gjester bli med?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -1065,7 +1065,7 @@ "type": "String", "placeholders": {} }, - "ok": "OK", + "ok": "Ok", "@ok": { "type": "String", "placeholders": {} @@ -2064,7 +2064,7 @@ "placeholders": {} }, "pleaseEnterRecoveryKey": "Vennligst skriv inn gjenopprettingsnøkkelen din:", - "pleaseEnterYourPin": "Vennligst skriv inn PIN-koden din", + "pleaseEnterYourPin": "Oppgi din PIN-kode", "@pleaseEnterYourPin": { "type": "String", "placeholders": {} @@ -2197,7 +2197,7 @@ "groupName": "Gruppenavn", "createGroupAndInviteUsers": "Opprett en gruppe og inviter brukere", "invite": "Inviter", - "wrongPinEntered": "Feil PIN-kode tastet inn! Prøv igjen om {seconds} sekunder...", + "wrongPinEntered": "Feil PIN-kode oppgitt! Prøv igjen om {seconds} sekunder...", "@wrongPinEntered": { "type": "String", "placeholders": { @@ -3152,5 +3152,7 @@ "signInGreeting": "Har du allerede en Matrix-konto? Velkommen tilbake! Velg hjemmeserveren din og logg inn.", "appIntro": "Med FluffyChat kan du chatte med vennene dine. Det er en sikker, desentralisert [matrix]-meldingsapp! Les mer på https://matrix.org hvis du vil, eller bare registrer deg.", "theProcessWasCanceled": "Prosessen ble avbrutt.", - "join": "Bli med" + "join": "Bli med", + "searchOrEnterHomeserverAddress": "Søk eller angi adresse til hjemmeserver", + "matrixId": "Matrix ID" } From 9234ac2cc1ef884a2f05dc15ac8d6e64e8d35057 Mon Sep 17 00:00:00 2001 From: xabirequejo Date: Tue, 24 Feb 2026 08:44:41 +0100 Subject: [PATCH 134/333] chore(translations): Translated using Weblate (Basque) Currently translated at 99.8% (842 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/ --- lib/l10n/intl_eu.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_eu.arb b/lib/l10n/intl_eu.arb index 07c1fc46..fc913cb7 100644 --- a/lib/l10n/intl_eu.arb +++ b/lib/l10n/intl_eu.arb @@ -3145,5 +3145,7 @@ "signInGreeting": "Baduzu dagoeneko Matrix kontu bat? Ongi etorri berriro ere! Hautatu zure zerbitzaria eta hasi saioa.", "appIntro": "FluffyChat-i esker lagunekin txateatu dezakezu. [matrix]-erako mezularitza programa seguru eta deszentralizatua da! Nahi baduzu, irakurri gehiago https://matrix.org gunean, edo hasi saioa.", "theProcessWasCanceled": "Eragiketa bertan behera utzi da.", - "join": "Batu" + "join": "Batu", + "searchOrEnterHomeserverAddress": "Bilatu edo sartu zerbitzariaren helbidea", + "matrixId": "Matrix IDa" } From a58c2244b3c122266f9abe20a97a027a539a61f3 Mon Sep 17 00:00:00 2001 From: Kimby Date: Mon, 22 Dec 2025 18:23:45 +0100 Subject: [PATCH 135/333] chore(translations): Translated using Weblate (Spanish) Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/es/ --- lib/l10n/intl_es.arb | 384 +------------------------------------------ 1 file changed, 2 insertions(+), 382 deletions(-) diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index 9ddfaaa4..dc5b9b4b 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -68,7 +68,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "¿Pueden unirse usuarios de visita?", + "areGuestsAllowedToJoin": "¿Son permitidos los usuarios de visita?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -363,7 +363,6 @@ "placeholders": {} }, "clearArchive": "Borrar archivo", - "@clearArchive": {}, "close": "Cerrar", "@close": { "type": "String", @@ -1576,7 +1575,6 @@ "placeholders": {} }, "addToSpace": "Agregar al espacio", - "@addToSpace": {}, "cantOpenUri": "No puedo abrir el URI {uri}", "@cantOpenUri": { "type": "String", @@ -1602,15 +1600,10 @@ "placeholders": {} }, "oneClientLoggedOut": "Se ha cerrado en la sesión de uno de sus clientes", - "@oneClientLoggedOut": {}, "addAccount": "Añadir cuenta", - "@addAccount": {}, "editBundlesForAccount": "Editar paquetes para esta cuenta", - "@editBundlesForAccount": {}, "addToBundle": "Agregar al paquete", - "@addToBundle": {}, "bundleName": "Nombre del paquete", - "@bundleName": {}, "saveFile": "Guardar el archivo", "@saveFile": { "type": "String", @@ -1700,7 +1693,6 @@ "placeholders": {} }, "chatHasBeenAddedToThisSpace": "El chat se ha agregado a este espacio", - "@chatHasBeenAddedToThisSpace": {}, "commandInvalid": "Comando inválido", "@commandInvalid": { "type": "String" @@ -1796,7 +1788,6 @@ "placeholders": {} }, "serverRequiresEmail": "Este servidor necesita validar su dirección de correo electrónico para registrarse.", - "@serverRequiresEmail": {}, "pleaseChoose": "Por favor elija", "@pleaseChoose": { "type": "String", @@ -1937,9 +1928,7 @@ "description": "State that {command} is not a valid /command." }, "scanQrCode": "Escanear código QR", - "@scanQrCode": {}, "homeserver": "Servidor inicial", - "@homeserver": {}, "newChat": "Nuevo chat", "@newChat": { "type": "String", @@ -1951,7 +1940,6 @@ "description": "Usage hint for the command /join" }, "sendOnEnter": "Enviar con enter", - "@sendOnEnter": {}, "changeYourAvatar": "Cambiar tu avatar", "@changeYourAvatar": { "type": "String", @@ -2050,11 +2038,8 @@ "placeholders": {} }, "removeFromBundle": "Quitar de este paquete", - "@removeFromBundle": {}, "link": "Link", - "@link": {}, "enableMultiAccounts": "(BETA) habilite varias cuenta en este dispositivo", - "@enableMultiAccounts": {}, "pleaseEnter4Digits": "Ingrese 4 dígitos o déjelo en blanco para deshabilitar el bloqueo de la aplicación.", "@pleaseEnter4Digits": { "type": "String", @@ -2111,40 +2096,30 @@ "placeholders": {} }, "yourChatBackupHasBeenSetUp": "Se ha configurado la copia de respaldo del chat.", - "@yourChatBackupHasBeenSetUp": {}, "unverified": "No verificado", - "@unverified": {}, "commandHint_clearcache": "Limpiar cache", "@commandHint_clearcache": { "type": "String", "description": "Usage hint for the command /clearcache" }, "messageInfo": "Información del mensaje", - "@messageInfo": {}, "time": "Tiempo", - "@time": {}, "openVideoCamera": "Abrir la cámara para un video", "@openVideoCamera": { "type": "String", "placeholders": {} }, "repeatPassword": "Repite la contraseña", - "@repeatPassword": {}, "removeFromSpace": "Eliminar del espacio", - "@removeFromSpace": {}, "addToSpaceDescription": "Elige un espacio para añadirle este chat.", - "@addToSpaceDescription": {}, "openGallery": "Abrir galería", - "@openGallery": {}, "start": "Iniciar", - "@start": {}, "commandHint_discardsession": "Descartar sesión", "@commandHint_discardsession": { "type": "String", "description": "Usage hint for the command /discardsession" }, "messageType": "Tipo de Mensaje", - "@messageType": {}, "videoWithSize": "Video ({size})", "@videoWithSize": { "type": "String", @@ -2155,27 +2130,16 @@ } }, "publish": "Publicar", - "@publish": {}, "newSpace": "Nuevo espacio", - "@newSpace": {}, "allSpaces": "Todos los espacios", - "@allSpaces": {}, "widgetUrlError": "Esta no es una URL válida.", - "@widgetUrlError": {}, "commandHint_markasgroup": "Marcar como grupo", - "@commandHint_markasgroup": {}, "nextAccount": "Siguiente cuenta", - "@nextAccount": {}, "youRejectedTheInvitation": "Rechazaste la invitación", - "@youRejectedTheInvitation": {}, "newGroup": "Nuevo grupo", - "@newGroup": {}, "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "previousAccount": "Cuenta anterior", - "@previousAccount": {}, "users": "Usuarios", - "@users": {}, "youInvitedBy": "📩 Has sido invitado por {user}", "@youInvitedBy": { "placeholders": { @@ -2185,11 +2149,8 @@ } }, "youAcceptedTheInvitation": "👍 Aceptaste la invitación", - "@youAcceptedTheInvitation": {}, "widgetEtherpad": "Nota de texto", - "@widgetEtherpad": {}, "commandHint_cuddle": "Enviar un abrazo", - "@commandHint_cuddle": {}, "supposedMxid": "Esto debería ser {mxid}", "@supposedMxid": { "type": "String", @@ -2200,23 +2161,14 @@ } }, "importFromZipFile": "Importar de un archivo .zip", - "@importFromZipFile": {}, "exportEmotePack": "Exportar paquete de emotes a .zip", - "@exportEmotePack": {}, "addChatDescription": "Añadir una descripción del chat...", - "@addChatDescription": {}, "sendTypingNotifications": "Enviar notificaciones \"está escribiendo\"", - "@sendTypingNotifications": {}, "importEmojis": "Importar emojis", - "@importEmojis": {}, "confirmMatrixId": "Por favor confirma tu Matrix ID para borrar tu cuenta.", - "@confirmMatrixId": {}, "notAnImage": "El archivo no es una imagen.", - "@notAnImage": {}, "commandHint_hug": "Mandar un abrazo", - "@commandHint_hug": {}, "importNow": "Importar ahora", - "@importNow": {}, "hugContent": "{senderName} te abraza", "@hugContent": { "type": "String", @@ -2227,9 +2179,7 @@ } }, "otherCallingPermissions": "Micrófono, cámara y otros permisos de FluffyChat", - "@otherCallingPermissions": {}, "emailOrUsername": "Correo electrónico o nombre de usuario", - "@emailOrUsername": {}, "countFiles": "{count} archivos", "@countFiles": { "placeholders": { @@ -2239,9 +2189,7 @@ } }, "reportUser": "Reportar usuario", - "@reportUser": {}, "voiceCall": "Llamada de voz", - "@voiceCall": {}, "reactedWith": "{sender} reaccionó con {reaction}", "@reactedWith": { "type": "String", @@ -2255,48 +2203,34 @@ } }, "markAsRead": "Marcar como leído", - "@markAsRead": {}, "widgetName": "Nombre", - "@widgetName": {}, "replace": "Reemplazar", - "@replace": {}, "unsupportedAndroidVersionLong": "Esta característica requiere una versión más reciente de Android. Por favor, compruebe las actualizaciones o la compatibilidad de LineageOS.", - "@unsupportedAndroidVersionLong": {}, "storeSecurlyOnThisDevice": "Almacenar de forma segura en este dispositivo", - "@storeSecurlyOnThisDevice": {}, "openChat": "Abrir chat", - "@openChat": {}, "screenSharingDetail": "Usted está compartiendo su pantalla en FluffyChat", - "@screenSharingDetail": {}, "allRooms": "Todos los chats grupales", "@allRooms": { "type": "String", "placeholders": {} }, "widgetVideo": "Vídeo", - "@widgetVideo": {}, "dismiss": "Descartar", - "@dismiss": {}, "unsupportedAndroidVersion": "Versión de Android no compatible", - "@unsupportedAndroidVersion": {}, "indexedDbErrorLong": "El almacenamiento de mensajes, por desgracia, no está habilitado en el modo privado por defecto.\nPor favor, visite\n - about:config\n - Establezca dom.indexedDB.privateBrowsing.enabled a true\nDe otra forma, no es posible usar FluffyChat.", - "@indexedDbErrorLong": {}, "startFirstChat": "Comience su primer chat", - "@startFirstChat": {}, "commandHint_create": "Crear un chat grupal vacío\nUse --no-encryption para deshabilitar el cifrado", "@commandHint_create": { "type": "String", "description": "Usage hint for the command /create" }, "user": "Usuario", - "@user": {}, "separateChatTypes": "Separar chats directos de grupos", "@separateChatTypes": { "type": "String", "placeholders": {} }, "tryAgain": "Inténtelo de nuevo", - "@tryAgain": {}, "youKickedAndBanned": "🙅 Usted expulsó y prohibió el acceso a {user}", "@youKickedAndBanned": { "placeholders": { @@ -2306,41 +2240,23 @@ } }, "messagesStyle": "Mensajes:", - "@messagesStyle": {}, "chatDescription": "Descripción del chat", - "@chatDescription": {}, "callingAccountDetails": "Permite a FluffyChat utilizar la aplicación de llamadas nativa de Android.", - "@callingAccountDetails": {}, "enterSpace": "Unirse al espacio", - "@enterSpace": {}, "pleaseEnterRecoveryKey": "Por favor, introduzca su clave de recuperación:", - "@pleaseEnterRecoveryKey": {}, "widgetNameError": "Por favor, proporciona un nombre para mostrar.", - "@widgetNameError": {}, "addWidget": "Añadir widget", - "@addWidget": {}, "hydrateTor": "TOR: Importar sesión exportada", - "@hydrateTor": {}, "storeInAppleKeyChain": "Almacenar en la KeyChain de Apple", - "@storeInAppleKeyChain": {}, "hydrate": "Restaurar desde fichero de copia de seguridad", - "@hydrate": {}, "invalidServerName": "Nombre del servidor no válido", - "@invalidServerName": {}, "chatPermissions": "Permisos del chat", - "@chatPermissions": {}, "sender": "Remitente", - "@sender": {}, "storeInAndroidKeystore": "Almacenar en la KeyStore de Android", - "@storeInAndroidKeystore": {}, "saveKeyManuallyDescription": "Compartir esta clave manualmente usando el diálogo de compartir del sistema o el portapapeles.", - "@saveKeyManuallyDescription": {}, "whyIsThisMessageEncrypted": "¿Por qué no se puede leer este mensaje?", - "@whyIsThisMessageEncrypted": {}, "setChatDescription": "Establecer descripción del chat", - "@setChatDescription": {}, "dehydrateWarning": "Esta acción no se puede deshacer. Asegúrese de que ha almacenado de forma segura el fichero de copia de seguridad.", - "@dehydrateWarning": {}, "redactedBy": "Censurado por {username}", "@redactedBy": { "type": "String", @@ -2351,11 +2267,8 @@ } }, "videoCallsBetaWarning": "Tenga en cuenta que las videollamadas están actualmente en fase beta. Es posible que no funcionen como se espera o que no funcionen de ninguna manera en algunas plataformas.", - "@videoCallsBetaWarning": {}, "callingPermissions": "Permisos de llamadas", - "@callingPermissions": {}, "unlockOldMessages": "Desbloquear mensajes viejos", - "@unlockOldMessages": {}, "numChats": "{number} chats", "@numChats": { "type": "number", @@ -2366,9 +2279,7 @@ } }, "optionalRedactReason": "(Opcional) Motivo para censurar este mensaje...", - "@optionalRedactReason": {}, "dehydrate": "Exportar sesión y limpiar dispositivo", - "@dehydrate": {}, "switchToAccount": "Cambiar a la cuenta {number}", "@switchToAccount": { "type": "number", @@ -2379,11 +2290,8 @@ } }, "experimentalVideoCalls": "Videollamadas experimentales", - "@experimentalVideoCalls": {}, "pleaseEnterRecoveryKeyDescription": "Para desbloquear sus viejos mensajes, introduzca su clave de recuperación que se generó en una sesión anterior. Su clave de recuperación NO es su contraseña.", - "@pleaseEnterRecoveryKeyDescription": {}, "inviteContactToGroupQuestion": "¿Quieres invitar a {contact} al chat {groupName}?", - "@inviteContactToGroupQuestion": {}, "redactedByBecause": "Censurado por {username} porque: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2405,9 +2313,7 @@ } }, "enterRoom": "Unirse a la sala", - "@enterRoom": {}, "confirmEventUnpin": "¿Seguro que quiere desfijar permanentemente el evento?", - "@confirmEventUnpin": {}, "youInvitedUser": "📩 Usted invitó a {user}", "@youInvitedUser": { "placeholders": { @@ -2417,19 +2323,12 @@ } }, "redactMessageDescription": "El mensaje será censurado para todas las personas participantes en la conversación. Esto no se puede deshacer.", - "@redactMessageDescription": {}, "recoveryKey": "Clave de recuperación", - "@recoveryKey": {}, "dehydrateTorLong": "Si está usando TOR, es recomendable exportar la sesión antes de cerrar la ventana.", - "@dehydrateTorLong": {}, "doNotShowAgain": "No mostrar de nuevo", - "@doNotShowAgain": {}, "hideUnimportantStateEvents": "Ocultar eventos de estado no importantes", - "@hideUnimportantStateEvents": {}, "screenSharingTitle": "Compartir la pantalla", - "@screenSharingTitle": {}, "widgetCustom": "Personalizado", - "@widgetCustom": {}, "youBannedUser": "Usted prohibió el acceso a {user}", "@youBannedUser": { "placeholders": { @@ -2439,11 +2338,8 @@ } }, "directChat": "Chat directo", - "@directChat": {}, "appearOnTop": "Aparecer en la cima", - "@appearOnTop": {}, "foregroundServiceRunning": "Esta notificación aparece cuando el servicio en segundo plano se está ejecutando.", - "@foregroundServiceRunning": {}, "wasDirectChatDisplayName": "Chat vacío (era {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2454,11 +2350,8 @@ } }, "noChatDescriptionYet": "No se ha creado una descripción del chat aún.", - "@noChatDescriptionYet": {}, "chatDescriptionHasBeenChanged": "Se ha cambiado la descripción del chat", - "@chatDescriptionHasBeenChanged": {}, "dehydrateTor": "TOR: Exportar sesión", - "@dehydrateTor": {}, "youKicked": "👞 Usted expulsó a {user}", "@youKicked": { "placeholders": { @@ -2468,20 +2361,15 @@ } }, "shareInviteLink": "Compartir enlace de invitación", - "@shareInviteLink": {}, "commandHint_markasdm": "Marcar como sala de mensajes directos para el ID de Matrix", - "@commandHint_markasdm": {}, "recoveryKeyLost": "¿Perdió su clave de recuperación?", - "@recoveryKeyLost": {}, "emoteKeyboardNoRecents": "Los emotes usados recientemente aparecerán aquí...", "@emoteKeyboardNoRecents": { "type": "String", "placeholders": {} }, "youJoinedTheChat": "Usted se ha unido al chat", - "@youJoinedTheChat": {}, "errorAddingWidget": "Fallo al añadir el widget.", - "@errorAddingWidget": {}, "commandHint_dm": "Iniciar un chat directo\nUse --no-encryption para deshabilitar el cifrado", "@commandHint_dm": { "type": "String", @@ -2496,19 +2384,12 @@ } }, "emojis": "Emojis", - "@emojis": {}, "createGroup": "Crear grupo", - "@createGroup": {}, "hydrateTorLong": "¿Exportó su sesión la última vez que estuvo en TOR? Impórtela rápidamente y continúe chateando.", - "@hydrateTorLong": {}, "custom": "Personalizado", - "@custom": {}, "storeInSecureStorageDescription": "Almacenar la clave de recuperación en el almacenamiento seguro de este dispositivo.", - "@storeInSecureStorageDescription": {}, "pinMessage": "Anclar a la sala", - "@pinMessage": {}, "indexedDbErrorTitle": "Problemas con el modo privado", - "@indexedDbErrorTitle": {}, "googlyEyesContent": "{senderName} te manda ojos saltones", "@googlyEyesContent": { "type": "String", @@ -2528,19 +2409,12 @@ } }, "commandHint_googly": "Enviar unos ojos saltones", - "@commandHint_googly": {}, "noChatsFoundHere": "No se han encontrado chats. Inicia un nuevo chat usando el botón de abajo. ⤵️", - "@noChatsFoundHere": {}, "joinedChats": "Chats Unidos", - "@joinedChats": {}, "space": "Espacio", - "@space": {}, "spaces": "Espacios", - "@spaces": {}, "block": "Bloquear", - "@block": {}, "blockListDescription": "Puedes bloquear usuarios que te estén molestando. No podrás recibir mensajes ni invitaciones de chat de los usuarios de tu lista de bloqueo.", - "@blockListDescription": {}, "aboutHomeserver": "Acerca de {homeserver}", "@aboutHomeserver": { "type": "String", @@ -2551,39 +2425,24 @@ } }, "unread": "No leídos", - "@unread": {}, "swipeRightToLeftToReply": "Desliza a la izquierda para responder", - "@swipeRightToLeftToReply": {}, "hideRedactedMessagesBody": "Si alguien elimina un mensaje, este mensaje ya no será visible en el chat.", - "@hideRedactedMessagesBody": {}, "hideInvalidOrUnknownMessageFormats": "Esconde formatos de mensajes inválidos o desconocidos", - "@hideInvalidOrUnknownMessageFormats": {}, "hideRedactedMessages": "Esconde mensajes eliminados", - "@hideRedactedMessages": {}, "appLockDescription": "Bloquear la aplicación cuando no se use con código pin", - "@appLockDescription": {}, "alwaysUse24HourFormat": "true", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, "accessAndVisibility": "Acceso y visibilidad", - "@accessAndVisibility": {}, "globalChatId": "ID de chat Global", - "@globalChatId": {}, "accessAndVisibilityDescription": "A quién se le permite unirse a este chat y cómo se puede descubrir el chat.", - "@accessAndVisibilityDescription": {}, "calls": "Llamadas", - "@calls": {}, "customEmojisAndStickers": "Emojis y stickers personalizados", - "@customEmojisAndStickers": {}, "customEmojisAndStickersBody": "Agrega o comparte emojis y stickers personalizados que se pueden utilizar en cualquier chat.", - "@customEmojisAndStickersBody": {}, "blockedUsers": "Usuarios bloqueados", - "@blockedUsers": {}, "blockUsername": "Ignorar nombre de usuario", - "@blockUsername": {}, "noMoreChatsFound": "No se encontraron más chats...", - "@noMoreChatsFound": {}, "countChatsAndCountParticipants": "{chats} chats y {participants} participantes", "@countChatsAndCountParticipants": { "type": "String", @@ -2597,26 +2456,18 @@ } }, "notifyMeFor": "Notificarme", - "@notifyMeFor": {}, "presencesToggle": "Mostrar mensajes de estado de otros usuarios", "@presencesToggle": { "type": "String", "placeholders": {} }, "placeCall": "Llamar", - "@placeCall": {}, "callingAccount": "Llamando a cuenta", - "@callingAccount": {}, "appearOnTopDetails": "Permite que la app aparezca delante (no hace falta si ya tienes Fluffychat configurado como cuenta llamante)", - "@appearOnTopDetails": {}, "disableEncryptionWarning": "Por motivos de seguridad no es posible deshabilitar el cifrado en un chat si ha sido habilitado previamente.", - "@disableEncryptionWarning": {}, "setColorTheme": "Poner tema de color:", - "@setColorTheme": {}, "inviteGroupChat": "📨 Invitar a grupo", - "@inviteGroupChat": {}, "invalidInput": "¡Entrada no válida!", - "@invalidInput": {}, "wrongPinEntered": "¡Pin erróneo! Vuelve a intenrarlo en {seconds} segundos...", "@wrongPinEntered": { "type": "String", @@ -2627,9 +2478,7 @@ } }, "decline": "Declinar", - "@decline": {}, "thisDevice": "Este dispositivo:", - "@thisDevice": {}, "minimumPowerLevel": "{level} es el nivel mínimo.", "@minimumPowerLevel": { "type": "String", @@ -2640,9 +2489,7 @@ } }, "verifyOtherDevice": "🔐 Verificar otro dispositivo", - "@verifyOtherDevice": {}, "chatPermissionsDescription": "Definir el nivel necesario para ciertas acciones en este chat. Los niveles 0, 50 y 100 habitualmente representan usuarios, moderadores y administradores, pero se puede establecer cualquier escala.", - "@chatPermissionsDescription": {}, "updateInstalled": "¡🎉 Actualización {version} instalada!", "@updateInstalled": { "type": "String", @@ -2653,11 +2500,8 @@ } }, "changelog": "Cambios", - "@changelog": {}, "sendCanceled": "Envío cancelado", - "@sendCanceled": {}, "invite": "Invitar", - "@invite": {}, "searchIn": "Buscar en chat \"{chat}\"...", "@searchIn": { "type": "String", @@ -2677,23 +2521,14 @@ } }, "appWantsToUseForLoginDescription": "Por la presente permites a la app y web compartir información sobre ti.", - "@appWantsToUseForLoginDescription": {}, "encryptThisChat": "Cifrar este chat", - "@encryptThisChat": {}, "publicLink": "Enlace público", - "@publicLink": {}, "transparent": "Transparente", - "@transparent": {}, "select": "Elegir", - "@select": {}, "newPassword": "Nueva clave", - "@newPassword": {}, "nothingFound": "No se encontró nada...", - "@nothingFound": {}, "subspace": "Sub espacio", - "@subspace": {}, "openLinkInBrowser": "Abrir enlace en navegador", - "@openLinkInBrowser": {}, "presenceStyle": "Presencia:", "@presenceStyle": { "type": "String", @@ -2717,103 +2552,54 @@ } }, "setTheme": "Poner tema:", - "@setTheme": {}, "learnMore": "Aprender más", - "@learnMore": {}, "incomingMessages": "Mensajes entrantes", - "@incomingMessages": {}, "noOtherDevicesFound": "No se han encontrado otros dispositivos", - "@noOtherDevicesFound": {}, "generalNotificationSettings": "Ajustes de notificación generales", - "@generalNotificationSettings": {}, "roomNotificationSettings": "Ajustes de notificación de salas", - "@roomNotificationSettings": {}, "userSpecificNotificationSettings": "Ajustes de notificación por usuario", - "@userSpecificNotificationSettings": {}, "contentNotificationSettings": "Ajustes de notificación de contenido", - "@contentNotificationSettings": {}, "otherNotificationSettings": "Otros ajustes de notificación", - "@otherNotificationSettings": {}, "notificationRuleContainsUserName": "Contiene nombre de usuario", - "@notificationRuleContainsUserName": {}, "notificationRuleContainsUserNameDescription": "Notifica al usuario cuando un mensaje contiene su nombre de usuario.", - "@notificationRuleContainsUserNameDescription": {}, "notificationRuleMaster": "Silenciar todas las notificaciones", - "@notificationRuleMaster": {}, "notificationRuleMasterDescription": "Anula todas las demás reglas y desactiva todas las notificaciones.", - "@notificationRuleMasterDescription": {}, "notificationRuleSuppressNotices": "Suprimir los mensajes automáticos", - "@notificationRuleSuppressNotices": {}, "notificationRuleSuppressNoticesDescription": "Suprimir notificaciones de clientes automáticos, como bots.", - "@notificationRuleSuppressNoticesDescription": {}, "notificationRuleInviteForMe": "Invitación para mí", - "@notificationRuleInviteForMe": {}, "notificationRuleInviteForMeDescription": "Notifica al usuario cuando se les invita a una sala.", - "@notificationRuleInviteForMeDescription": {}, "notificationRuleMemberEvent": "Evento para miembros", - "@notificationRuleMemberEvent": {}, "notificationRuleMemberEventDescription": "Suprimir notificaciones de eventos para miembros.", - "@notificationRuleMemberEventDescription": {}, "notificationRuleIsUserMention": "Mención al usuario", - "@notificationRuleIsUserMention": {}, "notificationRuleIsUserMentionDescription": "Notifica al usuario cuando son mencionados directamente en un mensaje.", - "@notificationRuleIsUserMentionDescription": {}, "notificationRuleContainsDisplayName": "Contiene el nombre visible", - "@notificationRuleContainsDisplayName": {}, "notificationRuleContainsDisplayNameDescription": "Notifica al usuario cuando un mensaje contiene su nombre visible.", - "@notificationRuleContainsDisplayNameDescription": {}, "notificationRuleIsRoomMention": "Mención de sala", - "@notificationRuleIsRoomMention": {}, "notificationRuleIsRoomMentionDescription": "Notifica al usuario cuando hay una mención de sala.", - "@notificationRuleIsRoomMentionDescription": {}, "notificationRuleRoomnotif": "Notificación de sala", - "@notificationRuleRoomnotif": {}, "notificationRuleRoomnotifDescription": "Notifica al usuario cuando un mensaje contiene '@sala'.", - "@notificationRuleRoomnotifDescription": {}, "notificationRuleTombstone": "Lápida", - "@notificationRuleTombstone": {}, "notificationRuleTombstoneDescription": "Notifica al usuario sobre mensajes de desactivación de sala.", - "@notificationRuleTombstoneDescription": {}, "notificationRuleReaction": "Reacción", - "@notificationRuleReaction": {}, "notificationRuleReactionDescription": "Suprime notificaciones por reacciones.", - "@notificationRuleReactionDescription": {}, "notificationRuleRoomServerAcl": "ACL de servidor de sala", - "@notificationRuleRoomServerAcl": {}, "notificationRuleRoomServerAclDescription": "Suprime notificaciones de listas de control de acceso de servidores de sala.", - "@notificationRuleRoomServerAclDescription": {}, "notificationRuleSuppressEdits": "Suprimir ediciones", - "@notificationRuleSuppressEdits": {}, "notificationRuleSuppressEditsDescription": "Suprime las notificaciones de mensajes editados.", - "@notificationRuleSuppressEditsDescription": {}, "notificationRuleCall": "Llamar", - "@notificationRuleCall": {}, "notificationRuleCallDescription": "Notifica al usuario de llamadas.", - "@notificationRuleCallDescription": {}, "notificationRuleEncryptedRoomOneToOne": "Sala cifrada uno a uno", - "@notificationRuleEncryptedRoomOneToOne": {}, "notificationRuleEncryptedRoomOneToOneDescription": "Notifica al usuario sobre mensajes en salas cifradas uno a uno.", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, "notificationRuleRoomOneToOne": "Sala uno a uno", - "@notificationRuleRoomOneToOne": {}, "notificationRuleRoomOneToOneDescription": "Notifica al usuario sobre mensajes en salas uno a uno.", - "@notificationRuleRoomOneToOneDescription": {}, "notificationRuleMessage": "Mensaje", - "@notificationRuleMessage": {}, "notificationRuleMessageDescription": "Notifica al usuario sobre mensajes generales.", - "@notificationRuleMessageDescription": {}, "notificationRuleEncrypted": "Cifrado", - "@notificationRuleEncrypted": {}, "notificationRuleEncryptedDescription": "Notifica al usuario sobre mensajes en salas cifradas.", - "@notificationRuleEncryptedDescription": {}, "notificationRuleJitsi": "Jitsi", - "@notificationRuleJitsi": {}, "notificationRuleJitsiDescription": "Notifica al usuario sobre eventos del componente de Jitsi.", - "@notificationRuleJitsiDescription": {}, "notificationRuleServerAcl": "Suprimir eventos de ACL del servidor", - "@notificationRuleServerAcl": {}, "notificationRuleServerAclDescription": "Suprime notificaciones de eventos de ACL del servidor.", - "@notificationRuleServerAclDescription": {}, "unknownPushRule": "Regla de notificación desconocida '{rule}'", "@unknownPushRule": { "type": "String", @@ -2824,9 +2610,7 @@ } }, "deletePushRuleCanNotBeUndone": "Si eliminas este ajuste de notificación, esto no se puede deshacer.", - "@deletePushRuleCanNotBeUndone": {}, "more": "Más", - "@more": {}, "serverLimitReached": "¡Alcanzado límite del servidor! Esperando {seconds} segundos...", "@serverLimitReached": { "type": "integer", @@ -2837,15 +2621,10 @@ } }, "groupCanBeFoundViaSearch": "Los grupos se pueden encontrar buscando", - "@groupCanBeFoundViaSearch": {}, "addChatOrSubSpace": "Añadir chat o sub espacio", - "@addChatOrSubSpace": {}, "sendRoomNotifications": "Mandar notificación @sala", - "@sendRoomNotifications": {}, "changeTheChatPermissions": "Cambiar los permisos de chat", - "@changeTheChatPermissions": {}, "setWallpaper": "Poner fondo", - "@setWallpaper": {}, "sendImages": "Envío de la imagen {count}", "@sendImages": { "type": "String", @@ -2864,13 +2643,9 @@ } }, "usersMustKnock": "Los usuarios han de avisar", - "@usersMustKnock": {}, "noOneCanJoin": "Nadie puede unirse", - "@noOneCanJoin": {}, "reopenChat": "Reabrir chat", - "@reopenChat": {}, "hidePresences": "¿Esconder la lista de estado?", - "@hidePresences": {}, "fileIsTooBigForServer": "¡No se pudo mandar! El servidor solamente permite adjuntos de hasta {max}.", "@fileIsTooBigForServer": { "type": "String", @@ -2881,19 +2656,12 @@ } }, "jumpToLastReadMessage": "Saltar al último mensaje leído", - "@jumpToLastReadMessage": {}, "report": "informe", - "@report": {}, "readUpToHere": "Leer hasta aquí", - "@readUpToHere": {}, "signInWithPassword": "Entrar con clave", - "@signInWithPassword": {}, "formattedMessages": "Mensajes con formato", - "@formattedMessages": {}, "publicSpaces": "Espacios públicos", - "@publicSpaces": {}, "formattedMessagesDescription": "Mostrar contenido de mensaje enriquecido, como texto en negrita, usando markdown.", - "@formattedMessagesDescription": {}, "userLevel": "{level} - Usuario", "@userLevel": { "type": "String", @@ -2913,21 +2681,13 @@ } }, "sendingAttachment": "Enviando adjunto...", - "@sendingAttachment": {}, "compress": "Comprimir", - "@compress": {}, "pleaseFillOut": "Por favor, rellenar", - "@pleaseFillOut": {}, "newChatRequest": "📩 Nueva petición de chat", - "@newChatRequest": {}, "unbanUserDescription": "El usuario podrá entrar al chat de nuevo si lo intenta.", - "@unbanUserDescription": {}, "roomUpgradeDescription": "El chat se volverá a crear con la nueva versión de sala. Todos los participantes serán notificados de que tienen que cambiarse al nuevo chat. Puedes encontrar más información sobre versiones de salas en https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, "makeAdminDescription": "Una vez hagas que este usuario sea admin, puede que no puedas deshacerlo porque tendrá los mismos permisos que tú.", - "@makeAdminDescription": {}, "knocking": "Avisando", - "@knocking": {}, "chatCanBeDiscoveredViaSearchOnServer": "El chat se puede descubrir buscando en {server}", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2938,23 +2698,14 @@ } }, "searchChatsRooms": "Buscar #chats, @usuarios...", - "@searchChatsRooms": {}, "groupName": "Nombre de grupo", - "@groupName": {}, "createGroupAndInviteUsers": "Crear un grupo e invitar usuarios", - "@createGroupAndInviteUsers": {}, "databaseMigrationTitle": "La base de datos está optimizada", - "@databaseMigrationTitle": {}, "searchForUsers": "Buscar @usuarios...", - "@searchForUsers": {}, "startConversation": "Iniciar conversación", - "@startConversation": {}, "gallery": "Galería", - "@gallery": {}, "files": "Archivos", - "@files": {}, "initAppError": "Hubo un error al arrancar la app", - "@initAppError": {}, "sessionLostBody": "Se perdió tu sesión. Por favor, informa de este error a los desarrolladores en {url}. El mensaje de error es: {error}", "@sessionLostBody": { "type": "String", @@ -2980,7 +2731,6 @@ } }, "restricted": "Restringido", - "@restricted": {}, "requestedKeyVerification": "{sender} ha pedido verificación de clave", "@requestedKeyVerification": { "type": "String", @@ -3000,15 +2750,10 @@ } }, "changeGeneralChatSettings": "Cambiar los ajustes generales de chat", - "@changeGeneralChatSettings": {}, "inviteOtherUsers": "Invitar a otros usuarios a este chat", - "@inviteOtherUsers": {}, "calculatingFileSize": "Calculando tamaño de archivo...", - "@calculatingFileSize": {}, "prepareSendingAttachment": "Prepara envío del adjunto...", - "@prepareSendingAttachment": {}, "generatingVideoThumbnail": "Generando miniatura de vídeo...", - "@generatingVideoThumbnail": {}, "sendingAttachmentCountOfCount": "Enviando adjunto {index} de {length}...", "@sendingAttachmentCountOfCount": { "type": "integer", @@ -3022,31 +2767,18 @@ } }, "compressVideo": "Comprimiendo vídeo...", - "@compressVideo": {}, "blur": "Difuminar:", - "@blur": {}, "continueText": "Continuar", - "@continueText": {}, "welcomeText": "Eh, eh, 👋 Esto es FluffyChat. Puedes acceder a cualquier homeserver, que sea compatible con https://matrix.org. Y luego chatear con cualquiera. ¡Es una red de mensajería descentralizada enorme!", - "@welcomeText": {}, "opacity": "Opacidad:", - "@opacity": {}, "version": "Versión", - "@version": {}, "serverInformation": "Información del servidor:", - "@serverInformation": {}, "website": "Web", - "@website": {}, "name": "Nombre", - "@name": {}, "knockRestricted": "Aviso restringido", - "@knockRestricted": {}, "hideMemberChangesInPublicChats": "Ocultar cambios de miembros en salas públicas", - "@hideMemberChangesInPublicChats": {}, "hideMemberChangesInPublicChatsBody": "No mostrar en el chat que alguien entra o sale de una sala pública para mejorar la inteligibilidad.", - "@hideMemberChangesInPublicChatsBody": {}, "passwordRecoverySettings": "Ajustes de recuperación de clave", - "@passwordRecoverySettings": {}, "acceptedKeyVerification": "{sender} aceptó la verificación de clave", "@acceptedKeyVerification": { "type": "String", @@ -3057,37 +2789,21 @@ } }, "stickers": "Pegatinas", - "@stickers": {}, "shareKeysWith": "Compartir claves con...", - "@shareKeysWith": {}, "shareKeysWithDescription": "¿Qué dispositivos deben ser de confianza para que puedan leer tus mensajes en chats cifrados?", - "@shareKeysWithDescription": {}, "crossVerifiedDevicesIfEnabled": "Dispositivos verificados si están habilitados", - "@crossVerifiedDevicesIfEnabled": {}, "allDevices": "Todos los dispositivos", - "@allDevices": {}, "crossVerifiedDevices": "Dispositivos verificados", - "@crossVerifiedDevices": {}, "verifiedDevicesOnly": "Solo dispositivos verificados", - "@verifiedDevicesOnly": {}, "deviceKeys": "Claves de dispositivo:", - "@deviceKeys": {}, "overview": "Vista general", - "@overview": {}, "removeDevicesDescription": "Vas a salir en este dispositivo y ya no podrás recibir mensajes.", - "@removeDevicesDescription": {}, "databaseMigrationBody": "Por favor espera. Esto llevará un momento.", - "@databaseMigrationBody": {}, "pleaseEnterYourCurrentPassword": "Por favor, pon tu clave actual", - "@pleaseEnterYourCurrentPassword": {}, "pleaseChooseAStrongPassword": "Por favor, pon una clave fuerte", - "@pleaseChooseAStrongPassword": {}, "joinSpace": "Unirse al espacio", - "@joinSpace": {}, "wrongRecoveryKey": "Lo siento... esta no parece ser la clave de recuperación correcta.", - "@wrongRecoveryKey": {}, "leaveEmptyToClearStatus": "Deja vacío para limpiar tu estado.", - "@leaveEmptyToClearStatus": {}, "databaseBuildErrorBody": "No pude crear la base de datos SQlite. La app intenta usar la base de datos heredada por ahora. Por favor, informa de este error a los desarrolladores en {url}. El mensaje de error es: {error}", "@databaseBuildErrorBody": { "type": "String", @@ -3113,15 +2829,10 @@ } }, "sendReadReceipts": "Mandar recibos de lectura", - "@sendReadReceipts": {}, "sendTypingNotificationsDescription": "Otros participantes en un chat pueden ver cuándo estás escribiendo un mensaje.", - "@sendTypingNotificationsDescription": {}, "sendReadReceiptsDescription": "Otros participantes en un chat pueden ver cuándo has leído un mensaje.", - "@sendReadReceiptsDescription": {}, "verifyOtherUserDescription": "Si verificas a otro usuario, puedes estar seguro de a quién estás escribiendo realmente. 💪\n\nCuando empiezas una verificación, tú y el otro usuario veréis una ventana emergente en la app. En ella veréis una serie de emojiso números que tenéis que comparar.\n\nLa mejor forma de hacer esto es quedar o una videollamada. 👭", - "@verifyOtherUserDescription": {}, "verifyOtherDeviceDescription": "Cuando verificas otro dispositivo, esos dispositivos pueden intercambiar claves, incrementando tu seguridad global. 💪 Cuando inicias una verificación, aparece una ventana en la app en ambos dispositivos. En ella, verás una serie de emojis o números que tienes que comparar. Es mejor tener ambos dispositivos a mano antes de empezar la verificación. 🤳", - "@verifyOtherDeviceDescription": {}, "canceledKeyVerification": "{sender} canceló la verificación de clave", "@canceledKeyVerification": { "type": "String", @@ -3132,9 +2843,7 @@ } }, "commandHint_unignore": "No ignorar la ID de matrix dada", - "@commandHint_unignore": {}, "noDatabaseEncryption": "En esta plataforma no hay cifrado de base de datos", - "@noDatabaseEncryption": {}, "startedKeyVerification": "{sender} ha comenzado verificación de clave", "@startedKeyVerification": { "type": "String", @@ -3145,20 +2854,15 @@ } }, "discover": "Descubrir", - "@discover": {}, "thereAreCountUsersBlocked": "Ahora mismo, hay {count} usuarios bloqueados.", "@thereAreCountUsersBlocked": { "type": "String", "count": {} }, "commandHint_ignore": "Ignorar la ID de matrix dada", - "@commandHint_ignore": {}, "jump": "Saltar", - "@jump": {}, "commandHint_sendraw": "Mandar json pelado", - "@commandHint_sendraw": {}, "kickUserDescription": "Se expulsa al usuario del chat, pero no se le prohíbe volver a entrar. En chats públicos, el usuario podrá volver a entrar en cualquier momento.", - "@kickUserDescription": {}, "fileHasBeenSavedAt": "Archivo guardado en {path}", "@fileHasBeenSavedAt": { "type": "String", @@ -3169,45 +2873,25 @@ } }, "markAsUnread": "Marcar no leído", - "@markAsUnread": {}, "changeTheDescriptionOfTheGroup": "Cambiar la descripción del chat", - "@changeTheDescriptionOfTheGroup": {}, "sorryThatsNotPossible": "Lo siento... eso no es posible", - "@sorryThatsNotPossible": {}, "publicChatAddresses": "Dirección de chat pública", - "@publicChatAddresses": {}, "createNewAddress": "Crear nueva dirección", - "@createNewAddress": {}, "userRole": "Rol de usuario", - "@userRole": {}, "boldText": "Texto en negrita", - "@boldText": {}, "italicText": "Texto en cursiva", - "@italicText": {}, "strikeThrough": "Tachado", - "@strikeThrough": {}, "searchMore": "Buscar más...", - "@searchMore": {}, "noPublicLinkHasBeenCreatedYet": "No se ha creado un enlace público aún", - "@noPublicLinkHasBeenCreatedYet": {}, "knock": "Aviso", - "@knock": {}, "newSpaceDescription": "Los espacios permiten consolidar los chats y montar comunidades privadas o públicas.", - "@newSpaceDescription": {}, "pleaseTryAgainLaterOrChooseDifferentServer": "Por favor, intente luego o elija un servidor distinto.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "pleaseEnterANumber": "Por favor pon un número mayor que 0", - "@pleaseEnterANumber": {}, "archiveRoomDescription": "El chat se moverá al archivo. Otros usuarios podrán ver que has abandonado el chat.", - "@archiveRoomDescription": {}, "pushNotificationsNotAvailable": "No están disponibles las notificaciones emergentes", - "@pushNotificationsNotAvailable": {}, "passwordsDoNotMatch": "Las claves no coinciden", - "@passwordsDoNotMatch": {}, "passwordIsWrong": "La clave que has puesto es incorrecta", - "@passwordIsWrong": {}, "verifyOtherUser": "🔐 Verificar a otro usuario", - "@verifyOtherUser": {}, "isReadyForKeyVerification": "{sender} está preparado para verificación de clave", "@isReadyForKeyVerification": { "type": "String", @@ -3223,29 +2907,17 @@ "space": {} }, "oneOfYourDevicesIsNotVerified": "Uno de tus dispositivos no está verificado", - "@oneOfYourDevicesIsNotVerified": {}, "noticeChatBackupDeviceVerification": "Nota: Cuando conectas todos tus dispositivos a la copia de seguridad del chat, son verificados automáticamente.", - "@noticeChatBackupDeviceVerification": {}, "manageAccount": "Gestionar cuenta", - "@manageAccount": {}, "contactServerAdmin": "Contactar con el administrador del servidor", - "@contactServerAdmin": {}, "contactServerSecurity": "Contactar con seguridad del servidor", - "@contactServerSecurity": {}, "supportPage": "Página de atención", - "@supportPage": {}, "invalidUrl": "URL incorrecta", - "@invalidUrl": {}, "addLink": "Añadir enlace", - "@addLink": {}, "unableToJoinChat": "No se puede entrar al chat. Puede que la otra parte ya haya cerrado la conversación.", - "@unableToJoinChat": {}, "waitingForServer": "Esperando al servidor...", - "@waitingForServer": {}, "discoverHomeservers": "Descubrir homeservers", - "@discoverHomeservers": {}, "profileNotFound": "El usuario no se encontró en el servidor. Puede que haya un problema de conexión o el usuario no exista.", - "@profileNotFound": {}, "synchronizingPleaseWaitCounter": " Sincronizando… ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -3256,7 +2928,6 @@ } }, "reportErrorDescription": "😭 Oh, no. Algo ha salido mal. Si quieres, puedes informar de este fallo a los desarrolladores.", - "@reportErrorDescription": {}, "hasKnocked": "🚪 {user} ha avisado", "@hasKnocked": { "placeholders": { @@ -3266,7 +2937,6 @@ } }, "noBackupWarning": "¡Cuidado! Si no se habilita la copia de seguridad del chat, perderás acceso a tus mensajes cifrados. Se recomienda encarecidamente habilitar la copia de seguridad del chat antes de salir.", - "@noBackupWarning": {}, "userWouldLikeToChangeTheChat": "{user} quiere unirse al chat.", "@userWouldLikeToChangeTheChat": { "placeholders": { @@ -3276,19 +2946,12 @@ } }, "yourGlobalUserIdIs": "Tu id de usuario global es: ", - "@yourGlobalUserIdIs": {}, "noKeyForThisMessage": "Esto puede ocurrir si el mensaje se envió antes de que entraras en tu cuenta en este dispositivo.\n\nTambién puede que el remitente haya bloqueado tu dispositivo o haya fallado algo en la conexión a Internet.\n\n¿Puedes leer el mensaje en otra sesión? Entonces, ¡puedes transferir el mensaje desde allí! Ve a Ajustes > Dispositivos y asegúrate de que tus dispositivos se han verificado mutuamente. Cuando abras la sala la próxima vez y ambas sesiones estén en primer plano, las claves se transmitirán automáticamente.\n\n¿No quieres perder las claves al salir o al cambiar de dispositivo? Asegúrate de que has habilitado la copia de seguridad del chat en los ajustes.", - "@noKeyForThisMessage": {}, "invitePrivateChat": "📨 Invitar a grupo privado", - "@invitePrivateChat": {}, "banUserDescription": "Se expulsará al usuario del chat y no podrá volver a entrar hasta que se le permita.", - "@banUserDescription": {}, "loginWithMatrixId": "Entrar con un ID de Matrix", - "@loginWithMatrixId": {}, "changeTheCanonicalRoomAlias": "Cambiar la dirección pública principal de chat", - "@changeTheCanonicalRoomAlias": {}, "noContactInformationProvided": "El servidor no suministra ninguna información de contacto válida", - "@noContactInformationProvided": {}, "noUsersFoundWithQuery": "Desgraciadamente, no se encontró ningún usuario con \"{query}\". Por favor, revisa si cometiste un error.", "@noUsersFoundWithQuery": { "type": "String", @@ -3299,9 +2962,7 @@ } }, "changeTheVisibilityOfChatHistory": "Cambiar la visibilidad de la historia de chat", - "@changeTheVisibilityOfChatHistory": {}, "doesNotSeemToBeAValidHomeserver": "No parece ser un homeserver compatible. ¿URL equivocada?", - "@doesNotSeemToBeAValidHomeserver": {}, "moderatorLevel": "{level} - Moderador", "@moderatorLevel": { "type": "String", @@ -3312,13 +2973,9 @@ } }, "homeserverDescription": "Todos tus datos se guardan en el homeserver, como en un proveedor de correo electrónico. Puedes elegir el homeserver que quieres usar, a la par que te puedes comunicar con todos. Más en https://matrix.org.", - "@homeserverDescription": {}, "whatIsAHomeserver": "¿Qué es un homeserver?", - "@whatIsAHomeserver": {}, "open": "Abrir", - "@open": {}, "appIntroduction": "FluffyChat te permite chatear con tus amigos con diferentes mensajerías. Aprende más en https://matrix.org o simplemente pincha *Continuar*.", - "@appIntroduction": {}, "forwardMessageTo": "¿Reenviar mensaje a {roomName}?", "@forwardMessageTo": { "type": "String", @@ -3329,25 +2986,15 @@ } }, "previous": "Anterior", - "@previous": {}, "otherPartyNotLoggedIn": "La otra parte ahora mismo no está conectada y por tanto ¡no puede recibir mensajes!", - "@otherPartyNotLoggedIn": {}, "takeAPhoto": "Tomar foto", - "@takeAPhoto": {}, "recordAVideo": "Grabar video", - "@recordAVideo": {}, "optionalMessage": "(Opcional) mensaje...", - "@optionalMessage": {}, "notSupportedOnThisDevice": "No es compatible con este dispositivo", - "@notSupportedOnThisDevice": {}, "enterNewChat": "Ingresar a nuevo chat", - "@enterNewChat": {}, "pleaseWaitUntilInvited": "Por favor espera, hasta que alguien del chat te invite.", - "@pleaseWaitUntilInvited": {}, "commandHint_roomupgrade": "Actualizar este chat a la versión de chat asignada", - "@commandHint_roomupgrade": {}, "checkList": "Lista de tareas", - "@checkList": {}, "countInvited": "{count} invitado", "@countInvited": { "type": "String", @@ -3370,51 +3017,28 @@ } }, "setCustomPermissionLevel": "Agregar nivel personalizado de permiso", - "@setCustomPermissionLevel": {}, "setPermissionsLevelDescription": "Por favor elige un rol predeterminado o un nivel de permiso personalizado entre 0 a 100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Ignorar usuario", - "@ignoreUser": {}, "normalUser": "Usuario normal", - "@normalUser": {}, "commandHint_logout": "Salir del dispositivo actual", - "@commandHint_logout": {}, "commandHint_logoutall": "Salir de todos los dispositivos activos", - "@commandHint_logoutall": {}, "displayNavigationRail": "Mostrar carril de navegación en móvil", - "@displayNavigationRail": {}, "approve": "Aprobar", - "@approve": {}, "youHaveKnocked": "Has sido expulsado", - "@youHaveKnocked": {}, "customReaction": "Reacción personalizada", - "@customReaction": {}, "moreEvents": "Más eventos", - "@moreEvents": {}, "declineInvitation": "Rechazar invitación", - "@declineInvitation": {}, "changedTheChatDescription": "{username} ha cambiado la descripción del chat", - "@changedTheChatDescription": {}, "changedTheChatName": "{username} ha cambiado el nombre del chat", - "@changedTheChatName": {}, "noMessagesYet": "Sin mensajes", - "@noMessagesYet": {}, "longPressToRecordVoiceMessage": "Deja presionado para grabar un mensaje.", - "@longPressToRecordVoiceMessage": {}, "pause": "Pausa", - "@pause": {}, "resume": "Continuar", - "@resume": {}, "newSubSpace": "Nuevo sub espacio", - "@newSubSpace": {}, "moveToDifferentSpace": "Mover a otro espacio", - "@moveToDifferentSpace": {}, "moveUp": "Mover arriba", - "@moveUp": {}, "moveDown": "Mover abajo", - "@moveDown": {}, "removeFromSpaceDescription": "El chat sera removido del espacio pero continuara apareciendo en tu lista de chats.", - "@removeFromSpaceDescription": {}, "countChats": "{chats} chats", "@countChats": { "type": "String", @@ -3434,11 +3058,7 @@ } }, "poll": "Encuesta", - "@poll": {}, "startPoll": "Iniciar encuesta", - "@startPoll": {}, "endPoll": "Finalizar encuesta", - "@endPoll": {}, - "answersVisible": "Respuestas visibles", - "@answersVisible": {} + "answersVisible": "Respuestas visibles" } From 0012dbd42527f4ceaf01e1d325fc79073b815ad5 Mon Sep 17 00:00:00 2001 From: SpikyBee Date: Mon, 23 Feb 2026 20:34:13 +0100 Subject: [PATCH 136/333] chore(translations): Translated using Weblate (Spanish) Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/es/ --- lib/l10n/intl_es.arb | 98 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index dc5b9b4b..0275ef30 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -68,7 +68,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "¿Son permitidos los usuarios de visita?", + "areGuestsAllowedToJoin": "¿Pueden los usuarios invitados unirse?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -3060,5 +3060,99 @@ "poll": "Encuesta", "startPoll": "Iniciar encuesta", "endPoll": "Finalizar encuesta", - "answersVisible": "Respuestas visibles" + "answersVisible": "Respuestas visibles", + "spaceMemberOf": "Espacio miembro de {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "Miembros del espacio de {spaces} pueden llamar", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "donate": "Donar", + "answersHidden": "Respuestas ocultas", + "pollQuestion": "Pregunta de encuesta", + "answerOption": "Respuesta", + "addAnswerOption": "Añadir respuesta", + "allowMultipleAnswers": "Permitir varias respuestas", + "pollHasBeenEnded": "La encuesta ha terminado", + "countVotes": "{count, plural, =1{One vote} other{{count} votes}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "Las respuestas serán visibles cuando termine la encuesta", + "replyInThread": "Contestar en el hilo", + "countReplies": "{count, plural, =1{One reply} other{{count} replies}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "Hilo", + "backToMainChat": "Volver al chat pricipal", + "saveChanges": "Guardar cambios", + "createSticker": "Crear sticker o emoticono", + "useAsSticker": "Usar como sticker", + "useAsEmoji": "Usar como emoticono", + "stickerPackNameAlreadyExists": "El nombre del paquete de stickers ya existe", + "newStickerPack": "Nuevo paquete de stickers", + "stickerPackName": "Nombre del paquete de stickers", + "attribution": "Atribución", + "skipChatBackup": "Omitir copia de seguridad del chat", + "skipChatBackupWarning": "¿Estás seguro? Sin habilitar la copia de seguridad del chat puedes perder el acceso a tus mensajes si cambias de dispositivo.", + "loadingMessages": "Cargando mensajes", + "setupChatBackup": "Configurar la copia de seguridad del chat", + "noMoreResultsFound": "No se han encontrado más resultados", + "chatSearchedUntil": "Chat buscado hasta {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "URL de la Federación Base", + "clientWellKnownInformation": "Información conocida del cliente:", + "baseUrl": "URL Base", + "identityServer": "Identidad del Servidor:", + "versionWithNumber": "Versión: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Registros", + "advancedConfigs": "Configuración avanzada", + "advancedConfigurations": "Configuraciones Avanzadas", + "signIn": "Iniciar sesión", + "createNewAccount": "Crear nueva cuenta", + "signUpGreeting": "¡FluffyChat está descentralizado! ¡Selecciona un servidor donde quieres crear tu cuenta y sigamos!", + "signInGreeting": "¿Ya tienes una cuenta en Matrix? ¡Bienvenido de nuevo! Selecciona tu servidor e inicia sesión.", + "appIntro": "Con FluffyChat puedes hablar con tus amigos ¡Es un sistema de mensajería de [matrix] seguro y descentralizado! Aprende más en https://matrix.org si quieres o simplemente inicia sesión.", + "theProcessWasCanceled": "El proceso se ha cancelado.", + "join": "Unirse", + "searchOrEnterHomeserverAddress": "Buscar o pon la dirección de tu servidor local", + "matrixId": "Matrix ID" } From 7e9478b92fe1828e110a9b3eda8b7d72caed5a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Tue, 24 Feb 2026 11:16:48 +0100 Subject: [PATCH 137/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index fd1d59ba..03c27b96 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -602,7 +602,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "An bhfuil cead ag aoi-úsáideoirí a bheith páirteach", + "areGuestsAllowedToJoin": "An bhfuil cead ag úsáideoirí aoi páirt a ghlacadh?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -3151,5 +3151,7 @@ "signInGreeting": "An bhfuil cuntas agat i Matrix cheana féin? Fáilte ar ais! Roghnaigh do fhreastalaí baile agus sínigh isteach.", "appIntro": "Le FluffyChat is féidir leat comhrá a dhéanamh le do chairde. Is teachtaire [maitrís] díláraithe slán é! Foghlaim tuilleadh ar https://matrix.org más maith leat nó cláraigh.", "theProcessWasCanceled": "Cuireadh an próiseas ar ceal.", - "join": "Téigh i" + "join": "Téigh i", + "searchOrEnterHomeserverAddress": "Cuardaigh nó cuir isteach seoladh an fhreastalaí baile", + "matrixId": "Aitheantas Maitrís" } From f5992ddeca86921912b6efd0adb7ccab94e9c26f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Tue, 24 Feb 2026 19:01:32 +0100 Subject: [PATCH 138/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 58.0% (489 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 173 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index fda3960f..e88db8b5 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1789,5 +1789,176 @@ "callingAccountDetails": "Sireg FluffyChat ad iseqdec asnas aneṣli n Android i usɛeddi n usiwel.", "appearOnTop": "Sbeqeḍ deg uksawen", "otherCallingPermissions": "Tisirag n umikrufun, takamiṛat akked tiyaḍ n FluffyChat", - "whyIsThisMessageEncrypted": "Acuɣer izen-agi ur yettwaɣri ara?" + "whyIsThisMessageEncrypted": "Acuɣer izen-agi ur yettwaɣri ara?", + "recoveryKeyLost": "Tasarut n tririt teɛreq?", + "seenByUser": "Yemmẓer sɣur {username}", + "@seenByUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "send": "Azen", + "@send": { + "type": "String", + "placeholders": {} + }, + "sendAMessage": "Azen izen", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "Azen am uḍris", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "Azen ameslaw", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendFile": "Azen afaylu", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "sendImage": "Azen tugna", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "Azen {count} n tugna(iwin)", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendMessages": "Azen iznan", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "sendOriginal": "Azen aneṣli", + "@sendOriginal": { + "type": "String", + "placeholders": {} + }, + "sendSticker": "Azen ticṛeṭ n tesfift", + "@sendSticker": { + "type": "String", + "placeholders": {} + }, + "sendVideo": "Azen avidyu", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentAFile": "📁 {username} yuzen afaylu", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAnAudio": "🎤 {username} yuzen ameslaw", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} yuzen tugna", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentASticker": "😊 {username} yuzen ticṛeṭ n tesfift", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} yuzen tavidyut", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} yuzen talɣut n usiwel", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "Sbadu-t d tazaẓlut tagejdant", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "noOtherDevicesFound": "Ulac ibenkan nniḍen yettwafen", + "fileIsTooBigForServer": "Ur izmir ara ad yazen! Aqeddac yessefrak kan ifuyla imeddayen almi ɣer {max}.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "Afaylu yettwasekles deg {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "Ddu ɣer yizen aneggaru yettwaɣen", + "readUpToHere": "Ɣeṛ dagi", + "jump": "Neggez", + "openLinkInBrowser": "Ldi aseɣwen deg yiminig", + "reportErrorDescription": "😭 Uhu. Yella kra n wugur ay yellan. Ma tebɣiḍ, tzemreḍ ad tazneḍ aneqqis-a i yineflayen.", + "report": "aneqqis", + "signInWithPassword": "Kcem s wawal n uɛeddi", + "pleaseTryAgainLaterOrChooseDifferentServer": "Ma ulac aɣilif, ɛreḍ tikelt nniḍen ticki neɣ fren aqeddac nniḍen.", + "profileNotFound": "Aseqdac ur yettwaf ara deg uqeddac. Ahat yella wugur n uẓeṭṭa neɣ aseqdac ulac-it.", + "setTheme": "Sbadu asentel:", + "setColorTheme": "Sbadu asentel n yini:", + "invite": "Snubget", + "inviteGroupChat": "📨Snubget ɣer udiwenni n ugraw", + "invitePrivateChat": "📨Snubget ɣze udiwenni Uslig", + "invalidInput": "Anekcam d armeɣtu!", + "wrongPinEntered": "Tettwasekcem tangalt PIN d armeɣtut! Ɛreḍ tikkelt nniḍen deg {seconds} n tasinin…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "Ma ulac aɣilif sekcem amḍan yugaren 0" } From 2bf200d44ad58f7a54e2a6aa0cc30348365f2df0 Mon Sep 17 00:00:00 2001 From: Jelv Date: Tue, 24 Feb 2026 10:27:40 +0100 Subject: [PATCH 139/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index 33581c89..d95f9d0d 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -83,7 +83,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "Mogen gasten deelnemen", + "areGuestsAllowedToJoin": "Mogen gasten deelnemen?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -861,7 +861,7 @@ "type": "String", "placeholders": {} }, - "groupIsPublic": "Groep is openbaar", + "groupIsPublic": "Groep is publiek", "@groupIsPublic": { "type": "String", "placeholders": {} @@ -1200,7 +1200,7 @@ "type": "String", "placeholders": {} }, - "noEncryptionForPublicRooms": "Je kunt de versleuteling pas activeren zodra de chat niet meer openbaar toegankelijk is.", + "noEncryptionForPublicRooms": "Je kunt de versleuteling pas activeren zodra de chat niet meer publiek toegankelijk is.", "@noEncryptionForPublicRooms": { "type": "String", "placeholders": {} @@ -1420,7 +1420,7 @@ "type": "String", "placeholders": {} }, - "publicRooms": "Openbare chats", + "publicRooms": "Publieke chats", "@publicRooms": { "type": "String", "placeholders": {} @@ -1738,7 +1738,7 @@ "type": "String", "placeholders": {} }, - "spaceIsPublic": "Space is openbaar", + "spaceIsPublic": "Space is publiek", "@spaceIsPublic": { "type": "String", "placeholders": {} @@ -2364,7 +2364,7 @@ "encryptThisChat": "Versleutel deze chat", "deviceKeys": "Apparaatsleutels:", "startFirstChat": "Begin je eerste chat", - "newSpaceDescription": "Met spaces kun je je chats samenvoegen en privé- of openbare community's bouwen.", + "newSpaceDescription": "Met spaces kun je je chats samenvoegen en privé- of publieke community's bouwen.", "noOtherDevicesFound": "Geen andere apparaten gevonden", "noBackupWarning": "Waarschuwing! Zonder de chatback-up in te schakelen, verlies je de toegang tot je versleutelde berichten. Het is sterk aanbevolen om eerst de chatback-up in te schakelen voordat je uitlogt.", "fileIsTooBigForServer": "Kan niet verzenden! De server ondersteunt alleen bijlages tot {max}.", @@ -2480,7 +2480,7 @@ "learnMore": "Lees meer", "roomUpgradeDescription": "De chat zal dan opnieuw gemaakt worden met de nieuwe kamerversie. Alle deelnemers worden geïnformeerd dat ze moeten overstappen naar de nieuwe chat. Je kan meer lezen over kamerversies op https://spec.matrix.org/latest/rooms/", "pleaseEnterANumber": "Vul een getal in groter dan 0", - "kickUserDescription": "De persoon is verwijderd uit de chat, maar is niet verbannen. In openbare chats kan de persoon op elk moment opnieuw deelnemen.", + "kickUserDescription": "De persoon is verwijderd uit de chat, maar is niet verbannen. In publieke chats kan de persoon op elk moment opnieuw deelnemen.", "alwaysUse24HourFormat": "true", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." @@ -2527,9 +2527,9 @@ } } }, - "publicSpaces": "Openbare spaces", + "publicSpaces": "Publieke spaces", "blockUsername": "Negeer inlognaam", - "publicChatAddresses": "Openbare chat adressen", + "publicChatAddresses": "Publieke chat adressen", "createNewAddress": "Creëer nieuw adres", "countChatsAndCountParticipants": "{chats} chats en {participants} deelnemers", "@countChatsAndCountParticipants": { @@ -2566,7 +2566,7 @@ "restricted": "Beperkt", "searchForUsers": "Zoek @personen...", "searchMore": "Zoek meer...", - "noPublicLinkHasBeenCreatedYet": "Openbare link is nog niet gecreëerd", + "noPublicLinkHasBeenCreatedYet": "Publieke link is nog niet gecreëerd", "groupCanBeFoundViaSearch": "Groep kan gevonden worden via zoeken", "searchIn": "Zoek in chat \"{chat}\"...", "@searchIn": { @@ -2668,8 +2668,8 @@ "placeholders": {} }, "website": "Website", - "hideMemberChangesInPublicChats": "Verberg persoon veranderingen in openbare chats", - "hideMemberChangesInPublicChatsBody": "Verberg in de tijdlijn van de chat als iemand zich aanmeldt bij een openbare chat of deze verlaat om de leesbaarheid te verbeteren.", + "hideMemberChangesInPublicChats": "Verberg persoon veranderingen in publieke chats", + "hideMemberChangesInPublicChatsBody": "Verberg in de tijdlijn van de chat als iemand zich aanmeldt bij een publieke chat of deze verlaat om de leesbaarheid te verbeteren.", "startConversation": "Start gesprek", "usersMustKnock": "Personen moeten kloppen", "noUsersFoundWithQuery": "Helaas kan er geen persoon gevonden worden met \"{query}\". Controleer of je een typfout hebt gemaakt.", @@ -2715,7 +2715,7 @@ "passwordIsWrong": "Je ingevoerde wachtwoord is fout", "newPassword": "Nieuw wachtwoord", "pleaseChooseAStrongPassword": "Kies a.j.b. een sterk wachtwoord", - "publicLink": "Openbare link", + "publicLink": "Publieke link", "select": "Selecteer", "leaveEmptyToClearStatus": "Laat leeg om je status te resetten.", "addChatOrSubSpace": "Voeg chat of subspace toe", @@ -2778,7 +2778,7 @@ "notificationRuleInviteForMe": "Persoonlijke uitnodiging", "inviteOtherUsers": "Personen voor deze chat uitnodigen", "changeTheChatPermissions": "Chatrechten wijzigen", - "changeTheCanonicalRoomAlias": "Standaard openbaar chat-adres wijzigen", + "changeTheCanonicalRoomAlias": "Standaard publiek chat-adres wijzigen", "blur": "Vervaag:", "isReadyForKeyVerification": "{sender} is klaar voor de sleutelverificatie", "@isReadyForKeyVerification": { @@ -3144,5 +3144,7 @@ "signInGreeting": "Heb je al een Matrix account? Welkom terug! Kies jouw server en log in.", "appIntro": "Met FluffyChat kan je chatten met je vrienden. Het is een veilige en decentrale [matrix] app! Lees meer op https://matrix.org als je wilt of kies registreren.", "theProcessWasCanceled": "Het proces is geannuleerd.", - "join": "Deelnemen" + "join": "Deelnemen", + "searchOrEnterHomeserverAddress": "Zoek of voer serveradres in", + "matrixId": "Matrix-ID" } From e3b5cf2baae9d0740adf34028147c96be6c6a41e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Tue, 24 Feb 2026 03:34:51 +0100 Subject: [PATCH 140/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 4ef6388b..f7842be8 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -78,7 +78,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "是否允许访客加入", + "areGuestsAllowedToJoin": "允许访客加入吗?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -3145,5 +3145,7 @@ "signInGreeting": "已经有 Matrix 账户了?欢迎回来!选择 homeserver 登录。", "appIntro": "借助 FluffyChat,您可以和好友聊天。它是安全的去中心化 [matrix] 消息收发应用!如果愿意,可以在 https://matrix.org 了解更多信息,也可直接注册账户。", "theProcessWasCanceled": "过程被取消。", - "join": "加入" + "join": "加入", + "searchOrEnterHomeserverAddress": "搜索或输入 homeserver 地址", + "matrixId": "Matrix ID" } From 3cdaf97a4cc7e0129aee3a7e6898700f513bb42a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 23 Feb 2026 20:25:58 +0100 Subject: [PATCH 141/333] chore(translations): Translated using Weblate (Estonian) Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/ --- lib/l10n/intl_et.arb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index 984c2dd1..e65f62a0 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -83,7 +83,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "Kas külalised võivad liituda", + "areGuestsAllowedToJoin": "Kas külalised võivad liituda?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -3145,5 +3145,7 @@ "signInGreeting": "Sul juba on Matrixi kasutajakonto olemas? Tere tulemast tagasi! Vali oma koduserver ja logi sisse.", "appIntro": "FluffyChati abil saad suhelda oma sõpradega. See on turvaline ja hajutatud sõnumiklient [matrix]-i võrgus! Lisateavet leiad https://matrix.org saidist või lihtsalt liitu.", "theProcessWasCanceled": "Protsess on katkestatud.", - "join": "Liitu" + "join": "Liitu", + "searchOrEnterHomeserverAddress": "Otsi koduserveri aadressi või sisesta see", + "matrixId": "Matrixi kasutajatunnus" } From 2408568f365e3f3a648ecedb635f8b320c5cbf58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Feb 2026 20:23:35 +0100 Subject: [PATCH 142/333] chore: Follow up sign up design --- lib/pages/sign_in/sign_in_page.dart | 311 +++++++++--------- lib/pages/sign_in/utils/sort_homeservers.dart | 2 +- .../model/public_homeserver_data.dart | 6 +- lib/utils/sign_in_flows/check_homeserver.dart | 2 +- pubspec.lock | 24 +- 5 files changed, 174 insertions(+), 171 deletions(-) diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index e86d39bb..77f09df9 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -37,164 +37,165 @@ class SignInPage extends StatelessWidget { ? L10n.of(context).createNewAccount : L10n.of(context).login, ), - bottom: PreferredSize( - preferredSize: const Size.fromHeight(56 + 60), - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisSize: .min, - crossAxisAlignment: .center, - spacing: 12, - children: [ - SelectableText( - signUp - ? L10n.of(context).signUpGreeting - : L10n.of(context).signInGreeting, - textAlign: .center, + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + spacing: 16, + children: [ + SelectableText( + signUp + ? L10n.of(context).signUpGreeting + : L10n.of(context).signInGreeting, + textAlign: .center, + ), + TextField( + readOnly: + state.publicHomeservers.connectionState == + ConnectionState.waiting, + controller: viewModel.filterTextController, + autocorrect: false, + keyboardType: TextInputType.url, + decoration: InputDecoration( + filled: true, + fillColor: theme.colorScheme.secondaryContainer, + border: OutlineInputBorder( + borderSide: BorderSide.none, + borderRadius: BorderRadius.circular(99), ), - TextField( - readOnly: - state.publicHomeservers.connectionState == - ConnectionState.waiting, - controller: viewModel.filterTextController, - autocorrect: false, - keyboardType: TextInputType.url, - decoration: InputDecoration( - filled: true, - fillColor: theme.colorScheme.secondaryContainer, - border: OutlineInputBorder( - borderSide: BorderSide.none, - borderRadius: BorderRadius.circular(99), + errorText: state.publicHomeservers.error?.toLocalizedString( + context, + ), + prefixIcon: const Icon(Icons.search_outlined), + hintText: L10n.of(context).searchOrEnterHomeserverAddress, + ), + ), + if (state.publicHomeservers.connectionState == + ConnectionState.done) + Expanded( + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + clipBehavior: Clip.hardEdge, + color: theme.colorScheme.surfaceContainerLow, + child: RadioGroup( + groupValue: state.selectedHomeserver, + onChanged: viewModel.selectHomeserver, + child: ListView.builder( + itemCount: publicHomeservers.length, + itemBuilder: (context, i) { + final server = publicHomeservers[i]; + final website = server.website; + return RadioListTile.adaptive( + value: server, + radioScaleFactor: + FluffyThemes.isColumnMode(context) || + { + TargetPlatform.iOS, + TargetPlatform.macOS, + }.contains(theme.platform) + ? 2 + : 1, + title: Row( + children: [ + Expanded( + child: Text(server.name ?? 'Unknown'), + ), + if (website != null) + SizedBox.square( + dimension: 32, + child: IconButton( + icon: const Icon( + Icons.open_in_new_outlined, + size: 16, + ), + onPressed: () => + launchUrlString(website), + ), + ), + ], + ), + subtitle: Column( + spacing: 4.0, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + if (server.features?.isNotEmpty == true) + Wrap( + spacing: 4.0, + runSpacing: 4.0, + children: [ + ...?server.languages?.map( + (language) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .tertiaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + language, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onTertiaryContainer, + ), + ), + ), + ), + ), + ...server.features!.map( + (feature) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .secondaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + feature, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onSecondaryContainer, + ), + ), + ), + ), + ), + ], + ), + Text( + server.description ?? 'A matrix homeserver', + ), + ], + ), + ); + }, ), - errorText: state.publicHomeservers.error - ?.toLocalizedString(context), - prefixIcon: const Icon(Icons.search_outlined), - hintText: L10n.of( - context, - ).searchOrEnterHomeserverAddress, ), ), - ], - ), - ), + ) + else + Center(child: CircularProgressIndicator.adaptive()), + ], ), ), - body: state.publicHomeservers.connectionState == ConnectionState.done - ? Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: Material( - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - clipBehavior: Clip.hardEdge, - color: theme.colorScheme.surfaceContainerLow, - child: RadioGroup( - groupValue: state.selectedHomeserver, - onChanged: viewModel.selectHomeserver, - child: ListView.builder( - itemCount: publicHomeservers.length, - itemBuilder: (context, i) { - final server = publicHomeservers[i]; - final homepage = server.homepage; - return RadioListTile.adaptive( - value: server, - radioScaleFactor: - FluffyThemes.isColumnMode(context) || - { - TargetPlatform.iOS, - TargetPlatform.macOS, - }.contains(theme.platform) - ? 2 - : 1, - title: Row( - children: [ - Expanded(child: Text(server.name ?? 'Unknown')), - if (homepage != null) - SizedBox.square( - dimension: 32, - child: IconButton( - icon: const Icon( - Icons.open_in_new_outlined, - size: 16, - ), - onPressed: () => - launchUrlString(homepage), - ), - ), - ], - ), - subtitle: Column( - spacing: 4.0, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - if (server.features?.isNotEmpty == true) - Wrap( - spacing: 4.0, - runSpacing: 4.0, - children: [ - ...?server.languages?.map( - (language) => Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, - ), - color: theme - .colorScheme - .tertiaryContainer, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, - ), - child: Text( - language, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onTertiaryContainer, - ), - ), - ), - ), - ), - ...server.features!.map( - (feature) => Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, - ), - color: theme - .colorScheme - .secondaryContainer, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, - ), - child: Text( - feature, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onSecondaryContainer, - ), - ), - ), - ), - ), - ], - ), - Text( - server.description ?? 'A matrix homeserver', - ), - ], - ), - ); - }, - ), - ), - ), - ) - : Center(child: CircularProgressIndicator.adaptive()), bottomNavigationBar: AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, @@ -203,12 +204,14 @@ class SignInPage extends StatelessWidget { !publicHomeservers.contains(selectedHomserver) ? const SizedBox.shrink() : Material( - elevation: 8, - shadowColor: theme.appBarTheme.shadowColor, child: Padding( padding: const EdgeInsets.all(16.0), child: SafeArea( child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), onPressed: state.loginLoading.connectionState == ConnectionState.waiting diff --git a/lib/pages/sign_in/utils/sort_homeservers.dart b/lib/pages/sign_in/utils/sort_homeservers.dart index 7c54a01b..18f30dfc 100644 --- a/lib/pages/sign_in/utils/sort_homeservers.dart +++ b/lib/pages/sign_in/utils/sort_homeservers.dart @@ -7,7 +7,7 @@ int sortHomeservers(PublicHomeserverData a, PublicHomeserverData b) { int _calcHomeserverScore(PublicHomeserverData homeserver) { var score = 0; if (homeserver.description?.isNotEmpty == true) score++; - if (homeserver.homepage?.isNotEmpty == true) score++; + if (homeserver.website?.isNotEmpty == true) score++; score += (homeserver.languages?.length ?? 0); score += (homeserver.features?.length ?? 0); score += (homeserver.onlineStatus ?? 0); diff --git a/lib/pages/sign_in/view_model/model/public_homeserver_data.dart b/lib/pages/sign_in/view_model/model/public_homeserver_data.dart index b8046b82..4d484eb1 100644 --- a/lib/pages/sign_in/view_model/model/public_homeserver_data.dart +++ b/lib/pages/sign_in/view_model/model/public_homeserver_data.dart @@ -1,7 +1,7 @@ class PublicHomeserverData { final String? name; final String? clientDomain; - final String? homepage; + final String? website; final String? isp; final String? staffJur; final String? rules; @@ -26,7 +26,7 @@ class PublicHomeserverData { PublicHomeserverData({ this.name, this.clientDomain, - this.homepage, + this.website, this.isp, this.staffJur, this.rules, @@ -53,7 +53,7 @@ class PublicHomeserverData { return PublicHomeserverData( name: json['name'], clientDomain: json['client_domain'], - homepage: json['homepage'], + website: json['website'], isp: json['isp'], staffJur: json['staff_jur'], rules: json['rules'], diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index 1466215b..754a2d9b 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -1,10 +1,10 @@ -import 'package:fluffychat/config/setting_keys.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher_string.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; diff --git a/pubspec.lock b/pubspec.lock index 8a807745..77050341 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -165,10 +165,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" charcode: dependency: transitive description: @@ -1112,18 +1112,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.18" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" matrix: dependency: "direct main" description: @@ -1877,26 +1877,26 @@ packages: dependency: transitive description: name: test - sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" url: "https://pub.dev" source: hosted - version: "1.26.3" + version: "1.29.0" test_api: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.9" test_core: dependency: transitive description: name: test_core - sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" + sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" url: "https://pub.dev" source: hosted - version: "0.6.12" + version: "0.6.15" timezone: dependency: transitive description: From 0052a15b5416310a7f650426b00de22fa9c700ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Feb 2026 21:28:33 +0100 Subject: [PATCH 143/333] chore: Adjust design of user viewer and popup buttons --- lib/pages/chat_list/chat_list.dart | 15 +- lib/widgets/adaptive_dialogs/user_dialog.dart | 294 ++++++++++-------- .../member_actions_popup_menu_button.dart | 34 +- 3 files changed, 181 insertions(+), 162 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index e55b8251..d8751f9c 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -440,25 +440,16 @@ class ChatListController extends State PopupMenuItem( value: ChatContextAction.open, child: Row( - mainAxisSize: .min, spacing: 12.0, children: [ - Avatar(mxContent: room.avatar, name: displayname), + Avatar(mxContent: room.avatar, name: displayname, size: 24), ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 128), - child: Text( - displayname, - style: TextStyle( - color: Theme.of(context).colorScheme.onSurface, - ), - maxLines: 2, - overflow: TextOverflow.ellipsis, - ), + constraints: const BoxConstraints(maxWidth: 200), + child: Text(displayname, maxLines: 1, overflow: .ellipsis), ), ], ), ), - const PopupMenuDivider(), if (space != null) PopupMenuItem( value: ChatContextAction.goToSpace, diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index 50361519..b20ac2ce 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -5,10 +6,11 @@ import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; -import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/presence_builder.dart'; import '../../utils/url_launcher.dart'; @@ -37,7 +39,6 @@ class UserDialog extends StatelessWidget { @override Widget build(BuildContext context) { final client = Matrix.of(context).client; - final dmRoomId = client.getDirectChatFromUserId(profile.userId); final displayname = profile.displayName ?? profile.userId.localpart ?? @@ -46,12 +47,8 @@ class UserDialog extends StatelessWidget { final theme = Theme.of(context); final avatar = profile.avatarUrl; return AlertDialog.adaptive( - title: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 256), - child: Center(child: Text(displayname, textAlign: TextAlign.center)), - ), content: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 256, maxHeight: 256), + constraints: const BoxConstraints(maxWidth: 256), child: PresenceBuilder( userId: profile.userId, client: Matrix.of(context).client, @@ -66,17 +63,18 @@ class UserDialog extends StatelessWidget { lastActiveTimestamp.localizedTimeShort(context), ) : null; - return SingleChildScrollView( - child: Column( - spacing: 8, - mainAxisSize: .min, - crossAxisAlignment: .stretch, - children: [ - Center( - child: Avatar( + return Column( + spacing: 16, + mainAxisSize: .min, + crossAxisAlignment: .stretch, + children: [ + Row( + spacing: 12, + children: [ + Avatar( mxContent: avatar, name: displayname, - size: Avatar.defaultSize * 2, + size: Avatar.defaultSize * 1.5, onTap: avatar != null ? () => showDialog( context: context, @@ -84,130 +82,178 @@ class UserDialog extends StatelessWidget { ) : null, ), - ), - HoverBuilder( - builder: (context, hovered) => StatefulBuilder( - builder: (context, setState) => MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: () { - Clipboard.setData( - ClipboardData(text: profile.userId), - ); - setState(() { - copied = true; - }); - }, - child: RichText( - text: TextSpan( - children: [ - WidgetSpan( - child: Padding( - padding: const EdgeInsets.only(right: 4.0), - child: AnimatedScale( - duration: FluffyThemes.animationDuration, - curve: FluffyThemes.animationCurve, - scale: hovered - ? 1.33 - : copied - ? 1.25 - : 1.0, - child: Icon( - copied - ? Icons.check_circle - : Icons.copy, - size: 12, - color: copied ? Colors.green : null, - ), + Expanded( + child: Column( + crossAxisAlignment: .start, + children: [ + Text( + displayname, + maxLines: 1, + overflow: .ellipsis, + style: TextStyle(fontSize: 16), + ), + const SizedBox(height: 8), + HoverBuilder( + builder: (context, hovered) => StatefulBuilder( + builder: (context, setState) => MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + Clipboard.setData( + ClipboardData(text: profile.userId), + ); + setState(() { + copied = true; + }); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only( + right: 4.0, + ), + child: AnimatedScale( + duration: FluffyThemes + .animationDuration, + curve: + FluffyThemes.animationCurve, + scale: hovered + ? 1.33 + : copied + ? 1.25 + : 1.0, + child: Icon( + copied + ? Icons.check_circle + : Icons.copy, + size: 12, + color: copied + ? Colors.green + : null, + ), + ), + ), + ), + TextSpan(text: profile.userId), + ], + style: theme.textTheme.bodyMedium + ?.copyWith(fontSize: 10), ), + maxLines: 1, + overflow: .ellipsis, + textAlign: TextAlign.center, ), ), - TextSpan(text: profile.userId), - ], + ), + ), + ), + if (presenceText != null) + Text( + presenceText, style: theme.textTheme.bodyMedium?.copyWith( fontSize: 10, ), ), - textAlign: TextAlign.center, - ), - ), + ], ), ), + ], + ), + + if (statusMsg != null) + SelectableLinkify( + text: statusMsg, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + textAlign: TextAlign.start, + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), ), - if (presenceText != null) - Text( - presenceText, - style: const TextStyle(fontSize: 10), - textAlign: TextAlign.center, + Row( + mainAxisAlignment: .spaceBetween, + spacing: 4, + children: [ + _IconTextButton( + label: L10n.of(context).chat, + icon: Icons.chat_outlined, + onTap: () async { + final router = GoRouter.of(context); + final roomIdResult = await showFutureLoadingDialog( + context: context, + future: () => client.startDirectChat(profile.userId), + ); + final roomId = roomIdResult.result; + if (roomId == null) return; + if (context.mounted) Navigator.of(context).pop(); + router.go('/rooms/$roomId'); + }, ), - if (statusMsg != null) - SelectableLinkify( - text: statusMsg, - textScaleFactor: MediaQuery.textScalerOf( - context, - ).scale(1), - textAlign: TextAlign.center, - options: const LinkifyOptions(humanize: false), - linkStyle: TextStyle( - color: theme.colorScheme.primary, - decoration: TextDecoration.underline, - decorationColor: theme.colorScheme.primary, - ), - onOpen: (url) => - UrlLauncher(context, url.url).launchUrl(), + _IconTextButton( + label: L10n.of(context).block, + icon: Icons.block_outlined, + onTap: () { + final router = GoRouter.of(context); + Navigator.of(context).pop(); + router.go( + '/rooms/settings/security/ignorelist', + extra: profile.userId, + ); + }, ), - ], - ), + _IconTextButton( + label: L10n.of(context).share, + icon: Icons.adaptive.share, + onTap: () => FluffyShare.share(profile.userId, context), + ), + ], + ), + ], ); }, ), ), - actions: [ - if (client.userID != profile.userId) ...[ - AdaptiveDialogAction( - borderRadius: AdaptiveDialogAction.topRadius, - bigButtons: true, - onPressed: () async { - final router = GoRouter.of(context); - final roomIdResult = await showFutureLoadingDialog( - context: context, - future: () => client.startDirectChat(profile.userId), - ); - final roomId = roomIdResult.result; - if (roomId == null) return; - if (context.mounted) Navigator.of(context).pop(); - router.go('/rooms/$roomId'); - }, - child: Text( - dmRoomId == null - ? L10n.of(context).startConversation - : L10n.of(context).sendAMessage, - ), - ), - AdaptiveDialogAction( - bigButtons: true, - borderRadius: AdaptiveDialogAction.centerRadius, - onPressed: () { - final router = GoRouter.of(context); - Navigator.of(context).pop(); - router.go( - '/rooms/settings/security/ignorelist', - extra: profile.userId, - ); - }, - child: Text( - L10n.of(context).ignoreUser, - style: TextStyle(color: theme.colorScheme.error), - ), - ), - ], - AdaptiveDialogAction( - bigButtons: true, - borderRadius: AdaptiveDialogAction.bottomRadius, - onPressed: Navigator.of(context).pop, - child: Text(L10n.of(context).close), - ), - ], + ); + } +} + +class _IconTextButton extends StatelessWidget { + final String label; + final IconData icon; + final VoidCallback onTap; + const _IconTextButton({ + required this.label, + required this.icon, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Expanded( + child: CupertinoButton( + onPressed: onTap, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + color: theme.colorScheme.surfaceBright, + padding: EdgeInsets.all(8), + child: Column( + mainAxisSize: .min, + children: [ + Icon(icon), + Text( + label, + style: TextStyle(fontSize: 12), + maxLines: 1, + overflow: .ellipsis, + ), + ], + ), + ), ); } } diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart index e985be01..55eea2cb 100644 --- a/lib/widgets/member_actions_popup_menu_button.dart +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -45,40 +45,22 @@ Future showMemberActionsPopupMenu({ children: [ Avatar( name: displayname, + size: 30, mxContent: user.avatarUrl, presenceUserId: user.id, presenceBackgroundColor: theme.colorScheme.surfaceContainer, ), - Column( - mainAxisSize: .min, - crossAxisAlignment: .start, - children: [ - ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 128), - child: Text( - displayname, - textAlign: TextAlign.center, - style: theme.textTheme.labelLarge, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 128), - child: Text( - user.id, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 10), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ], + ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 200), + child: Text( + displayname, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), ), ], ), ), - const PopupMenuDivider(), if (onMention != null) PopupMenuItem( value: _MemberActions.mention, From 740f04206a45efbb0341d9c0a7590e9d6b198afe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Feb 2026 06:47:28 +0100 Subject: [PATCH 144/333] fix: Do not route to backup on soft logout --- lib/pages/login/login.dart | 4 ++ lib/utils/sign_in_flows/check_homeserver.dart | 1 + lib/widgets/matrix.dart | 54 +++++++++---------- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index c0a3e10a..b1eecd0b 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -81,6 +82,9 @@ class LoginController extends State { password: passwordController.text, initialDeviceDisplayName: PlatformInfos.clientName, ); + if (mounted) { + context.go('/backup'); + } } on MatrixException catch (exception) { setState(() => passwordError = exception.errorMessage); return setState(() => loading = false); diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index 754a2d9b..ef0bf94b 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -70,6 +70,7 @@ Future connectToHomeserverFlow( if (context.mounted) { setState(AsyncSnapshot.withData(ConnectionState.done, true)); + context.go('/backup'); } } catch (e, s) { setState(AsyncSnapshot.withError(ConnectionState.done, e, s)); diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 6c66b16d..60fd73b7 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -177,7 +177,7 @@ class MatrixState extends State with WidgetsBindingObserver { final onRoomKeyRequestSub = {}; final onKeyVerificationRequestSub = {}; final onNotification = {}; - final onLoginStateChanged = >{}; + final onLogoutSub = >{}; final onUiaRequest = >{}; String? _cachedPassword; @@ -255,31 +255,29 @@ class MatrixState extends State with WidgetsBindingObserver { context, ); }); - onLoginStateChanged[name] ??= c.onLoginStateChanged.stream.listen((state) { - final loggedInWithMultipleClients = widget.clients.length > 1; - if (state == LoginState.loggedOut) { - _cancelSubs(c.clientName); - widget.clients.remove(c); - ClientManager.removeClientNameFromStore(c.clientName, store); - InitWithRestoreExtension.deleteSessionBackup(name); - } - if (loggedInWithMultipleClients && state != LoginState.loggedIn) { - ScaffoldMessenger.of( - FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? - context, - ).showSnackBar( - SnackBar(content: Text(L10n.of(context).oneClientLoggedOut)), - ); + onLogoutSub[name] ??= c.onLoginStateChanged.stream + .where((state) => state == LoginState.loggedOut) + .listen((state) { + final loggedInWithMultipleClients = widget.clients.length > 1; - if (state != LoginState.loggedIn) { - FluffyChatApp.router.go('/rooms'); - } - } else { - FluffyChatApp.router.go( - state == LoginState.loggedIn ? '/backup' : '/home', - ); - } - }); + _cancelSubs(c.clientName); + widget.clients.remove(c); + ClientManager.removeClientNameFromStore(c.clientName, store); + InitWithRestoreExtension.deleteSessionBackup(name); + + if (loggedInWithMultipleClients) { + ScaffoldMessenger.of( + FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? + context, + ).showSnackBar( + SnackBar(content: Text(L10n.of(context).oneClientLoggedOut)), + ); + + if (state != LoginState.loggedIn) { + FluffyChatApp.router.go('/rooms'); + } + } + }); onUiaRequest[name] ??= c.onUiaRequest.stream.listen(uiaRequestHandler); if (PlatformInfos.isWeb || PlatformInfos.isLinux) { c.onSync.stream.first.then((s) { @@ -296,8 +294,8 @@ class MatrixState extends State with WidgetsBindingObserver { onRoomKeyRequestSub.remove(name); onKeyVerificationRequestSub[name]?.cancel(); onKeyVerificationRequestSub.remove(name); - onLoginStateChanged[name]?.cancel(); - onLoginStateChanged.remove(name); + onLogoutSub[name]?.cancel(); + onLogoutSub.remove(name); onNotification[name]?.cancel(); onNotification.remove(name); } @@ -373,7 +371,7 @@ class MatrixState extends State with WidgetsBindingObserver { onRoomKeyRequestSub.values.map((s) => s.cancel()); onKeyVerificationRequestSub.values.map((s) => s.cancel()); - onLoginStateChanged.values.map((s) => s.cancel()); + onLogoutSub.values.map((s) => s.cancel()); onNotification.values.map((s) => s.cancel()); client.httpClient.close(); From 88900bf72dec1fc1463e618da42e212230c4a8f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Feb 2026 07:27:46 +0100 Subject: [PATCH 145/333] build: Update iOS to UIScene --- ios/Flutter/AppFrameworkInfo.plist | 2 -- ios/Runner/AppDelegate.swift | 10 +++++----- ios/Runner/Info.plist | 21 +++++++++++++++++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index d57061dd..ab8e063f 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -20,7 +20,5 @@ ???? CFBundleVersion 1.0 - MinimumOSVersion - 13.0 diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 7f38bb25..6bea1100 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -2,15 +2,15 @@ import UIKit import Flutter @main -@objc class AppDelegate: FlutterAppDelegate { +@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - if #available(iOS 10.0, *) { - UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate - } return super.application(application, didFinishLaunchingWithOptions: launchOptions) } + + func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { + GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) + } } diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index c94401f4..51765d1c 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -112,5 +112,26 @@ UIApplicationSupportsIndirectInputEvents + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneDelegateClassName + FlutterSceneDelegate + UISceneConfigurationName + flutter + UISceneStoryboardFile + Main + + + + From ad7a2d9a01bbb6c8ccf50fd430d4ba3627128dc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Feb 2026 08:25:34 +0100 Subject: [PATCH 146/333] chore: Follow up user dialog --- lib/widgets/adaptive_dialogs/user_dialog.dart | 382 ++++++++++-------- 1 file changed, 216 insertions(+), 166 deletions(-) diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index b20ac2ce..a5f65acb 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -11,6 +11,7 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/presence_builder.dart'; import '../../utils/url_launcher.dart'; @@ -47,186 +48,238 @@ class UserDialog extends StatelessWidget { final theme = Theme.of(context); final avatar = profile.avatarUrl; return AlertDialog.adaptive( - content: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 256), - child: PresenceBuilder( - userId: profile.userId, - client: Matrix.of(context).client, - builder: (context, presence) { - if (presence == null) return const SizedBox.shrink(); - final statusMsg = presence.statusMsg; - final lastActiveTimestamp = presence.lastActiveTimestamp; - final presenceText = presence.currentlyActive == true - ? L10n.of(context).currentlyActive - : lastActiveTimestamp != null - ? L10n.of(context).lastActiveAgo( - lastActiveTimestamp.localizedTimeShort(context), - ) - : null; - return Column( - spacing: 16, - mainAxisSize: .min, - crossAxisAlignment: .stretch, - children: [ - Row( - spacing: 12, - children: [ - Avatar( - mxContent: avatar, - name: displayname, - size: Avatar.defaultSize * 1.5, - onTap: avatar != null - ? () => showDialog( - context: context, - builder: (_) => MxcImageViewer(avatar), - ) - : null, - ), - Expanded( - child: Column( - crossAxisAlignment: .start, - children: [ - Text( - displayname, - maxLines: 1, - overflow: .ellipsis, - style: TextStyle(fontSize: 16), - ), - const SizedBox(height: 8), - HoverBuilder( - builder: (context, hovered) => StatefulBuilder( - builder: (context, setState) => MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: () { - Clipboard.setData( - ClipboardData(text: profile.userId), - ); - setState(() { - copied = true; - }); - }, - child: RichText( - text: TextSpan( - children: [ - WidgetSpan( - child: Padding( - padding: const EdgeInsets.only( - right: 4.0, - ), - child: AnimatedScale( - duration: FluffyThemes - .animationDuration, - curve: - FluffyThemes.animationCurve, - scale: hovered - ? 1.33 - : copied - ? 1.25 - : 1.0, - child: Icon( - copied - ? Icons.check_circle - : Icons.copy, - size: 12, - color: copied - ? Colors.green - : null, - ), + content: PresenceBuilder( + userId: profile.userId, + client: Matrix.of(context).client, + builder: (context, presence) { + if (presence == null) return const SizedBox.shrink(); + final statusMsg = presence.statusMsg; + final lastActiveTimestamp = presence.lastActiveTimestamp; + final presenceText = presence.currentlyActive == true + ? L10n.of(context).currentlyActive + : lastActiveTimestamp != null + ? L10n.of( + context, + ).lastActiveAgo(lastActiveTimestamp.localizedTimeShort(context)) + : null; + return Column( + spacing: 16, + mainAxisSize: .min, + crossAxisAlignment: .stretch, + children: [ + Row( + spacing: 12, + children: [ + Avatar( + mxContent: avatar, + name: displayname, + size: Avatar.defaultSize * 1.5, + onTap: avatar != null + ? () => showDialog( + context: context, + builder: (_) => MxcImageViewer(avatar), + ) + : null, + ), + Expanded( + child: Column( + crossAxisAlignment: .start, + children: [ + Text( + displayname, + maxLines: 1, + overflow: .ellipsis, + style: TextStyle(fontSize: 16), + ), + const SizedBox(height: 8), + HoverBuilder( + builder: (context, hovered) => StatefulBuilder( + builder: (context, setState) => MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + Clipboard.setData( + ClipboardData(text: profile.userId), + ); + setState(() { + copied = true; + }); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only( + right: 4.0, + ), + child: AnimatedScale( + duration: + FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: hovered + ? 1.33 + : copied + ? 1.25 + : 1.0, + child: Icon( + copied + ? Icons.check_circle + : Icons.copy, + size: 12, + color: copied + ? Colors.green + : null, ), ), ), - TextSpan(text: profile.userId), - ], - style: theme.textTheme.bodyMedium - ?.copyWith(fontSize: 10), + ), + TextSpan(text: profile.userId), + ], + style: theme.textTheme.bodyMedium?.copyWith( + fontSize: 10, ), - maxLines: 1, - overflow: .ellipsis, - textAlign: TextAlign.center, ), + maxLines: 1, + overflow: .ellipsis, + textAlign: TextAlign.center, ), ), ), ), - if (presenceText != null) - Text( - presenceText, - style: theme.textTheme.bodyMedium?.copyWith( - fontSize: 10, - ), + ), + if (presenceText != null) + Text( + presenceText, + style: theme.textTheme.bodyMedium?.copyWith( + fontSize: 10, ), - ], - ), + ), + ], ), - ], - ), - - if (statusMsg != null) - SelectableLinkify( - text: statusMsg, - textScaleFactor: MediaQuery.textScalerOf(context).scale(1), - textAlign: TextAlign.start, - options: const LinkifyOptions(humanize: false), - linkStyle: TextStyle( - color: theme.colorScheme.primary, - decoration: TextDecoration.underline, - decorationColor: theme.colorScheme.primary, - ), - onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), ), - Row( - mainAxisAlignment: .spaceBetween, - spacing: 4, - children: [ - _IconTextButton( - label: L10n.of(context).chat, - icon: Icons.chat_outlined, - onTap: () async { - final router = GoRouter.of(context); - final roomIdResult = await showFutureLoadingDialog( - context: context, - future: () => client.startDirectChat(profile.userId), - ); - final roomId = roomIdResult.result; - if (roomId == null) return; - if (context.mounted) Navigator.of(context).pop(); - router.go('/rooms/$roomId'); - }, - ), - _IconTextButton( - label: L10n.of(context).block, - icon: Icons.block_outlined, - onTap: () { - final router = GoRouter.of(context); - Navigator.of(context).pop(); - router.go( - '/rooms/settings/security/ignorelist', - extra: profile.userId, - ); - }, - ), - _IconTextButton( - label: L10n.of(context).share, - icon: Icons.adaptive.share, - onTap: () => FluffyShare.share(profile.userId, context), - ), - ], + ], + ), + + if (statusMsg != null) + SelectableLinkify( + text: statusMsg, + textScaleFactor: MediaQuery.textScalerOf(context).scale(1), + textAlign: TextAlign.start, + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), ), - ], - ); - }, + Row( + mainAxisAlignment: .spaceBetween, + spacing: 4, + children: [ + _AdaptiveIconTextButton( + label: L10n.of(context).block, + icon: Icons.block_outlined, + onTap: () { + final router = GoRouter.of(context); + Navigator.of(context).pop(); + router.go( + '/rooms/settings/security/ignorelist', + extra: profile.userId, + ); + }, + ), + _AdaptiveIconTextButton( + label: L10n.of(context).report, + icon: Icons.gavel_outlined, + onTap: () async { + Navigator.of(context).pop(); + final reason = await showTextInputDialog( + context: context, + title: L10n.of(context).whyDoYouWantToReportThis, + okLabel: L10n.of(context).report, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).reason, + ); + if (reason == null || reason.isEmpty) return; + await showFutureLoadingDialog( + context: context, + future: () => Matrix.of( + context, + ).client.reportUser(profile.userId, reason), + ); + }, + ), + _AdaptiveIconTextButton( + label: L10n.of(context).share, + icon: Icons.adaptive.share, + onTap: () => FluffyShare.share(profile.userId, context), + ), + ], + ), + _AdaptiveDialogInkWell( + onTap: () async { + final router = GoRouter.of(context); + final roomIdResult = await showFutureLoadingDialog( + context: context, + future: () => client.startDirectChat(profile.userId), + ); + final roomId = roomIdResult.result; + if (roomId == null) return; + if (context.mounted) Navigator.of(context).pop(); + router.go('/rooms/$roomId'); + }, + child: Text( + L10n.of(context).sendAMessage, + style: TextStyle(color: theme.colorScheme.secondary), + ), + ), + ], + ); + }, + ), + ); + } +} + +class _AdaptiveDialogInkWell extends StatelessWidget { + final Widget child; + final VoidCallback onTap; + const _AdaptiveDialogInkWell({required this.onTap, required this.child}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + if ({TargetPlatform.iOS, TargetPlatform.macOS}.contains(theme.platform)) { + return CupertinoButton( + onPressed: onTap, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + color: theme.colorScheme.surfaceBright, + padding: EdgeInsets.all(8), + child: child, + ); + } + return Material( + color: theme.colorScheme.surfaceBright, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + child: InkWell( + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + onTap: onTap, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: child), ), ), ); } } -class _IconTextButton extends StatelessWidget { +class _AdaptiveIconTextButton extends StatelessWidget { final String label; final IconData icon; final VoidCallback onTap; - const _IconTextButton({ + const _AdaptiveIconTextButton({ required this.label, required this.icon, required this.onTap, @@ -234,20 +287,17 @@ class _IconTextButton extends StatelessWidget { @override Widget build(BuildContext context) { - final theme = Theme.of(context); + final color = Theme.of(context).colorScheme.secondary; return Expanded( - child: CupertinoButton( - onPressed: onTap, - borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), - color: theme.colorScheme.surfaceBright, - padding: EdgeInsets.all(8), + child: _AdaptiveDialogInkWell( + onTap: onTap, child: Column( mainAxisSize: .min, children: [ - Icon(icon), + Icon(icon, color: color), Text( label, - style: TextStyle(fontSize: 12), + style: TextStyle(fontSize: 12, color: color), maxLines: 1, overflow: .ellipsis, ), From 1cbeb16616af6ce0e0599d31f6d2998c8279f76b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Feb 2026 08:57:07 +0100 Subject: [PATCH 147/333] chore: Follow up user dialog and public room dialog --- .../adaptive_dialog_action.dart | 70 +++++ .../adaptive_dialogs/public_room_dialog.dart | 276 +++++++++++------- lib/widgets/adaptive_dialogs/user_dialog.dart | 110 ++----- 3 files changed, 270 insertions(+), 186 deletions(-) diff --git a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart index 40fc3f96..eeec6768 100644 --- a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart +++ b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart @@ -82,3 +82,73 @@ class AdaptiveDialogAction extends StatelessWidget { } } } + +class AdaptiveDialogInkWell extends StatelessWidget { + final Widget child; + final VoidCallback onTap; + const AdaptiveDialogInkWell({ + super.key, + required this.onTap, + required this.child, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + if ({TargetPlatform.iOS, TargetPlatform.macOS}.contains(theme.platform)) { + return CupertinoButton( + onPressed: onTap, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + color: theme.colorScheme.surfaceBright, + padding: EdgeInsets.all(8), + child: child, + ); + } + return Material( + color: theme.colorScheme.surfaceBright, + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + child: InkWell( + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), + onTap: onTap, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center(child: child), + ), + ), + ); + } +} + +class AdaptiveIconTextButton extends StatelessWidget { + final String label; + final IconData icon; + final VoidCallback onTap; + const AdaptiveIconTextButton({ + super.key, + required this.label, + required this.icon, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + final color = Theme.of(context).colorScheme.secondary; + return Expanded( + child: AdaptiveDialogInkWell( + onTap: onTap, + child: Column( + mainAxisSize: .min, + children: [ + Icon(icon, color: color), + Text( + label, + style: TextStyle(fontSize: 12, color: color), + maxLines: 1, + overflow: .ellipsis, + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/adaptive_dialogs/public_room_dialog.dart b/lib/widgets/adaptive_dialogs/public_room_dialog.dart index 4d5ac858..97550756 100644 --- a/lib/widgets/adaptive_dialogs/public_room_dialog.dart +++ b/lib/widgets/adaptive_dialogs/public_room_dialog.dart @@ -6,7 +6,9 @@ import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import '../../config/themes.dart'; import '../../utils/url_launcher.dart'; import '../avatar.dart'; @@ -90,15 +92,8 @@ class PublicRoomDialog extends StatelessWidget { final roomLink = roomAlias ?? chunk?.roomId; var copied = false; return AlertDialog.adaptive( - title: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 256), - child: Text( - chunk?.name ?? roomAlias?.localpart ?? chunk?.roomId ?? 'Unknown', - textAlign: TextAlign.center, - ), - ), content: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 256, maxHeight: 256), + constraints: const BoxConstraints(maxWidth: 256), child: FutureBuilder( future: _search(context), builder: (context, snapshot) { @@ -109,125 +104,196 @@ class PublicRoomDialog extends StatelessWidget { final topic = profile?.topic; return SingleChildScrollView( child: Column( - spacing: 8, + spacing: 16, mainAxisSize: .min, crossAxisAlignment: .stretch, children: [ - if (roomLink != null) - HoverBuilder( - builder: (context, hovered) => StatefulBuilder( - builder: (context, setState) => MouseRegion( - cursor: SystemMouseCursors.click, - child: GestureDetector( - onTap: () { - Clipboard.setData(ClipboardData(text: roomLink)); - setState(() { - copied = true; - }); - }, - child: RichText( - text: TextSpan( - children: [ - WidgetSpan( - child: Padding( - padding: const EdgeInsets.only( - right: 4.0, - ), - child: AnimatedScale( - duration: - FluffyThemes.animationDuration, - curve: FluffyThemes.animationCurve, - scale: hovered - ? 1.33 - : copied - ? 1.25 - : 1.0, - child: Icon( - copied - ? Icons.check_circle - : Icons.copy, - size: 12, - color: copied ? Colors.green : null, + Row( + spacing: 12, + children: [ + Avatar( + mxContent: avatar, + name: profile?.name ?? roomLink, + size: Avatar.defaultSize * 1.5, + onTap: avatar != null + ? () => showDialog( + context: context, + builder: (_) => MxcImageViewer(avatar), + ) + : null, + ), + Expanded( + child: Column( + crossAxisAlignment: .start, + children: [ + Text( + profile?.name ?? + roomLink ?? + profile?.roomId ?? + ' - ', + maxLines: 1, + overflow: .ellipsis, + style: TextStyle(fontSize: 16), + ), + const SizedBox(height: 8), + if (roomLink != null) + HoverBuilder( + builder: (context, hovered) => StatefulBuilder( + builder: (context, setState) => MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + Clipboard.setData( + ClipboardData(text: roomLink), + ); + setState(() { + copied = true; + }); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only( + right: 4.0, + ), + child: AnimatedScale( + duration: FluffyThemes + .animationDuration, + curve: FluffyThemes + .animationCurve, + scale: hovered + ? 1.33 + : copied + ? 1.25 + : 1.0, + child: Icon( + copied + ? Icons.check_circle + : Icons.copy, + size: 12, + color: copied + ? Colors.green + : null, + ), + ), + ), + ), + TextSpan(text: roomLink), + ], + style: theme.textTheme.bodyMedium + ?.copyWith(fontSize: 10), ), + textAlign: TextAlign.center, ), ), ), - TextSpan(text: roomLink), - ], - style: theme.textTheme.bodyMedium?.copyWith( - fontSize: 10, ), ), - textAlign: TextAlign.center, + + if (profile?.numJoinedMembers != null) + Text( + L10n.of(context).countParticipants( + profile?.numJoinedMembers ?? 0, + ), + style: const TextStyle(fontSize: 10), + textAlign: TextAlign.center, + ), + ], + ), + ), + ], + ), + if (topic != null && topic.isNotEmpty) + ConstrainedBox( + constraints: BoxConstraints(maxHeight: 200), + child: Scrollbar( + thumbVisibility: true, + trackVisibility: true, + child: SingleChildScrollView( + child: SelectableLinkify( + text: topic, + textScaleFactor: MediaQuery.textScalerOf( + context, + ).scale(1), + textAlign: .start, + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), ), ), ), ), - Center( - child: Avatar( - mxContent: avatar, - name: profile?.name ?? roomLink, - size: Avatar.defaultSize * 2, - onTap: avatar != null - ? () => showDialog( - context: context, - builder: (_) => MxcImageViewer(avatar), - ) - : null, + + Row( + mainAxisAlignment: .spaceBetween, + spacing: 4, + children: [ + AdaptiveIconTextButton( + label: L10n.of(context).report, + icon: Icons.gavel_outlined, + onTap: () async { + Navigator.of(context).pop(); + final reason = await showTextInputDialog( + context: context, + title: L10n.of(context).whyDoYouWantToReportThis, + okLabel: L10n.of(context).report, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).reason, + ); + if (reason == null || reason.isEmpty) return; + await showFutureLoadingDialog( + context: context, + future: () => Matrix.of(context).client.reportRoom( + chunk?.roomId ?? roomAlias!, + reason, + ), + ); + }, + ), + AdaptiveIconTextButton( + label: L10n.of(context).copy, + icon: Icons.copy_outlined, + onTap: () => + Clipboard.setData(ClipboardData(text: roomLink!)), + ), + AdaptiveIconTextButton( + label: L10n.of(context).share, + icon: Icons.adaptive.share, + onTap: () => FluffyShare.share( + 'https://matrix.to/#/$roomLink', + context, + ), + ), + ], + ), + AdaptiveDialogInkWell( + onTap: () => _joinRoom(context), + child: Text( + chunk?.joinRule == 'knock' && + Matrix.of( + context, + ).client.getRoomById(chunk!.roomId) == + null + ? L10n.of(context).knock + : chunk?.roomType == 'm.space' + ? L10n.of(context).joinSpace + : L10n.of(context).joinRoom, + style: TextStyle(color: theme.colorScheme.secondary), ), ), - if (profile?.numJoinedMembers != null) - Text( - L10n.of( - context, - ).countParticipants(profile?.numJoinedMembers ?? 0), - style: const TextStyle(fontSize: 10), - textAlign: TextAlign.center, - ), - if (topic != null && topic.isNotEmpty) - SelectableLinkify( - text: topic, - textScaleFactor: MediaQuery.textScalerOf( - context, - ).scale(1), - textAlign: TextAlign.center, - options: const LinkifyOptions(humanize: false), - linkStyle: TextStyle( - color: theme.colorScheme.primary, - decoration: TextDecoration.underline, - decorationColor: theme.colorScheme.primary, - ), - onOpen: (url) => - UrlLauncher(context, url.url).launchUrl(), - ), ], ), ); }, ), ), - actions: [ - AdaptiveDialogAction( - bigButtons: true, - borderRadius: AdaptiveDialogAction.topRadius, - onPressed: () => _joinRoom(context), - child: Text( - chunk?.joinRule == 'knock' && - Matrix.of(context).client.getRoomById(chunk!.roomId) == null - ? L10n.of(context).knock - : chunk?.roomType == 'm.space' - ? L10n.of(context).joinSpace - : L10n.of(context).joinRoom, - ), - ), - AdaptiveDialogAction( - bigButtons: true, - borderRadius: AdaptiveDialogAction.bottomRadius, - onPressed: Navigator.of(context).pop, - child: Text(L10n.of(context).close), - ), - ], ); } } diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index a5f65acb..a6dd97af 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -6,11 +5,11 @@ import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/presence_builder.dart'; @@ -20,6 +19,8 @@ import '../hover_builder.dart'; import '../matrix.dart'; import '../mxc_image_viewer.dart'; +// ignore: unused_import + class UserDialog extends StatelessWidget { static Future show({ required BuildContext context, @@ -162,23 +163,35 @@ class UserDialog extends StatelessWidget { ), if (statusMsg != null) - SelectableLinkify( - text: statusMsg, - textScaleFactor: MediaQuery.textScalerOf(context).scale(1), - textAlign: TextAlign.start, - options: const LinkifyOptions(humanize: false), - linkStyle: TextStyle( - color: theme.colorScheme.primary, - decoration: TextDecoration.underline, - decorationColor: theme.colorScheme.primary, + ConstrainedBox( + constraints: BoxConstraints(maxHeight: 200), + child: Scrollbar( + thumbVisibility: true, + trackVisibility: true, + child: SingleChildScrollView( + child: SelectableLinkify( + text: statusMsg, + textScaleFactor: MediaQuery.textScalerOf( + context, + ).scale(1), + textAlign: TextAlign.start, + options: const LinkifyOptions(humanize: false), + linkStyle: TextStyle( + color: theme.colorScheme.primary, + decoration: TextDecoration.underline, + decorationColor: theme.colorScheme.primary, + ), + onOpen: (url) => + UrlLauncher(context, url.url).launchUrl(), + ), + ), ), - onOpen: (url) => UrlLauncher(context, url.url).launchUrl(), ), Row( mainAxisAlignment: .spaceBetween, spacing: 4, children: [ - _AdaptiveIconTextButton( + AdaptiveIconTextButton( label: L10n.of(context).block, icon: Icons.block_outlined, onTap: () { @@ -190,7 +203,7 @@ class UserDialog extends StatelessWidget { ); }, ), - _AdaptiveIconTextButton( + AdaptiveIconTextButton( label: L10n.of(context).report, icon: Icons.gavel_outlined, onTap: () async { @@ -211,14 +224,14 @@ class UserDialog extends StatelessWidget { ); }, ), - _AdaptiveIconTextButton( + AdaptiveIconTextButton( label: L10n.of(context).share, icon: Icons.adaptive.share, onTap: () => FluffyShare.share(profile.userId, context), ), ], ), - _AdaptiveDialogInkWell( + AdaptiveDialogInkWell( onTap: () async { final router = GoRouter.of(context); final roomIdResult = await showFutureLoadingDialog( @@ -242,68 +255,3 @@ class UserDialog extends StatelessWidget { ); } } - -class _AdaptiveDialogInkWell extends StatelessWidget { - final Widget child; - final VoidCallback onTap; - const _AdaptiveDialogInkWell({required this.onTap, required this.child}); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - if ({TargetPlatform.iOS, TargetPlatform.macOS}.contains(theme.platform)) { - return CupertinoButton( - onPressed: onTap, - borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), - color: theme.colorScheme.surfaceBright, - padding: EdgeInsets.all(8), - child: child, - ); - } - return Material( - color: theme.colorScheme.surfaceBright, - borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), - child: InkWell( - borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), - onTap: onTap, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Center(child: child), - ), - ), - ); - } -} - -class _AdaptiveIconTextButton extends StatelessWidget { - final String label; - final IconData icon; - final VoidCallback onTap; - const _AdaptiveIconTextButton({ - required this.label, - required this.icon, - required this.onTap, - }); - - @override - Widget build(BuildContext context) { - final color = Theme.of(context).colorScheme.secondary; - return Expanded( - child: _AdaptiveDialogInkWell( - onTap: onTap, - child: Column( - mainAxisSize: .min, - children: [ - Icon(icon, color: color), - Text( - label, - style: TextStyle(fontSize: 12, color: color), - maxLines: 1, - overflow: .ellipsis, - ), - ], - ), - ), - ); - } -} From cfe43c23d5063974fced76b50ebef3de47ea5139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Feb 2026 09:47:19 +0100 Subject: [PATCH 148/333] chore: Follow up profile dialogs --- lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart index eeec6768..5848cf54 100644 --- a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart +++ b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart @@ -86,10 +86,13 @@ class AdaptiveDialogAction extends StatelessWidget { class AdaptiveDialogInkWell extends StatelessWidget { final Widget child; final VoidCallback onTap; + final EdgeInsets padding; + const AdaptiveDialogInkWell({ super.key, required this.onTap, required this.child, + this.padding = const EdgeInsets.all(16), }); @override @@ -100,7 +103,7 @@ class AdaptiveDialogInkWell extends StatelessWidget { onPressed: onTap, borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), color: theme.colorScheme.surfaceBright, - padding: EdgeInsets.all(8), + padding: padding, child: child, ); } @@ -111,7 +114,7 @@ class AdaptiveDialogInkWell extends StatelessWidget { borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), onTap: onTap, child: Padding( - padding: const EdgeInsets.all(8.0), + padding: padding, child: Center(child: child), ), ), @@ -135,6 +138,7 @@ class AdaptiveIconTextButton extends StatelessWidget { final color = Theme.of(context).colorScheme.secondary; return Expanded( child: AdaptiveDialogInkWell( + padding: EdgeInsets.all(8.0), onTap: onTap, child: Column( mainAxisSize: .min, From 1ea607f633aed2e445c50e920c5ea572dd0ba37a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Feb 2026 12:33:59 +0100 Subject: [PATCH 149/333] chore: Put oidc behind a feature flag until fixed --- lib/config/setting_keys.dart | 1 + lib/utils/sign_in_flows/check_homeserver.dart | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index da1b3bbf..d8522e95 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -53,6 +53,7 @@ enum AppSettings { colorSchemeSeedInt('chat.fluffy.color_scheme_seed', 0xFF5625BA), emojiSuggestionLocale('emoji_suggestion_locale', ''), enableSoftLogout('chat.fluffy.enable_soft_logout', false), + enableMatrixNativeOIDC('chat.fluffy.enable_matrix_native_oidc', false), presetHomeserver('chat.fluffy.preset_homeserver', ''), welcomeText('chat.fluffy.welcome_text', ''); diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index ef0bf94b..5b143615 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -48,7 +48,7 @@ Future connectToHomeserverFlow( if (consent != OkCancelResult.ok) return; } - if (authMetadata != null) { + if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) { await oidcLoginFlow(client, context, signUp); } else if (supportsSso) { await ssoLoginFlow(client, context, signUp); From 47934a33788a52a0e3b9855d2d0f68f3e03c8c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Feb 2026 13:12:47 +0100 Subject: [PATCH 150/333] chore: Adjust power level UX --- lib/l10n/intl_en.arb | 9 +- lib/pages/chat/events/message.dart | 121 +++++++++------- .../member_actions_popup_menu_button.dart | 129 ++++++++++++++---- lib/widgets/permission_slider_dialog.dart | 35 +---- 4 files changed, 187 insertions(+), 107 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index fa06a944..334de740 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -3126,5 +3126,12 @@ "theProcessWasCanceled": "The process was canceled.", "join": "Join", "searchOrEnterHomeserverAddress": "Search or enter homeserver address", - "matrixId": "Matrix ID" + "matrixId": "Matrix ID", + "setPowerLevel": "Set power level", + "makeModerator": "Make moderator", + "makeAdmin": "Make admin", + "removeModeratorRights": "Remove moderator rights", + "removeAdminRights": "Remove admin rights", + "powerLevel": "Power level", + "setPowerLevelDescription": "Power levels define what a member is allowed to do in this room and usually range between 0 and 100." } diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 2daa4065..3906354c 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -210,6 +210,7 @@ class Message extends StatelessWidget { singleSelected && event.room.canSendDefaultMessages; final enterThread = this.enterThread; + final sender = event.senderFromMemoryOrFallback; return Center( child: Swipeable( @@ -358,9 +359,7 @@ class Message extends StatelessWidget { FutureBuilder( future: event.fetchSenderUser(), builder: (context, snapshot) { - final user = - snapshot.data ?? - event.senderFromMemoryOrFallback; + final user = snapshot.data ?? sender; return Avatar( mxContent: user.avatarUrl, name: user.calcDisplayname(), @@ -392,52 +391,78 @@ class Message extends StatelessWidget { ownMessage || event.room.isDirectChat ? const SizedBox(height: 12) - : FutureBuilder( - future: event - .fetchSenderUser(), - builder: (context, snapshot) { - final displayname = - snapshot.data - ?.calcDisplayname() ?? - event - .senderFromMemoryOrFallback - .calcDisplayname(); - return Text( - displayname, - style: TextStyle( - fontSize: 11, - fontWeight: - FontWeight.bold, - color: - (theme.brightness == - Brightness - .light - ? displayname - .color - : displayname - .lightColorText), - shadows: - !wallpaperMode - ? null - : [ - const Shadow( - offset: - Offset( - 0.0, - 0.0, - ), - blurRadius: - 3, - color: Colors - .black, - ), - ], + : Row( + children: [ + if (sender.powerLevel >= + 50) + Padding( + padding: + const EdgeInsets.only( + right: 2.0, + ), + child: Icon( + sender.powerLevel >= + 100 + ? Icons + .admin_panel_settings + : Icons + .add_moderator_outlined, + size: 14, + color: theme + .colorScheme + .onPrimaryContainer, + ), ), - maxLines: 1, - overflow: TextOverflow - .ellipsis, - ); - }, + Expanded( + child: FutureBuilder( + future: event + .fetchSenderUser(), + builder: (context, snapshot) { + final displayname = + snapshot.data + ?.calcDisplayname() ?? + sender + .calcDisplayname(); + return Text( + displayname, + style: TextStyle( + fontSize: 11, + fontWeight: + FontWeight + .bold, + color: + (theme.brightness == + Brightness + .light + ? displayname + .color + : displayname + .lightColorText), + shadows: + !wallpaperMode + ? null + : [ + const Shadow( + offset: Offset( + 0.0, + 0.0, + ), + blurRadius: + 3, + color: + Colors.black, + ), + ], + ), + maxLines: 1, + overflow: + TextOverflow + .ellipsis, + ); + }, + ), + ), + ], ), ), Container( diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart index 55eea2cb..39503885 100644 --- a/lib/widgets/member_actions_popup_menu_button.dart +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -43,13 +43,7 @@ Future showMemberActionsPopupMenu({ child: Row( spacing: 12.0, children: [ - Avatar( - name: displayname, - size: 30, - mxContent: user.avatarUrl, - presenceUserId: user.id, - presenceBackgroundColor: theme.colorScheme.surfaceContainer, - ), + Avatar(name: displayname, size: 30, mxContent: user.avatarUrl), ConstrainedBox( constraints: const BoxConstraints(maxWidth: 200), child: Text( @@ -83,31 +77,71 @@ Future showMemberActionsPopupMenu({ ], ), ), - PopupMenuItem( - enabled: user.room.canChangePowerLevel && user.canChangeUserPowerLevel, - value: _MemberActions.setRole, - child: Row( - children: [ - const Icon(Icons.admin_panel_settings_outlined), - const SizedBox(width: 18), - Column( - mainAxisSize: .min, - crossAxisAlignment: .start, + if (user.canChangeUserPowerLevel) ...[ + if (user.powerLevel < 100) + PopupMenuItem( + value: _MemberActions.makeAdmin, + child: Row( children: [ - Text(L10n.of(context).chatPermissions), - Text( - user.powerLevel < 50 - ? L10n.of(context).userLevel(user.powerLevel) - : user.powerLevel < 100 - ? L10n.of(context).moderatorLevel(user.powerLevel) - : L10n.of(context).adminLevel(user.powerLevel), - style: const TextStyle(fontSize: 10), - ), + const Icon(Icons.admin_panel_settings_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).makeAdmin), ], ), - ], + ), + if (user.powerLevel < 50) + PopupMenuItem( + value: _MemberActions.makeModerator, + child: Row( + children: [ + const Icon(Icons.add_moderator_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).makeModerator), + ], + ), + ), + if (user.powerLevel >= 100) + PopupMenuItem( + value: _MemberActions.removeAdmin, + child: Row( + children: [ + const Icon(Icons.remove_moderator_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).removeAdminRights), + ], + ), + ) + else if (user.powerLevel >= 50) + PopupMenuItem( + value: _MemberActions.removeModerator, + child: Row( + children: [ + const Icon(Icons.remove_moderator_outlined), + const SizedBox(width: 18), + Text(L10n.of(context).removeModeratorRights), + ], + ), + ), + ], + if (user.canChangeUserPowerLevel || + !{0, 50, 100}.contains(user.powerLevel)) + PopupMenuItem( + value: _MemberActions.setPowerLevel, + enabled: user.canChangeUserPowerLevel, + child: Row( + children: [ + const Icon(Icons.manage_accounts_outlined), + const SizedBox(width: 18), + Text( + user.canChangeUserPowerLevel + ? L10n.of(context).setPowerLevel + : L10n.of(context).powerLevel, + ), + if (!{0, 50, 100}.contains(user.powerLevel)) + Text(' (${user.powerLevel})'), + ], + ), ), - ), if (user.canKick) PopupMenuItem( value: _MemberActions.kick, @@ -179,7 +213,7 @@ Future showMemberActionsPopupMenu({ case _MemberActions.mention: onMention?.call(); return; - case _MemberActions.setRole: + case _MemberActions.setPowerLevel: final power = await showPermissionChooser( context, currentLevel: user.powerLevel, @@ -280,13 +314,48 @@ Future showMemberActionsPopupMenu({ future: () => user.unban(), ); } + case _MemberActions.makeAdmin: + if (user.room.ownPowerLevel <= 100) { + final consent = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).areYouSure, + message: L10n.of(context).makeAdminDescription, + ); + if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; + } + await showFutureLoadingDialog( + context: context, + future: () => user.setPower(100), + ); + case _MemberActions.makeModerator: + await showFutureLoadingDialog( + context: context, + future: () => user.setPower(50), + ); + case _MemberActions.removeAdmin: + case _MemberActions.removeModerator: + final defaultUserLevel = + user.room + .getState(EventTypes.RoomPowerLevels) + ?.content + .tryGet('users_default') ?? + 0; + await showFutureLoadingDialog( + context: context, + future: () => user.setPower(defaultUserLevel), + ); } } enum _MemberActions { info, mention, - setRole, + setPowerLevel, + makeAdmin, + makeModerator, + removeAdmin, + removeModerator, kick, ban, approve, diff --git a/lib/widgets/permission_slider_dialog.dart b/lib/widgets/permission_slider_dialog.dart index dd613eed..1a0f2556 100644 --- a/lib/widgets/permission_slider_dialog.dart +++ b/lib/widgets/permission_slider_dialog.dart @@ -9,7 +9,7 @@ Future showPermissionChooser( int currentLevel = 0, int maxLevel = 100, }) async { - final controller = TextEditingController(); + final controller = TextEditingController(text: currentLevel.toString()); final error = ValueNotifier(null); return await showAdaptiveDialog( context: context, @@ -22,7 +22,7 @@ Future showPermissionChooser( crossAxisAlignment: .stretch, spacing: 12.0, children: [ - Text(L10n.of(context).setPermissionsLevelDescription), + Text(L10n.of(context).setPowerLevelDescription), ValueListenableBuilder( valueListenable: error, builder: (context, errorText, _) => DialogTextField( @@ -38,8 +38,6 @@ Future showPermissionChooser( ), actions: [ AdaptiveDialogAction( - bigButtons: true, - borderRadius: AdaptiveDialogAction.topRadius, onPressed: () { final level = int.tryParse(controller.text.trim()); if (level == null) { @@ -52,31 +50,12 @@ Future showPermissionChooser( } Navigator.of(context).pop(level); }, - child: Text(L10n.of(context).setCustomPermissionLevel), + child: Text(L10n.of(context).setPowerLevel), + ), + AdaptiveDialogAction( + onPressed: () => Navigator.of(context).pop(null), + child: Text(L10n.of(context).cancel), ), - if (maxLevel >= 100 && currentLevel != 100) - AdaptiveDialogAction( - borderRadius: AdaptiveDialogAction.centerRadius, - bigButtons: true, - onPressed: () => Navigator.of(context).pop(100), - child: Text(L10n.of(context).admin), - ), - if (maxLevel >= 50 && currentLevel != 50) - AdaptiveDialogAction( - borderRadius: maxLevel != 0 - ? AdaptiveDialogAction.centerRadius - : AdaptiveDialogAction.bottomRadius, - bigButtons: true, - onPressed: () => Navigator.of(context).pop(50), - child: Text(L10n.of(context).moderator), - ), - if (currentLevel != 0) - AdaptiveDialogAction( - borderRadius: AdaptiveDialogAction.bottomRadius, - bigButtons: true, - onPressed: () => Navigator.of(context).pop(0), - child: Text(L10n.of(context).normalUser), - ), ], ), ); From fd70c292e9ad499183cb4cd1e2b02915870390b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Feb 2026 14:02:30 +0100 Subject: [PATCH 151/333] chore: Follow up power level UX --- lib/l10n/intl_en.arb | 3 ++- lib/pages/chat_details/participant_list_item.dart | 4 +++- lib/widgets/member_actions_popup_menu_button.dart | 6 ++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 334de740..da89e973 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -3133,5 +3133,6 @@ "removeModeratorRights": "Remove moderator rights", "removeAdminRights": "Remove admin rights", "powerLevel": "Power level", - "setPowerLevelDescription": "Power levels define what a member is allowed to do in this room and usually range between 0 and 100." + "setPowerLevelDescription": "Power levels define what a member is allowed to do in this room and usually range between 0 and 100.", + "owner": "Owner" } diff --git a/lib/pages/chat_details/participant_list_item.dart b/lib/pages/chat_details/participant_list_item.dart index 04013ce5..54dcf8be 100644 --- a/lib/pages/chat_details/participant_list_item.dart +++ b/lib/pages/chat_details/participant_list_item.dart @@ -24,7 +24,9 @@ class ParticipantListItem extends StatelessWidget { Membership.leave => L10n.of(context).leftTheChat, }; - final permissionBatch = user.powerLevel >= 100 + final permissionBatch = user.room.creatorUserIds.contains(user.id) + ? L10n.of(context).owner + : user.powerLevel >= 100 ? L10n.of(context).admin : user.powerLevel >= 50 ? L10n.of(context).moderator diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart index 39503885..26a1bb20 100644 --- a/lib/widgets/member_actions_popup_menu_button.dart +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -34,6 +34,8 @@ Future showMemberActionsPopupMenu({ Offset.zero & overlay.size, ); + const defaultPowerLevels = {0, 50, 100, 9007199254740991}; + final action = await showMenu<_MemberActions>( context: context, position: position, @@ -124,7 +126,7 @@ Future showMemberActionsPopupMenu({ ), ], if (user.canChangeUserPowerLevel || - !{0, 50, 100}.contains(user.powerLevel)) + !defaultPowerLevels.contains(user.powerLevel)) PopupMenuItem( value: _MemberActions.setPowerLevel, enabled: user.canChangeUserPowerLevel, @@ -137,7 +139,7 @@ Future showMemberActionsPopupMenu({ ? L10n.of(context).setPowerLevel : L10n.of(context).powerLevel, ), - if (!{0, 50, 100}.contains(user.powerLevel)) + if (!defaultPowerLevels.contains(user.powerLevel)) Text(' (${user.powerLevel})'), ], ), From a04067d1e99a61bd9c9939236ebfe0010f774fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Feb 2026 20:22:25 +0100 Subject: [PATCH 152/333] chore: Follow up user dialog sharing --- lib/widgets/adaptive_dialogs/user_dialog.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index a6dd97af..fc15c4e4 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -227,7 +227,10 @@ class UserDialog extends StatelessWidget { AdaptiveIconTextButton( label: L10n.of(context).share, icon: Icons.adaptive.share, - onTap: () => FluffyShare.share(profile.userId, context), + onTap: () => FluffyShare.share( + 'https://matrix.to/#/${profile.userId}', + context, + ), ), ], ), From 41393c96beb698ee156a9ca13e148c5dae12cc18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 21:36:20 +0000 Subject: [PATCH 153/333] build: (deps): Bump flutter_webrtc from 1.3.0 to 1.3.1 Bumps [flutter_webrtc](https://github.com/cloudwebrtc/flutter-webrtc) from 1.3.0 to 1.3.1. - [Release notes](https://github.com/cloudwebrtc/flutter-webrtc/releases) - [Changelog](https://github.com/flutter-webrtc/flutter-webrtc/blob/main/CHANGELOG.md) - [Commits](https://github.com/cloudwebrtc/flutter-webrtc/compare/v1.3.0...v1.3.1) --- updated-dependencies: - dependency-name: flutter_webrtc dependency-version: 1.3.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 77050341..69275a59 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -702,10 +702,10 @@ packages: dependency: "direct main" description: name: flutter_webrtc - sha256: "0f86b518e9349e71a136a96e0ea11294cad8a8531b2bc9ae99e69df332ac898a" + sha256: c549ea8ffb20167110ad0a28e5f17a2650b5bea8837d984898cd9b0ffd5fa78b url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" frontend_server_client: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index abd45f5d..e32b821a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,7 +40,7 @@ dependencies: flutter_shortcuts_new: ^2.0.0 flutter_vodozemac: ^0.5.0 flutter_web_auth_2: ^5.0.1 - flutter_webrtc: ^1.3.0 + flutter_webrtc: ^1.3.1 geolocator: ^14.0.2 go_router: ^17.1.0 handy_window: ^0.4.0 From f4ee2670a8895a01c6a5a258e007db7d9e3eaf22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 21:33:27 +0000 Subject: [PATCH 154/333] build: (deps): Bump actions/upload-artifact from 6 to 7 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8899dca0..18741331 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -34,7 +34,7 @@ jobs: - name: Create archive run: tar -czf fluffychat-web.tar.gz build/web/ - name: Upload Web Build - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: Web Build path: fluffychat-web.tar.gz From c2f44ad97821335884376c6d374d7465bc45be20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 21:35:34 +0000 Subject: [PATCH 155/333] build: (deps): Bump handy_window from 0.4.0 to 0.4.2 Bumps [handy_window](https://github.com/ubuntu-flutter-community/handy_window) from 0.4.0 to 0.4.2. - [Release notes](https://github.com/ubuntu-flutter-community/handy_window/releases) - [Changelog](https://github.com/ubuntu/handy_window.dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/ubuntu-flutter-community/handy_window/compare/v0.4.0...v0.4.2) --- updated-dependencies: - dependency-name: handy_window dependency-version: 0.4.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 77050341..702f849d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -819,10 +819,10 @@ packages: dependency: "direct main" description: name: handy_window - sha256: "56b813e58a68b0ee2ab22051400b8b1f1b5cfe88b8cd32288623defb3926245a" + sha256: "06cc2747607022dbcea54b9b863db0962d34d606f998831a9b05a551c5184462" url: "https://pub.dev" source: hosted - version: "0.4.0" + version: "0.4.2" highlight: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index abd45f5d..e8d92265 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -43,7 +43,7 @@ dependencies: flutter_webrtc: ^1.3.0 geolocator: ^14.0.2 go_router: ^17.1.0 - handy_window: ^0.4.0 + handy_window: ^0.4.2 highlight: ^0.7.0 html: ^0.15.4 http: ^1.6.0 From a2de30360ea11ad539b21df9ef381904755da47d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Feb 2026 18:20:50 +0100 Subject: [PATCH 156/333] chore: Replace duplicate check for stale bot --- .github/workflows/check_duplicates.yaml | 29 ------------------------- .github/workflows/stale.yaml | 19 ++++++++++++++++ 2 files changed, 19 insertions(+), 29 deletions(-) delete mode 100644 .github/workflows/check_duplicates.yaml create mode 100644 .github/workflows/stale.yaml diff --git a/.github/workflows/check_duplicates.yaml b/.github/workflows/check_duplicates.yaml deleted file mode 100644 index c0fa5313..00000000 --- a/.github/workflows/check_duplicates.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: Check duplicates - -on: - issues: - types: [opened] - -jobs: - check_duplicates: - runs-on: ubuntu-latest - env: - title: ${{ github.event.issue.title }} - author: ${{ github.event.issue.user.login }} - number: ${{ github.event.issue.number }} - GH_TOKEN: ${{ github.token }} - steps: - - uses: actions/checkout@v6 - - name: Check duplicates - run: | - title=$(printf %q "${{ env.title }}") - issues=$(gh issue list --search '${{ title }}' --json number,title,url) - number=${{ env.number }} - issues_filtered=$(echo "$issues" | jq --arg num "$number" 'map(select(.number != ($num | tonumber)))') - if [ "$(echo "$issues_filtered" | jq length)" -eq 0 ]; then - echo "No duplicates found." - else - issues_markdown=$(echo "$issues_filtered" | jq -r '.[] | "- [" + .title + "](" + .url + ")"') - formatted_body=$(echo -e "@${{ env.author }}\nPossible duplication of:\n$issues_markdown") - gh issue comment ${{ github.event.issue.number }} --body "$formatted_body" - fi \ No newline at end of file diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml new file mode 100644 index 00000000..139d9e13 --- /dev/null +++ b/.github/workflows/stale.yaml @@ -0,0 +1,19 @@ +name: 'Close stale issues and PRs' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v10 + with: + stale-issue-message: 'This issue is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 5 days.' + stale-pr-message: 'This PR is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 10 days.' + close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.' + close-pr-message: 'This PR was closed because it has been stalled for 10 days with no activity.' + days-before-issue-stale: 365 + days-before-pr-stale: 360 + days-before-issue-close: 5 + days-before-pr-close: 10 \ No newline at end of file From a0f6dc3afe82459bfc419ad7df10e57d83476f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m=2E?= Date: Thu, 26 Feb 2026 07:46:50 +0100 Subject: [PATCH 157/333] chore(translations): Translated using Weblate (Galician) Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/ --- lib/l10n/intl_gl.arb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index 4afbd72f..995746a2 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -83,7 +83,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "Permitir o acceso de convidadas", + "areGuestsAllowedToJoin": "Poden entrar as usuarias convidadas?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -3144,5 +3144,8 @@ "signUpGreeting": "FluffyChat é descentralizada! Elixe un servidor para crear a conta e xa podes utilizar a app!", "signInGreeting": "Xa tes unha conta en Matrix? Benvida! Selecciona o teu servidor de orixe e accede.", "appIntro": "Con FluffyChat podes conversar coas amizades. É mensaxería segura e descentralizada en [matrix]! Coñece máis en https://matrix.org ou crea unha conta.", - "theProcessWasCanceled": "Desbotouse o proceso." + "theProcessWasCanceled": "Desbotouse o proceso.", + "join": "Unirse", + "searchOrEnterHomeserverAddress": "Busca ou escribe o enderezo do servidor de inicio", + "matrixId": "ID en Matrix" } From f4c6f431c86cd6962e378661b3f6f2481144930a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Wed, 25 Feb 2026 19:05:23 +0100 Subject: [PATCH 158/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 60.9% (514 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 131 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index e88db8b5..4689eebe 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1960,5 +1960,134 @@ } } }, - "pleaseEnterANumber": "Ma ulac aɣilif sekcem amḍan yugaren 0" + "pleaseEnterANumber": "Ma ulac aɣilif sekcem amḍan yugaren 0", + "unknownEncryptionAlgorithm": "Alguritm n uwgelhen d arussin", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unknownEvent": "Tadyant tarussint '{type]'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "unmuteChat": "Kkes asgugem i udiwenni", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "Lqem Android ur yettwasefrak ara", + "unsupportedAndroidVersionLong": "Tamahilt-a tesra lqem Android tamaynut. Ttxil-k·m senqed ileqman neɣ asefrak n Lineage OS.", + "startFirstChat": "Senker adiwenni-ik·im amezwaru", + "status": "Addad", + "@status": { + "type": "String", + "placeholders": {} + }, + "statusExampleMessage": "Amek telliḍ ass-a?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "submit": "Ceyyeɛ", + "@submit": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "Amtawi... Ttxil-k·m arǧu.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWaitCounter": " Amtawi… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "systemTheme": "Anagraw", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "Ur mṣadan ara", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "mṣadan", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "title": "FluffyChat", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "toggleFavorite": "Qluqel asmenyif", + "@toggleFavorite": { + "type": "String", + "placeholders": {} + }, + "toggleMuted": "Qluqel asgugem", + "@toggleMuted": { + "type": "String", + "placeholders": {} + }, + "toggleUnread": "Creḍ Yettwaɣri/Ur yettwaɣri ara", + "@toggleUnread": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "Deqs n tuttriwin. Ttxil-k·m, ɛreḍ tikelt nniḍen ticki!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "Asiweḍ seg yibenk nniḍen", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "Ɛreḍ ad tazneḍ tikkelt nniḍen", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "unavailable": "Ur yewjid ara", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} yekkes agdek n {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unblockDevice": "Kkes asewḥel n yibenk", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "Ibenk arussin", + "@unknownDevice": { + "type": "String", + "placeholders": {} + } } From 69bafd1dfeb3e96dcf806f299900687180f606ca Mon Sep 17 00:00:00 2001 From: Vishal Singh Date: Wed, 25 Feb 2026 12:07:52 +0100 Subject: [PATCH 159/333] chore(translations): Translated using Weblate (Hindi) Currently translated at 2.6% (22 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/hi/ --- lib/l10n/intl_hi.arb | 2175 ++---------------------------------------- 1 file changed, 69 insertions(+), 2106 deletions(-) diff --git a/lib/l10n/intl_hi.arb b/lib/l10n/intl_hi.arb index 032a7464..b67c4d96 100644 --- a/lib/l10n/intl_hi.arb +++ b/lib/l10n/intl_hi.arb @@ -1,2109 +1,72 @@ { - "@showPassword": { - "type": "String", - "placeholders": {} - }, - "@hugContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "@darkTheme": { - "type": "String", - "placeholders": {} - }, - "@passphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterYourPassword": { - "type": "String", - "placeholders": {} - }, - "@theyMatch": { - "type": "String", - "placeholders": {} - }, - "@connect": { - "type": "String", - "placeholders": {} - }, - "@jumpToLastReadMessage": {}, - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "@obtainingLocation": { - "type": "String", - "placeholders": {} - }, - "@commandHint_cuddle": {}, - "@chats": { - "type": "String", - "placeholders": {} - }, - "@widgetVideo": {}, - "@dismiss": {}, - "@unknownDevice": { - "type": "String", - "placeholders": {} - }, - "@emoteShortcode": { - "type": "String", - "placeholders": {} - }, - "@noEncryptionForPublicRooms": { - "type": "String", - "placeholders": {} - }, - "@admin": { - "type": "String", - "placeholders": {} - }, - "@reportErrorDescription": {}, - "@directChats": { - "type": "String", - "placeholders": {} - }, - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "@inviteContactToGroup": { - "type": "String", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "@addAccount": {}, - "@close": { - "type": "String", - "placeholders": {} - }, - "@configureChat": { - "type": "String", - "placeholders": {} - }, - "@chatHasBeenAddedToThisSpace": {}, - "@reply": { - "type": "String", - "placeholders": {} - }, - "@currentlyActive": { - "type": "String", - "placeholders": {} - }, - "@removeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "@unsupportedAndroidVersion": {}, - "@device": { - "type": "String", - "placeholders": {} - }, - "@blockDevice": { - "type": "String", - "placeholders": {} - }, - "@commandHint_html": { - "type": "String", - "description": "Usage hint for the command /html" - }, - "@widgetJitsi": {}, - "@youAreNoLongerParticipatingInThisChat": { - "type": "String", - "placeholders": {} - }, - "@encryption": { - "type": "String", - "placeholders": {} - }, - "@messageType": {}, - "@indexedDbErrorLong": {}, - "@oneClientLoggedOut": {}, - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "@unsupportedAndroidVersionLong": {}, - "@kicked": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@title": { - "description": "Title for the application", - "type": "String", - "placeholders": {} - }, - "@changeTheNameOfTheGroup": { - "type": "String", - "placeholders": {} - }, - "@changedTheChatAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@verifySuccess": { - "type": "String", - "placeholders": {} - }, - "@sendFile": { - "type": "String", - "placeholders": {} - }, - "@newVerificationRequest": { - "type": "String", - "placeholders": {} - }, - "@startFirstChat": {}, - "@callingAccount": {}, - "@requestPermission": { - "type": "String", - "placeholders": {} - }, - "@sentAPicture": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@invited": { - "type": "String", - "placeholders": {} - }, - "@changedTheDisplaynameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "displayname": { - "type": "String" - } - } - }, - "@setColorTheme": {}, - "@nextAccount": {}, - "@commandHint_create": { - "type": "String", - "description": "Usage hint for the command /create" - }, - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "@warning": { - "type": "String", - "placeholders": {} - }, - "@password": { - "type": "String", - "placeholders": {} - }, - "@allSpaces": {}, - "@supposedMxid": { - "type": "String", - "placeholders": { - "mxid": { - "type": "String" - } - } - }, - "@editDisplayname": { - "type": "String", - "placeholders": {} - }, - "@user": {}, - "@roomVersion": { - "type": "String", - "placeholders": {} - }, - "@sentAFile": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@videoCall": { - "type": "String", - "placeholders": {} - }, - "@youAcceptedTheInvitation": {}, - "@banFromChat": { - "type": "String", - "placeholders": {} - }, - "@noMatrixServer": { - "type": "String", - "placeholders": { - "server1": { - "type": "String" - }, - "server2": { - "type": "String" - } - } - }, - "@userAndOthersAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "@youInvitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@userIsTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@openAppToReadMessages": { - "type": "String", - "placeholders": {} - }, - "@sentAVideo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@banUserDescription": {}, - "@inviteContact": { - "type": "String", - "placeholders": {} - }, - "@askSSSSSign": { - "type": "String", - "placeholders": {} - }, - "@widgetEtherpad": {}, - "@waitingPartnerAcceptRequest": { - "type": "String", - "placeholders": {} - }, - "remove": "निकालना", - "@remove": { - "type": "String", - "placeholders": {} - }, - "@writeAMessage": { - "type": "String", - "placeholders": {} - }, - "@changeTheme": { - "type": "String", - "placeholders": {} - }, - "@id": { - "type": "String", - "placeholders": {} - }, - "@removeDevicesDescription": {}, - "@changedTheChatDescriptionTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "description": { - "type": "String" - } - } - }, - "@countParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "@tryAgain": {}, - "@areGuestsAllowedToJoin": { - "type": "String", - "placeholders": {} - }, - "@blocked": { - "type": "String", - "placeholders": {} - }, - "@youKickedAndBanned": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "@removeDevice": { - "type": "String", - "placeholders": {} - }, - "@unbanUserDescription": {}, - "@userAndUserAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "username2": { - "type": "String" - } - } - }, - "@pleaseClickOnLink": { - "type": "String", - "placeholders": {} - }, - "@saveFile": { - "type": "String", - "placeholders": {} - }, - "@sendOnEnter": {}, - "@pickImage": { - "type": "String", - "placeholders": {} - }, - "@answeredTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "@youRejectedTheInvitation": {}, - "@otherCallingPermissions": {}, - "@messagesStyle": {}, - "@couldNotDecryptMessage": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@invitedUsersOnly": { - "type": "String", - "placeholders": {} - }, - "@link": {}, - "@widgetUrlError": {}, - "@emailOrUsername": {}, - "@newSpaceDescription": {}, - "@chatDescription": {}, - "@callingAccountDetails": {}, - "@next": { - "type": "String", - "placeholders": {} - }, - "@pleaseFollowInstructionsOnWeb": { - "type": "String", - "placeholders": {} - }, - "@changedTheGuestAccessRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "@editRoomAliases": { - "type": "String", - "placeholders": {} - }, - "@enterSpace": {}, - "@encryptThisChat": {}, - "@fileName": { - "type": "String", - "placeholders": {} - }, - "@unavailable": { - "type": "String", - "placeholders": {} - }, - "@previousAccount": {}, - "@publicRooms": { - "type": "String", - "placeholders": {} - }, - "@fromTheInvitation": { - "type": "String", - "placeholders": {} - }, - "@sendMessages": { - "type": "String", - "placeholders": {} - }, - "@incorrectPassphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, - "@reopenChat": {}, - "@pleaseEnterRecoveryKey": {}, - "@create": { - "type": "String", - "placeholders": {} - }, - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "@no": { - "type": "String", - "placeholders": {} - }, - "@alias": { - "type": "String", - "placeholders": {} - }, - "@widgetNameError": {}, - "@inoffensive": { - "type": "String", - "placeholders": {} - }, - "@unpin": { - "type": "String", - "placeholders": {} - }, - "@addToBundle": {}, - "@reportMessage": { - "type": "String", - "placeholders": {} - }, - "@spaceIsPublic": { - "type": "String", - "placeholders": {} - }, - "@addWidget": {}, - "@all": { - "type": "String", - "placeholders": {} - }, - "@removeAllOtherDevices": { - "type": "String", - "placeholders": {} - }, - "@unblockDevice": { - "type": "String", - "placeholders": {} - }, - "@countFiles": { - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@noKeyForThisMessage": {}, - "@enableEncryptionWarning": { - "type": "String", - "placeholders": {} - }, - "@inviteText": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "@shareLocation": { - "type": "String", - "placeholders": {} - }, - "@reason": { - "type": "String", - "placeholders": {} - }, - "@commandHint_markasgroup": {}, - "@errorObtainingLocation": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "@hydrateTor": {}, - "@pushNotificationsNotAvailable": {}, - "@passwordRecovery": { - "type": "String", - "placeholders": {} - }, - "@storeInAppleKeyChain": {}, - "@replaceRoomWithNewerVersion": { - "type": "String", - "placeholders": {} - }, - "@hydrate": {}, - "@invalidServerName": {}, - "@chatPermissions": {}, - "@voiceMessage": { - "type": "String", - "placeholders": {} - }, - "@badServerLoginTypesException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "@wipeChatBackup": { - "type": "String", - "placeholders": {} - }, - "@cantOpenUri": { - "type": "String", - "placeholders": { - "uri": { - "type": "String" - } - } - }, - "@sender": {}, - "@storeInAndroidKeystore": {}, - "@hideRedactedEvents": { - "type": "String", - "placeholders": {} - }, - "@online": { - "type": "String", - "placeholders": {} - }, - "@signInWithPassword": {}, - "@ignoredUsers": { - "type": "String", - "placeholders": {} - }, - "@lastActiveAgo": { - "type": "String", - "placeholders": { - "localizedTimeShort": { - "type": "String" - } - } - }, - "@changedTheGuestAccessRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "@weSentYouAnEmail": { - "type": "String", - "placeholders": {} - }, - "@offensive": { - "type": "String", - "placeholders": {} - }, - "@needPantalaimonWarning": { - "type": "String", - "placeholders": {} - }, - "@makeAdminDescription": {}, - "@edit": { - "type": "String", - "placeholders": {} - }, - "@loadMore": { - "type": "String", - "placeholders": {} - }, - "@noEmotesFound": { - "type": "String", - "placeholders": {} - }, - "@synchronizingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "@transferFromAnotherDevice": { - "type": "String", - "placeholders": {} - }, - "@passwordHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "@pushRules": { - "type": "String", - "placeholders": {} - }, - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, - "@commandHint_clearcache": { - "type": "String", - "description": "Usage hint for the command /clearcache" - }, - "@loadingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "@copy": { - "type": "String", - "placeholders": {} - }, - "@saveKeyManuallyDescription": {}, - "@none": { - "type": "String", - "placeholders": {} - }, - "@editBundlesForAccount": {}, - "@enableEncryption": { - "type": "String", - "placeholders": {} - }, - "@whyIsThisMessageEncrypted": {}, - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, - "@rejectedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@setChatDescription": {}, - "@userLeftTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@spaceName": { - "type": "String", - "placeholders": {} - }, - "importFromZipFile": ".zip फ़ाइल से आयात करें", - "@importFromZipFile": {}, - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "@or": { - "type": "String", - "placeholders": {} - }, - "@dehydrateWarning": {}, - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "@noOtherDevicesFound": {}, - "@whoIsAllowedToJoinThisGroup": { - "type": "String", - "placeholders": {} - }, - "@emptyChat": { - "type": "String", - "placeholders": {} - }, - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@storeSecurlyOnThisDevice": {}, - "@yourChatBackupHasBeenSetUp": {}, - "@chatBackup": { - "type": "String", - "placeholders": {} - }, - "@redactedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@submit": { - "type": "String", - "placeholders": {} - }, - "@videoCallsBetaWarning": {}, - "@unmuteChat": { - "type": "String", - "placeholders": {} - }, - "@createdTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@redactedAnEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@autoplayImages": { - "type": "String", - "placeholder": {} - }, - "@compareEmojiMatch": { - "type": "String", - "placeholders": {} - }, - "@participant": { - "type": "String", - "placeholders": {} - }, - "@logInTo": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "@yes": { - "type": "String", - "placeholders": {} - }, - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "@username": { - "type": "String", - "placeholders": {} - }, - "@changedTheRoomAliases": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@fileIsTooBigForServer": {}, - "@homeserver": {}, - "@help": { - "type": "String", - "placeholders": {} - }, - "@chatDetails": { - "type": "String", - "placeholders": {} - }, - "@people": { - "type": "String", - "placeholders": {} - }, - "@changedTheHistoryVisibilityTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "@leftTheChat": { - "type": "String", - "placeholders": {} - }, - "@verified": { - "type": "String", - "placeholders": {} - }, - "repeatPassword": "पासवर्ड दोहराएं", - "@repeatPassword": {}, - "@setStatus": { - "type": "String", - "placeholders": {} - }, - "@groupWith": { - "type": "String", - "placeholders": { - "displayname": { - "type": "String" - } - } - }, - "@callingPermissions": {}, - "@delete": { - "type": "String", - "placeholders": {} - }, - "@newMessageInFluffyChat": { - "type": "String", - "placeholders": {} - }, - "@readUpToHere": {}, - "@start": {}, - "@downloadFile": { - "type": "String", - "placeholders": {} - }, - "@deviceId": { - "type": "String", - "placeholders": {} - }, - "@register": { - "type": "String", - "placeholders": {} - }, - "@unlockOldMessages": {}, - "@identity": { - "type": "String", - "placeholders": {} - }, - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "@changedTheJoinRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "joinRules": { - "type": "String" - } - } - }, - "@ignore": { - "type": "String", - "placeholders": {} - }, - "@recording": { - "type": "String", - "placeholders": {} - }, - "@changedTheChatPermissions": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@moderator": { - "type": "String", - "placeholders": {} - }, - "@optionalRedactReason": {}, - "@acceptedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@waitingPartnerEmoji": { - "type": "String", - "placeholders": {} - }, - "@channelCorruptedDecryptError": { - "type": "String", - "placeholders": {} - }, - "@tryToSendAgain": { - "type": "String", - "placeholders": {} - }, - "@guestsCanJoin": { - "type": "String", - "placeholders": {} - }, - "@ok": { - "type": "String", - "placeholders": {} - }, - "@copyToClipboard": { - "type": "String", - "placeholders": {} - }, - "@dehydrate": {}, - "@locationPermissionDeniedNotice": { - "type": "String", - "placeholders": {} - }, - "@send": { - "type": "String", - "placeholders": {} - }, - "@hasWithdrawnTheInvitationFor": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@visibleForAllParticipants": { - "type": "String", - "placeholders": {} - }, - "@noRoomsFound": { - "type": "String", - "placeholders": {} - }, - "@banned": { - "type": "String", - "placeholders": {} - }, - "@sendAsText": { - "type": "String" - }, - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, - "@archiveRoomDescription": {}, - "exportEmotePack": "इमोट पैक को .zip के रूप में निर्यात करें", - "@exportEmotePack": {}, - "@changedTheChatNameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "chatname": { - "type": "String" - } - } - }, - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "@account": { - "type": "String", - "placeholders": {} - }, - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "@commandInvalid": { - "type": "String" - }, - "@setAsCanonicalAlias": { - "type": "String", - "placeholders": {} - }, - "@whyDoYouWantToReportThis": { - "type": "String", - "placeholders": {} - }, - "@locationDisabledNotice": { - "type": "String", - "placeholders": {} - }, - "@placeCall": {}, - "@removedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@changedTheRoomInvitationLink": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@newChat": { - "type": "String", - "placeholders": {} - }, - "@notifications": { - "type": "String", - "placeholders": {} - }, - "@commandHint_plain": { - "type": "String", - "description": "Usage hint for the command /plain" - }, - "@emoteSettings": { - "type": "String", - "placeholders": {} - }, - "@experimentalVideoCalls": {}, - "@openCamera": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterRecoveryKeyDescription": {}, - "@guestsAreForbidden": { - "type": "String", - "placeholders": {} - }, - "@mention": { - "type": "String", - "placeholders": {} - }, - "@openInMaps": { - "type": "String", - "placeholders": {} - }, - "@withTheseAddressesRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "@inviteContactToGroupQuestion": {}, - "@emoteExists": { - "type": "String", - "placeholders": {} - }, - "@redactedByBecause": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "reason": { - "type": "String" - } - } - }, - "@isTyping": { - "type": "String", - "placeholders": {} - }, - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@chat": { - "type": "String", - "placeholders": {} - }, - "@group": { - "type": "String", - "placeholders": {} - }, - "@leave": { - "type": "String", - "placeholders": {} - }, - "@skip": { - "type": "String", - "placeholders": {} - }, - "@appearOnTopDetails": {}, - "@roomHasBeenUpgraded": { - "type": "String", - "placeholders": {} - }, - "@enterRoom": {}, - "@enableEmotesGlobally": { - "type": "String", - "placeholders": {} - }, - "@areYouSure": { - "type": "String", - "placeholders": {} - }, - "@pleaseChooseAPasscode": { - "type": "String", - "placeholders": {} - }, - "@noPasswordRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "@changedTheProfileAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@allChats": { - "type": "String", - "placeholders": {} - }, - "@reportUser": {}, - "@sharedTheLocation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@commandHint_send": { - "type": "String", - "description": "Usage hint for the command /send" - }, - "@onlineKeyBackupEnabled": { - "type": "String", - "placeholders": {} - }, - "@unbannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@confirmEventUnpin": {}, - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "@youInvitedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@kickedAndBanned": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@noConnectionToTheServer": { - "type": "String", - "placeholders": {} - }, - "@fileHasBeenSavedAt": { - "type": "String", - "placeholders": { - "path": { - "type": "String" - } - } - }, - "@license": { - "type": "String", - "placeholders": {} - }, - "@addToSpace": {}, - "@unbanFromChat": { - "type": "String", - "placeholders": {} - }, - "@commandMissing": { - "type": "String", - "placeholders": { - "command": { - "type": "String" - } + "remove": "निकालना", + "@remove": { + "type": "String", + "placeholders": {} }, - "description": "State that {command} is not a valid /command." - }, - "@redactMessageDescription": {}, - "@rejoin": { - "type": "String", - "placeholders": {} - }, - "@recoveryKey": {}, - "@redactMessage": { - "type": "String", - "placeholders": {} - }, - "@forward": { - "type": "String", - "placeholders": {} - }, - "@commandHint_discardsession": { - "type": "String", - "description": "Usage hint for the command /discardsession" - }, - "@invalidInput": {}, - "@about": { - "type": "String", - "placeholders": {} - }, - "@chooseAStrongPassword": { - "type": "String", - "placeholders": {} - }, - "@hideUnknownEvents": { - "type": "String", - "placeholders": {} - }, - "@dehydrateTorLong": {}, - "@yourPublicKey": { - "type": "String", - "placeholders": {} - }, - "@tooManyRequestsWarning": { - "type": "String", - "placeholders": {} - }, - "@invitedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@kickFromChat": { - "type": "String", - "placeholders": {} - }, - "@commandHint_myroomnick": { - "type": "String", - "description": "Usage hint for the command /myroomnick" - }, - "@offline": { - "type": "String", - "placeholders": {} - }, - "@noPermission": { - "type": "String", - "placeholders": {} - }, - "@doNotShowAgain": {}, - "@activatedEndToEndEncryption": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@report": {}, - "@status": { - "type": "String", - "placeholders": {} - }, - "@compareNumbersMatch": { - "type": "String", - "placeholders": {} - }, - "@groupIsPublic": { - "type": "String", - "placeholders": {} - }, - "@verifyStart": { - "type": "String", - "placeholders": {} - }, - "@memberChanges": { - "type": "String", - "placeholders": {} - }, - "@joinRoom": { - "type": "String", - "placeholders": {} - }, - "@unverified": {}, - "@fluffychat": { - "type": "String", - "placeholders": {} - }, - "@howOffensiveIsThisContent": { - "type": "String", - "placeholders": {} - }, - "@serverRequiresEmail": {}, - "@hideUnimportantStateEvents": {}, - "@screenSharingTitle": {}, - "@widgetCustom": {}, - "@sentCallInformations": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "@addToSpaceDescription": {}, - "@googlyEyesContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "@youBannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@theyDontMatch": { - "type": "String", - "placeholders": {} - }, - "@youHaveBeenBannedFromThisChat": { - "type": "String", - "placeholders": {} - }, - "@displaynameHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "@addChatDescription": {}, - "@sentAnAudio": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@editRoomAvatar": { - "type": "String", - "placeholders": {} - }, - "@encrypted": { - "type": "String", - "placeholders": {} - }, - "@commandHint_leave": { - "type": "String", - "description": "Usage hint for the command /leave" - }, - "@commandHint_myroomavatar": { - "type": "String", - "description": "Usage hint for the command /myroomavatar" - }, - "@cancel": { - "type": "String", - "placeholders": {} - }, - "@hasKnocked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@publish": {}, - "@openLinkInBrowser": {}, - "@clearArchive": {}, - "@appLock": { - "type": "String", - "placeholders": {} - }, - "@commandHint_react": { - "type": "String", - "description": "Usage hint for the command /react" - }, - "@changedTheHistoryVisibility": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@commandHint_me": { - "type": "String", - "description": "Usage hint for the command /me" - }, - "@pleaseEnterYourUsername": { - "type": "String", - "placeholders": {} - }, - "@messageInfo": {}, - "@disableEncryptionWarning": {}, - "@directChat": {}, - "@encryptionNotEnabled": { - "type": "String", - "placeholders": {} - }, - "@wrongPinEntered": { - "type": "String", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "@sendTypingNotifications": {}, - "@lightTheme": { - "type": "String", - "placeholders": {} - }, - "@inviteGroupChat": {}, - "@appearOnTop": {}, - "@invitePrivateChat": {}, - "@verifyTitle": { - "type": "String", - "placeholders": {} - }, - "@foregroundServiceRunning": {}, - "@enterAnEmailAddress": { - "type": "String", - "placeholders": {} - }, - "@voiceCall": {}, - "@commandHint_kick": { - "type": "String", - "description": "Usage hint for the command /kick" - }, - "@copiedToClipboard": { - "type": "String", - "placeholders": {} - }, - "@createNewSpace": { - "type": "String", - "placeholders": {} - }, - "@commandHint_unban": { - "type": "String", - "description": "Usage hint for the command /unban" - }, - "@unknownEncryptionAlgorithm": { - "type": "String", - "placeholders": {} - }, - "@commandHint_ban": { - "type": "String", - "description": "Usage hint for the command /ban" - }, - "importEmojis": "इमोजी आयात करें", - "@importEmojis": {}, - "@confirm": { - "type": "String", - "placeholders": {} - }, - "@wasDirectChatDisplayName": { - "type": "String", - "placeholders": { - "oldDisplayName": { - "type": "String" - } - } - }, - "@noChatDescriptionYet": {}, - "@defaultPermissionLevel": { - "type": "String", - "placeholders": {} - }, - "@removeFromBundle": {}, - "@numUsersTyping": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@fontSize": { - "type": "String", - "placeholders": {} - }, - "@whoCanPerformWhichAction": { - "type": "String", - "placeholders": {} - }, - "@confirmMatrixId": {}, - "@learnMore": {}, - "@iHaveClickedOnLink": { - "type": "String", - "placeholders": {} - }, - "@you": { - "type": "String", - "placeholders": {} - }, - "notAnImage": "कोई छवि फ़ाइल नहीं।", - "@notAnImage": {}, - "@users": {}, - "@openGallery": {}, - "@chatDescriptionHasBeenChanged": {}, - "@search": { - "type": "String", - "placeholders": {} - }, - "@newGroup": {}, - "@bundleName": {}, - "@dehydrateTor": {}, - "@removeFromSpace": {}, - "@dateAndTimeOfDay": { - "type": "String", - "placeholders": { - "date": { - "type": "String" - }, - "timeOfDay": { - "type": "String" - } - } - }, - "@commandHint_op": { - "type": "String", - "description": "Usage hint for the command /op" - }, - "@commandHint_join": { - "type": "String", - "description": "Usage hint for the command /join" - }, - "@sourceCode": { - "type": "String", - "placeholders": {} - }, - "@roomUpgradeDescription": {}, - "@commandHint_invite": { - "type": "String", - "description": "Usage hint for the command /invite" - }, - "@userSentUnknownEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "type": { - "type": "String" - } - } - }, - "@scanQrCode": {}, - "@logout": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnterANumber": {}, - "@contactHasBeenInvitedToTheGroup": { - "type": "String", - "placeholders": {} - }, - "@youKicked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@areYouSureYouWantToLogout": { - "type": "String", - "placeholders": {} - }, - "@changedTheJoinRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@profileNotFound": {}, - "@jump": {}, - "@groups": { - "type": "String", - "placeholders": {} - }, - "@reactedWith": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - }, - "reaction": { - "type": "String" - } - } - }, - "@bannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "@sorryThatsNotPossible": {}, - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "@oopsSomethingWentWrong": { - "type": "String", - "placeholders": {} - }, - "@loadCountMoreParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@shareInviteLink": {}, - "@commandHint_markasdm": {}, - "@recoveryKeyLost": {}, - "@cuddleContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "@askVerificationRequest": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "@messages": { - "type": "String", - "placeholders": {} - }, - "@login": { - "type": "String", - "placeholders": {} - }, - "@deviceKeys": {}, - "@waitingPartnerNumbers": { - "type": "String", - "placeholders": {} - }, - "@noGoogleServicesWarning": { - "type": "String", - "placeholders": {} - }, - "@everythingReady": { - "type": "String", - "placeholders": {} - }, - "@addEmail": { - "type": "String", - "placeholders": {} - }, - "@emoteKeyboardNoRecents": { - "type": "String", - "placeholders": {} - }, - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "@startedACall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "@emoteInvalid": { - "type": "String", - "placeholders": {} - }, - "@systemTheme": { - "type": "String", - "placeholders": {} - }, - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, - "@deleteMessage": { - "type": "String", - "placeholders": {} - }, - "@visibilityOfTheChatHistory": { - "type": "String", - "placeholders": {} - }, - "@settings": { - "type": "String", - "placeholders": {} - }, - "@setTheme": {}, - "@changeTheHomeserver": { - "type": "String", - "placeholders": {} - }, - "@youJoinedTheChat": {}, - "@wallpaper": { - "type": "String", - "placeholders": {} - }, - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "@play": { - "type": "String", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "@chatBackupDescription": { - "type": "String", - "placeholders": {} - }, - "@changeDeviceName": { - "type": "String", - "placeholders": {} - }, - "@passwordForgotten": { - "type": "String", - "placeholders": {} - }, - "@statusExampleMessage": { - "type": "String", - "placeholders": {} - }, - "@security": { - "type": "String", - "placeholders": {} - }, - "@markAsRead": {}, - "@sendAudio": { - "type": "String", - "placeholders": {} - }, - "@widgetName": {}, - "@sentASticker": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@errorAddingWidget": {}, - "@commandHint_dm": { - "type": "String", - "description": "Usage hint for the command /dm" - }, - "@commandHint_hug": {}, - "@replace": {}, - "@reject": { - "type": "String", - "placeholders": {} - }, - "@extremeOffensive": { - "type": "String", - "placeholders": {} - }, - "@editBlockedServers": { - "type": "String", - "placeholders": {} - }, - "@oopsPushError": { - "type": "String", - "placeholders": {} - }, - "@youUnbannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "@deactivateAccountWarning": { - "type": "String", - "placeholders": {} - }, - "@archive": { - "type": "String", - "placeholders": {} - }, - "@joinedTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "@visibleForEveryone": { - "type": "String", - "placeholders": {} - }, - "@pleaseEnter4Digits": { - "type": "String", - "placeholders": {} - }, - "@newSpace": {}, - "@changePassword": { - "type": "String", - "placeholders": {} - }, - "@devices": { - "type": "String", - "placeholders": {} - }, - "@accept": { - "type": "String", - "placeholders": {} - }, - "@unknownEvent": { - "type": "String", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "@emojis": {}, - "@pleaseEnterYourPin": { - "type": "String", - "placeholders": {} - }, - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, - "@share": { - "type": "String", - "placeholders": {} - }, - "@commandHint_googly": {}, - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "@createGroup": {}, - "@privacy": { - "type": "String", - "placeholders": {} - }, - "@changeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "@sendImage": { - "type": "String", - "placeholders": {} - }, - "@hydrateTorLong": {}, - "@time": {}, - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, - "@botMessages": { - "type": "String", - "placeholders": {} - }, - "@contentHasBeenReported": { - "type": "String", - "placeholders": {} - }, - "@custom": {}, - "@noBackupWarning": {}, - "@fromJoining": { - "type": "String", - "placeholders": {} - }, - "@verify": { - "type": "String", - "placeholders": {} - }, - "@sendVideo": { - "type": "String", - "placeholders": {} - }, - "@storeInSecureStorageDescription": {}, - "@openChat": {}, - "@kickUserDescription": {}, - "@sendAMessage": { - "type": "String", - "placeholders": {} - }, - "@pin": { - "type": "String", - "placeholders": {} - }, - "importNow": "अभी आयात करें", - "@importNow": {}, - "@deleteAccount": { - "type": "String", - "placeholders": {} - }, - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "@pinMessage": {}, - "@screenSharingDetail": {}, - "@muteChat": { - "type": "String", - "placeholders": {} - }, - "@invite": {}, - "@enableMultiAccounts": {}, - "@anyoneCanJoin": { - "type": "String", - "placeholders": {} - }, - "@emotePacks": { - "type": "String", - "placeholders": {} - }, - "@indexedDbErrorTitle": {}, - "@endedTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - } + "importFromZipFile": ".zip फ़ाइल से आयात करें", + "repeatPassword": "पासवर्ड दोहराएं", + "exportEmotePack": "इमोट पैक को .zip के रूप में निर्यात करें", + "importEmojis": "इमोजी आयात करें", + "notAnImage": "कोई छवि फ़ाइल नहीं।", + "importNow": "अभी आयात करें", + "setCustomPermissionLevel": "अपना अनुमति स्तर निर्धारित करें", + "setPermissionsLevelDescription": "कृपया नीचे दी गई भूमिका चुनें या 0 से 100 के बीच अपनी कस्टम अनुमति स्तर दर्ज करें।", + "ignoreUser": "उपयोगकर्ता को नजरअंदाज करें", + "normalUser": "सामान्य उपयोगकर्ता", + "replace": "बदलें", + "about": "हमारे बारे में", + "aboutHomeserver": "{homeserver} की जानकारी", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "accept": "स्वीकार करें", + "@accept": { + "type": "String", + "placeholders": {} + }, + "acceptedTheInvitation": "👍 {username} ने निमंत्रण स्वीकार किया", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "account": "अकाउंट", + "@account": { + "type": "String", + "placeholders": {} + }, + "activatedEndToEndEncryption": "🔐 {username} ने एंड-टू-एंड एन्क्रिप्शन चालू किया", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addEmail": "ईमेल ऐड करें", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "confirmMatrixId": "कृपया अपना अकाउंट हटाने के लिए अपनी मैट्रिक्स आईडी की पुष्टि करें।", + "supposedMxid": "यह {mxid} होना चाहिए", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "addChatDescription": "चैट का विवरण जोड़ें..।" } From e9ed2db39dc6ebfbff8a1dfe24aeef5d032eb2c7 Mon Sep 17 00:00:00 2001 From: nautilusx Date: Thu, 26 Feb 2026 04:56:53 +0100 Subject: [PATCH 160/333] chore(translations): Translated using Weblate (German) Currently translated at 100.0% (843 of 843 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/ --- lib/l10n/intl_de.arb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 8ae397ee..2af7eb0e 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -87,7 +87,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "Dürfen Gäste beitreten", + "areGuestsAllowedToJoin": "Dürfen Gäste teilnehmen?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -2813,7 +2813,7 @@ "whatIsAHomeserver": "Was ist ein Homeserver?", "doesNotSeemToBeAValidHomeserver": "Scheint kein kompatibler Homeserver zu sein. Falsche URL?", "loginWithMatrixId": "Mit Matrix-ID anmelden", - "discoverHomeservers": "Server suchen", + "discoverHomeservers": "Homeserver suchen", "homeserverDescription": "Alle deine Daten werden auf einem Homeserver gespeichert, so wie bei einem E-Mail Anbieter. Du kannst aussuchen, welchen Homeserver du benutzen willst und kannst trotzdem mit allen kommunizieren. Erfahre mehr auf https://matrix.org.", "sendingAttachment": "Anhang wird gesendet ...", "generatingVideoThumbnail": "Generiere Video-Vorschaubild ...", @@ -3144,5 +3144,7 @@ "theProcessWasCanceled": "Der Vorgang wurde abgebrochen.", "federationBaseUrl": "Basis-URL der Föderation", "clientWellKnownInformation": "Bekannte Informationen zum Client:", - "join": "Beitreten" + "join": "Beitreten", + "searchOrEnterHomeserverAddress": "Homeserver-Adresse suchen oder eingeben", + "matrixId": "Matrix ID" } From c4b008251267224f652d987d7839ec4d7d70081d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 26 Feb 2026 23:37:48 +0100 Subject: [PATCH 161/333] chore(translations): Translated using Weblate (Estonian) Currently translated at 100.0% (851 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/ --- lib/l10n/intl_et.arb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index e65f62a0..50dfc145 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -3147,5 +3147,13 @@ "theProcessWasCanceled": "Protsess on katkestatud.", "join": "Liitu", "searchOrEnterHomeserverAddress": "Otsi koduserveri aadressi või sisesta see", - "matrixId": "Matrixi kasutajatunnus" + "matrixId": "Matrixi kasutajatunnus", + "setPowerLevel": "Seadista õigusi", + "makeModerator": "Määra moderaatoriks", + "makeAdmin": "Määra peakasutajaks", + "removeModeratorRights": "Eemalda moderaatori õigused", + "removeAdminRights": "Eemalda peakasutaja õigused", + "powerLevel": "Õiguste tase", + "setPowerLevelDescription": "Õiguste tase on üks võimalusi kirjeldamaks seda, mida kasutaja saab jututoas teha ning see tavaliselt väljendub numbriga vahemikust 0 kuni 100.", + "owner": "Omanik" } From f380219a2c761ee3b1fb682252de47590dc20780 Mon Sep 17 00:00:00 2001 From: Jelv Date: Thu, 26 Feb 2026 13:02:22 +0100 Subject: [PATCH 162/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (851 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index d95f9d0d..bb31e4d8 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -453,7 +453,7 @@ "type": "String", "description": "Usage hint for the command /myroomnick" }, - "commandHint_op": "Machtsniveau van de persoon instellen (standaard: 50)", + "commandHint_op": "Rechtenniveau van de persoon instellen (standaard: 50)", "@commandHint_op": { "type": "String", "description": "Usage hint for the command /op" @@ -3146,5 +3146,13 @@ "theProcessWasCanceled": "Het proces is geannuleerd.", "join": "Deelnemen", "searchOrEnterHomeserverAddress": "Zoek of voer serveradres in", - "matrixId": "Matrix-ID" + "matrixId": "Matrix-ID", + "setPowerLevel": "Rechtenniveau instellen", + "makeModerator": "Maak moderator", + "makeAdmin": "Maak beheerder", + "removeModeratorRights": "Verwijder moderator-rechten", + "removeAdminRights": "Verwijder beheerder-rechten", + "powerLevel": "Rechtenniveau", + "setPowerLevelDescription": "Rechtenniveau's definiëren wat een persoon mag doen in deze chat en variëren meestal tussen 0 en 100.", + "owner": "Eigenaar" } From bf7a0780155035dcc84a84dc5bb54c87eaf36383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Thu, 26 Feb 2026 13:59:34 +0100 Subject: [PATCH 163/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (851 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index f7842be8..748fb231 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -3147,5 +3147,13 @@ "theProcessWasCanceled": "过程被取消。", "join": "加入", "searchOrEnterHomeserverAddress": "搜索或输入 homeserver 地址", - "matrixId": "Matrix ID" + "matrixId": "Matrix ID", + "setPowerLevel": "设置权限级别", + "makeModerator": "协管员", + "makeAdmin": "管理员", + "removeModeratorRights": "删除协管员权限", + "removeAdminRights": "删除管理员权限", + "powerLevel": "权限级别", + "setPowerLevelDescription": "权限级别定义群成员在这个聊天室中可以做什么,取值范围 0 到 100。", + "owner": "所有者" } From 5b196becaa4f6e3e8d19f94263d92188ab83628d Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Fri, 27 Feb 2026 09:40:09 +0100 Subject: [PATCH 164/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (851 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 42eb43b9..863b667b 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -3154,5 +3154,13 @@ "theProcessWasCanceled": "Prosessen ble avbrutt.", "join": "Bli med", "searchOrEnterHomeserverAddress": "Søk eller angi adresse til hjemmeserver", - "matrixId": "Matrix ID" + "matrixId": "Matrix ID", + "setPowerLevel": "Angi styrkenivå", + "makeModerator": "Gjør til moderator", + "makeAdmin": "Gjør til admin", + "removeModeratorRights": "Fjern moderator-rettigheter", + "removeAdminRights": "Fjern admin-rettigheter", + "powerLevel": "Styrkenivå", + "setPowerLevelDescription": "Styrkenivåer definerer hva et medlem har lov til å gjøre i dette rommet, og varierer vanligvis mellom 0 og 100.", + "owner": "Eier" } From cc35030846329854b190702ba7fc72beb3260b32 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 27 Feb 2026 18:24:09 +0100 Subject: [PATCH 165/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 60.3% (514 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 4689eebe..08188f1c 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1966,7 +1966,7 @@ "type": "String", "placeholders": {} }, - "unknownEvent": "Tadyant tarussint '{type]'", + "unknownEvent": "Tadyant tarussint '{type}'", "@unknownEvent": { "type": "String", "placeholders": { From a91e35bb0b3b3b6c0f9c65697055061af88eee3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Feb 2026 18:32:47 +0100 Subject: [PATCH 166/333] chore: Check if pubspec.lock is up to date in CI --- .github/workflows/integrate.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index f852c976..e3172f76 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -17,6 +17,8 @@ jobs: flutter-version: ${{ env.FLUTTER_VERSION }} cache: true - run: flutter pub get + - name: Check if pubspec.lock is up to date + run: git diff --exit-code pubspec.lock - run: flutter gen-l10n - name: Check formatting run: dart format lib/ test/ --set-exit-if-changed From 6f0ab83ffc44da4e81d0855d0c7247040dff1878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Feb 2026 18:43:53 +0100 Subject: [PATCH 167/333] chore: Move file cache to subdirectory fixes #2592 --- .../flutter_matrix_dart_sdk_database/builder.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart index 54b0d453..98ec35e0 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart @@ -62,7 +62,10 @@ Future _constructDatabase(String clientName) async { Directory? fileStorageLocation; try { - fileStorageLocation = await getTemporaryDirectory(); + final temporaryDirectory = await getTemporaryDirectory(); + fileStorageLocation = await Directory( + join(temporaryDirectory.path, 'fluffychat_download_cache'), + ).create(); } on MissingPlatformDirectoryException catch (_) { Logs().w( 'No temporary directory for file cache available on this platform.', From 746aeed770efe6f61181f980df95a889bd6b85ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Feb 2026 18:49:24 +0100 Subject: [PATCH 168/333] refactor: Do show message bubble even for big emotes --- lib/pages/chat/events/message.dart | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 3906354c..d2835e45 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -156,17 +156,12 @@ class Message extends StatelessWidget { ); final noBubble = ({ - MessageTypes.Video, - MessageTypes.Image, - MessageTypes.Sticker, - }.contains(event.messageType) && - event.fileDescription == null && - !event.redacted) || - (event.messageType == MessageTypes.Text && - event.relationshipType == null && - event.onlyEmotes && - event.numberEmotes > 0 && - event.numberEmotes <= 3); + MessageTypes.Video, + MessageTypes.Image, + MessageTypes.Sticker, + }.contains(event.messageType) && + event.fileDescription == null && + !event.redacted); if (ownMessage) { color = displayEvent.status.isError From e7116c97e200dba9841a7f1c3bd3894f4e9fcbcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Feb 2026 19:07:33 +0100 Subject: [PATCH 169/333] chore: Follow up subdirectory for file caches --- .../flutter_matrix_dart_sdk_database/builder.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart index 98ec35e0..dfcc9d61 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart @@ -65,7 +65,7 @@ Future _constructDatabase(String clientName) async { final temporaryDirectory = await getTemporaryDirectory(); fileStorageLocation = await Directory( join(temporaryDirectory.path, 'fluffychat_download_cache'), - ).create(); + ).create(recursive: true); } on MissingPlatformDirectoryException catch (_) { Logs().w( 'No temporary directory for file cache available on this platform.', From 29fcc223d63cbf5fe6bb8cbdf4b06fb1f47dd1c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Feb 2026 19:07:43 +0100 Subject: [PATCH 170/333] build: Update macos podfile.lock --- macos/Podfile.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 3bc9e932..a4387410 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -30,7 +30,7 @@ PODS: - FlutterMacOS - flutter_webrtc (1.2.0): - FlutterMacOS - - WebRTC-SDK (= 137.7151.04) + - WebRTC-SDK (= 137.7151.12) - FlutterMacOS (1.0.0) - geolocator_apple (1.2.0): - Flutter @@ -69,7 +69,7 @@ PODS: - webcrypto (0.1.1): - Flutter - FlutterMacOS - - WebRTC-SDK (137.7151.04) + - WebRTC-SDK (137.7151.12) - window_manager (0.5.0): - FlutterMacOS - window_to_front (0.0.1): @@ -192,7 +192,7 @@ SPEC CHECKSUMS: flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23 flutter_vodozemac: fd2ea9cb3e2a37beaac883a369811fbfe042fc53 flutter_web_auth_2: 7fe624ff12ddcb4c19e5dbcd56c9e9ea4899d967 - flutter_webrtc: 718eae22a371cd94e5d56aa4f301443ebc5bb737 + flutter_webrtc: 7cda18a9cd917db2f8bfcde8011804f6018a12df FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed @@ -208,7 +208,7 @@ SPEC CHECKSUMS: video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a wakelock_plus: 917609be14d812ddd9e9528876538b2263aaa03b webcrypto: a5f5eb3e375cf0a99993e207e97cdcab5c94ce2e - WebRTC-SDK: 40d4f5ba05cadff14e4db5614aec402a633f007e + WebRTC-SDK: 1762e2de812354d27a8407d1b2c532064ec39fce window_manager: b729e31d38fb04905235df9ea896128991cad99e window_to_front: 9e76fd432e36700a197dac86a0011e49c89abe0a From f0aa15843b03dd1c482ea1d214d4d3d8cfb1a30c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Feb 2026 19:08:27 +0100 Subject: [PATCH 171/333] refactor: Use more robust and performant way to detect single emoji messages --- lib/pages/chat/chat.dart | 10 ++++++++++ lib/pages/chat/chat_event_list.dart | 1 + lib/pages/chat/events/message.dart | 3 +++ lib/pages/chat/events/message_content.dart | 7 ++++--- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 4fa0d513..afe57920 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -104,6 +104,8 @@ class ChatController extends State String? activeThreadId; + late final Set bigEmojis; + late final String readMarkerEventId; String get roomId => widget.room.id; @@ -360,6 +362,14 @@ class ChatController extends State AppSettings.displayChatDetailsColumn.value, ); + bigEmojis = defaultEmojiSet.fold( + {}, + (emojis, category) => { + ...emojis, + ...(category.emoji.map((emoji) => emoji.emoji)), + }, + ); + sendingClient = Matrix.of(context).client; final lastEventThreadId = room.lastEvent?.relationshipType == RelationshipTypes.thread diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index c0523043..600d0af4 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -144,6 +144,7 @@ class ChatEventList extends StatelessWidget { controller: controller.scrollController, child: Message( event, + bigEmojis: controller.bigEmojis, animateIn: animateIn, resetAnimateIn: () { controller.animateInEventIndex = null; diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index d2835e45..a350599e 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -48,6 +48,7 @@ class Message extends StatelessWidget { final List colors; final void Function()? onExpand; final bool isCollapsed; + final Set bigEmojis; const Message( this.event, { @@ -55,6 +56,7 @@ class Message extends StatelessWidget { this.previousEvent, this.displayReadMarker = false, this.longPressSelect = false, + required this.bigEmojis, required this.onSelect, required this.onInfoTab, required this.scrollToEventId, @@ -612,6 +614,7 @@ class Message extends StatelessWidget { borderRadius, timeline: timeline, selected: selected, + bigEmojis: bigEmojis, ), if (event .hasAggregatedEvents( diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index cccd8d1a..24041eab 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -35,6 +35,7 @@ class MessageContent extends StatelessWidget { final BorderRadius borderRadius; final Timeline timeline; final bool selected; + final Set bigEmojis; const MessageContent( this.event, { @@ -45,6 +46,7 @@ class MessageContent extends StatelessWidget { required this.linkColor, required this.borderRadius, required this.selected, + required this.bigEmojis, }); Future _verifyOrRequestKey(BuildContext context) async { @@ -258,9 +260,8 @@ class MessageContent extends StatelessWidget { } final bigEmotes = - event.onlyEmotes && - event.numberEmotes > 0 && - event.numberEmotes <= 3; + !event.isRichMessage && bigEmojis.contains(event.body); + return Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: HtmlMessage( From 1fc49db3d367e144efa6eb742a2fda7074881d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 09:11:47 +0100 Subject: [PATCH 172/333] build: Update to flutter 3.41.2 --- .github/workflows/versions.env | 2 +- snap/snapcraft.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/versions.env b/.github/workflows/versions.env index 3bda5706..e5d1f0b2 100644 --- a/.github/workflows/versions.env +++ b/.github/workflows/versions.env @@ -1,2 +1,2 @@ -FLUTTER_VERSION=3.41.1 +FLUTTER_VERSION=3.41.2 JAVA_VERSION=17 diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 0f2a7ad7..18615e0f 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -53,7 +53,7 @@ platforms: parts: flutter-git: source: https://github.com/flutter/flutter.git - source-tag: 3.41.1 + source-tag: 3.41.2 source-depth: 1 plugin: nil override-build: | From 2e8b3c1e1e3e8ac362f0ffc5b2c2468a0b9ac54e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 09:14:46 +0100 Subject: [PATCH 173/333] build: Use webcrypto from github to fix 16kb --- pubspec.lock | 11 ++++++----- pubspec.yaml | 7 +++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index a2e3dc83..3edd5d9e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2210,12 +2210,13 @@ packages: source: hosted version: "3.0.3" webcrypto: - dependency: transitive + dependency: "direct overridden" description: - name: webcrypto - sha256: "6b43001c4110856ff7fa5e5e65e7b2d44bec1d8b54a4d84d5fa2c7622267c5c1" - url: "https://pub.dev" - source: hosted + path: "." + ref: master + resolved-ref: dcc7ba78c9721de56a800fda9a9e2bc759b9cad3 + url: "https://github.com/google/webcrypto.dart.git" + source: git version: "0.6.0" webdriver: dependency: transitive diff --git a/pubspec.yaml b/pubspec.yaml index a79be814..d3ebae0c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -119,3 +119,10 @@ flutter: # 2. Always link an (upstream?) issue # 3. Explain how and when this can be removed (overrides must be temporarily) dependency_overrides: + # To fix 16kb compatiblity in PlayStore. It is fixed in main branch but + # not yet published: + # https://github.com/google/webcrypto.dart/issues/207 + webcrypto: + git: + url: https://github.com/google/webcrypto.dart.git + ref: master \ No newline at end of file From 52f4e007234e5928b76a2ffcc00efb79fdf0e63a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 09:35:28 +0100 Subject: [PATCH 174/333] chore: Follow up sign in page --- lib/pages/sign_in/sign_in_page.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index 77f09df9..ace95b6c 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -28,6 +28,13 @@ class SignInPage extends StatelessWidget { final selectedHomserver = state.selectedHomeserver; return LoginScaffold( appBar: AppBar( + leading: + state.loginLoading.connectionState == ConnectionState.waiting + ? CloseButton( + onPressed: () => + viewModel.setLoginLoading(AsyncSnapshot.nothing()), + ) + : BackButton(onPressed: Navigator.of(context).pop), backgroundColor: theme.colorScheme.surface, surfaceTintColor: theme.colorScheme.surface, scrolledUnderElevation: 0, @@ -89,6 +96,9 @@ class SignInPage extends StatelessWidget { final website = server.website; return RadioListTile.adaptive( value: server, + enabled: + state.loginLoading.connectionState != + ConnectionState.waiting, radioScaleFactor: FluffyThemes.isColumnMode(context) || { From ebebd8809bd0a803718303c50882d89198ded4e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 09:57:01 +0100 Subject: [PATCH 175/333] chore: Follow up sign in page --- lib/pages/sign_in/sign_in_page.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index ace95b6c..ff790971 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -59,7 +59,9 @@ class SignInPage extends StatelessWidget { TextField( readOnly: state.publicHomeservers.connectionState == - ConnectionState.waiting, + ConnectionState.waiting || + state.loginLoading.connectionState == + ConnectionState.waiting, controller: viewModel.filterTextController, autocorrect: false, keyboardType: TextInputType.url, From 959d3da49477a49fdefbba6ee09c80eecec4acdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 10:05:36 +0100 Subject: [PATCH 176/333] chore: Give issues and PRs more time for stale --- .github/workflows/stale.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 139d9e13..86e9b260 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -9,11 +9,11 @@ jobs: steps: - uses: actions/stale@v10 with: - stale-issue-message: 'This issue is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 5 days.' - stale-pr-message: 'This PR is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 10 days.' - close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.' - close-pr-message: 'This PR was closed because it has been stalled for 10 days with no activity.' + stale-issue-message: 'This issue is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 30 days.' + stale-pr-message: 'This PR is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 30 days.' + close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity.' + close-pr-message: 'This PR was closed because it has been stalled for 30 days with no activity.' days-before-issue-stale: 365 - days-before-pr-stale: 360 - days-before-issue-close: 5 - days-before-pr-close: 10 \ No newline at end of file + days-before-pr-stale: 365 + days-before-issue-close: 30 + days-before-pr-close: 30 \ No newline at end of file From d7d104de91feb5e2fcdbe01354351e643de60e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 10:45:38 +0100 Subject: [PATCH 177/333] chore: Exempt assignees from stale --- .github/workflows/stale.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 86e9b260..eb1ab94c 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -16,4 +16,5 @@ jobs: days-before-issue-stale: 365 days-before-pr-stale: 365 days-before-issue-close: 30 - days-before-pr-close: 30 \ No newline at end of file + days-before-pr-close: 30 + exempt-all-assignees: true \ No newline at end of file From 0436f16aa9d3646690d2c680a152f92e1a206310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 11:10:50 +0100 Subject: [PATCH 178/333] fix: Edit space child button opens space details page and not space child details page --- lib/pages/chat_list/space_view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index 9a1fdd56..c2fc4437 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -326,7 +326,7 @@ class _SpaceViewState extends State { if (space == null) return; switch (action) { case SpaceChildAction.edit: - context.push('/rooms/${widget.spaceId}/details'); + context.push('/rooms/$roomId/details'); case SpaceChildAction.moveToSpace: final spacesWithPowerLevels = space.client.rooms .where( From 13bd504f17a21b32615c279a11a03a18092930cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 12:04:30 +0100 Subject: [PATCH 179/333] chore: Add matrix notify workflow --- .github/workflows/matrix_notify.yaml | 49 ++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/matrix_notify.yaml diff --git a/.github/workflows/matrix_notify.yaml b/.github/workflows/matrix_notify.yaml new file mode 100644 index 00000000..6685cad1 --- /dev/null +++ b/.github/workflows/matrix_notify.yaml @@ -0,0 +1,49 @@ +name: Matrix Notification + +on: + issues: + types: [opened] + pull_request: + types: [opened] + +jobs: + notify: + runs-on: ubuntu-latest + steps: + - name: Send notification to Matrix room + env: + HOMESERVER: ${{ secrets.MATRIX_HOMESERVER }} + ACCESS_TOKEN: ${{ secrets.MATRIX_ACCESS_TOKEN }} + ROOM_ID: ${{ secrets.MATRIX_ROOM_ID }} + EVENT_NAME: ${{ github.event_name }} + ISSUE_TITLE: ${{ github.event.issue.title }} + ISSUE_URL: ${{ github.event.issue.html_url }} + PR_TITLE: ${{ github.event.pull_request.title }} + PR_URL: ${{ github.event.pull_request.html_url }} + run: | + if [ "${EVENT_NAME}" = "issues" ]; then + PREFIX="New issue" + TITLE="${ISSUE_TITLE}" + URL="${ISSUE_URL}" + else + PREFIX="New pull request" + TITLE="${PR_TITLE}" + URL="${PR_URL}" + fi + + PLAIN="${PREFIX}: ${TITLE} - ${URL}" + HTML="${PREFIX}: ${TITLE} - ${URL}" + TXN_ID=$(date +%s%N) + + curl -s -o /dev/null -w "%{http_code}" -X PUT \ + "${HOMESERVER}/_matrix/client/v3/rooms/${ROOM_ID}/send/m.room.message/${TXN_ID}" \ + -H "Authorization: Bearer ${ACCESS_TOKEN}" \ + -H "Content-Type: application/json" \ + -d @- < Date: Sat, 28 Feb 2026 12:14:58 +0100 Subject: [PATCH 180/333] chore: Follow up matrix notify script --- .github/workflows/matrix_notify.yaml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/workflows/matrix_notify.yaml b/.github/workflows/matrix_notify.yaml index 6685cad1..8c5509d7 100644 --- a/.github/workflows/matrix_notify.yaml +++ b/.github/workflows/matrix_notify.yaml @@ -39,11 +39,4 @@ jobs: "${HOMESERVER}/_matrix/client/v3/rooms/${ROOM_ID}/send/m.room.message/${TXN_ID}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ - -d @- < Date: Sat, 28 Feb 2026 12:24:45 +0100 Subject: [PATCH 181/333] chore: Follow up matrix notify --- .github/workflows/matrix_notify.yaml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/.github/workflows/matrix_notify.yaml b/.github/workflows/matrix_notify.yaml index 8c5509d7..1fe57a97 100644 --- a/.github/workflows/matrix_notify.yaml +++ b/.github/workflows/matrix_notify.yaml @@ -18,25 +18,40 @@ jobs: EVENT_NAME: ${{ github.event_name }} ISSUE_TITLE: ${{ github.event.issue.title }} ISSUE_URL: ${{ github.event.issue.html_url }} + ISSUE_LABELS: ${{ join(github.event.issue.labels.*.name, ', ') }} + ISSUE_AUTHOR: ${{ github.event.issue.user.login }} PR_TITLE: ${{ github.event.pull_request.title }} PR_URL: ${{ github.event.pull_request.html_url }} + PR_LABELS: ${{ join(github.event.pull_request.labels.*.name, ', ') }} + PR_AUTHOR: ${{ github.event.pull_request.user.login }} run: | if [ "${EVENT_NAME}" = "issues" ]; then + EMOJI="🐛" PREFIX="New issue" TITLE="${ISSUE_TITLE}" URL="${ISSUE_URL}" + LABELS="${ISSUE_LABELS}" + AUTHOR="${ISSUE_AUTHOR}" else + EMOJI="🔀" PREFIX="New pull request" TITLE="${PR_TITLE}" URL="${PR_URL}" + LABELS="${PR_LABELS}" + AUTHOR="${PR_AUTHOR}" fi - PLAIN="${PREFIX}: ${TITLE} - ${URL}" - HTML="${PREFIX}: ${TITLE} - ${URL}" + PLAIN="${EMOJI} ${PREFIX} by ${AUTHOR}: ${TITLE} - ${URL}" + HTML="${EMOJI} ${PREFIX} by ${AUTHOR}
" + HTML="${HTML}${TITLE}" + if [ -n "${LABELS}" ]; then + HTML="${HTML}
🏷️ ${LABELS}" + fi TXN_ID=$(date +%s%N) curl -s -o /dev/null -w "%{http_code}" -X PUT \ "${HOMESERVER}/_matrix/client/v3/rooms/${ROOM_ID}/send/m.room.message/${TXN_ID}" \ -H "Authorization: Bearer ${ACCESS_TOKEN}" \ -H "Content-Type: application/json" \ - -d "{\"msgtype\":\"m.text\",\"body\":\"${PLAIN}\",\"format\":\"org.matrix.custom.html\",\"formatted_body\":\"${HTML}\"}" \ No newline at end of file + -d "$(jq -n --arg body "$PLAIN" --arg html "$HTML" \ + '{"msgtype":"m.notice","body":$body,"format":"org.matrix.custom.html","formatted_body":$html}')" \ No newline at end of file From 10a5673391de6d200679ef14f10f5e2dcda36141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 12:28:07 +0100 Subject: [PATCH 182/333] chore: Follow up matrix notify --- .github/workflows/matrix_notify.yaml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/matrix_notify.yaml b/.github/workflows/matrix_notify.yaml index 1fe57a97..501c1b87 100644 --- a/.github/workflows/matrix_notify.yaml +++ b/.github/workflows/matrix_notify.yaml @@ -26,24 +26,26 @@ jobs: PR_AUTHOR: ${{ github.event.pull_request.user.login }} run: | if [ "${EVENT_NAME}" = "issues" ]; then - EMOJI="🐛" - PREFIX="New issue" + EMOJI="📝" + PREFIX="New Issue" TITLE="${ISSUE_TITLE}" URL="${ISSUE_URL}" LABELS="${ISSUE_LABELS}" AUTHOR="${ISSUE_AUTHOR}" else EMOJI="🔀" - PREFIX="New pull request" + PREFIX="New Pull Request" TITLE="${PR_TITLE}" URL="${PR_URL}" LABELS="${PR_LABELS}" AUTHOR="${PR_AUTHOR}" fi + AUTHOR_URL="https://github.com/${AUTHOR}" PLAIN="${EMOJI} ${PREFIX} by ${AUTHOR}: ${TITLE} - ${URL}" - HTML="${EMOJI} ${PREFIX} by ${AUTHOR}
" - HTML="${HTML}${TITLE}" + HTML="

${EMOJI} ${PREFIX}

" + HTML="${HTML}${TITLE}
" + HTML="${HTML}👤 ${AUTHOR}" if [ -n "${LABELS}" ]; then HTML="${HTML}
🏷️ ${LABELS}" fi From 0de474cbe7d059526d2db3bc9f0455d17585fa5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 15:11:23 +0100 Subject: [PATCH 183/333] chore: Follow up move fab to navrail --- lib/widgets/navigation_rail.dart | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index b1671700..e9201bff 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -113,10 +113,11 @@ class SpacesNavigationRail extends StatelessWidget { }, ), ), - Padding( - padding: const EdgeInsets.all(12.0), - child: StartChatFab(), - ), + if (FluffyThemes.isColumnMode(context)) + Padding( + padding: const EdgeInsets.all(12.0), + child: StartChatFab(), + ), ], ), ); From 0061c948cdf995dc06c246f89e68031f3539dc30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 15:34:36 +0100 Subject: [PATCH 184/333] chore: Better context menu for space children --- lib/pages/chat_list/space_view.dart | 210 +++++++++++++++++----------- 1 file changed, 129 insertions(+), 81 deletions(-) diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index c2fc4437..81352560 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -12,10 +12,8 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/unread_bubble.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/utils/string_color.dart'; -import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -25,7 +23,14 @@ import 'package:fluffychat/widgets/matrix.dart'; enum AddRoomType { chat, subspace } -enum SpaceChildAction { edit, moveToSpace, removeFromSpace } +enum SpaceChildAction { + mute, + unmute, + markAsUnread, + markAsRead, + removeFromSpace, + leave, +} enum SpaceActions { settings, invite, members, leave } @@ -265,6 +270,10 @@ class _SpaceViewState extends State { BuildContext posContext, String roomId, ) async { + final client = Matrix.of(context).client; + final space = client.getRoomById(widget.spaceId); + final room = client.getRoomById(roomId); + if (space == null) return; final overlay = Overlay.of(posContext).context.findRenderObject() as RenderBox; @@ -285,85 +294,86 @@ class _SpaceViewState extends State { context: posContext, position: position, items: [ - PopupMenuItem( - value: SpaceChildAction.moveToSpace, - child: Row( - mainAxisSize: .min, - children: [ - const Icon(Icons.move_down_outlined), - const SizedBox(width: 12), - Text(L10n.of(context).moveToDifferentSpace), - ], + if (room != null && room.membership == Membership.join) ...[ + PopupMenuItem( + value: room.pushRuleState == PushRuleState.notify + ? SpaceChildAction.mute + : SpaceChildAction.unmute, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.pushRuleState == PushRuleState.notify + ? Icons.notifications_off_outlined + : Icons.notifications_on_outlined, + ), + const SizedBox(width: 12), + Text( + room.pushRuleState == PushRuleState.notify + ? L10n.of(context).muteChat + : L10n.of(context).unmuteChat, + ), + ], + ), ), - ), - PopupMenuItem( - value: SpaceChildAction.edit, - child: Row( - mainAxisSize: .min, - children: [ - const Icon(Icons.edit_outlined), - const SizedBox(width: 12), - Text(L10n.of(context).edit), - ], + PopupMenuItem( + value: room.markedUnread + ? SpaceChildAction.markAsRead + : SpaceChildAction.markAsUnread, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.markedUnread + ? Icons.mark_as_unread + : Icons.mark_as_unread_outlined, + ), + const SizedBox(width: 12), + Text( + room.isUnread + ? L10n.of(context).markAsRead + : L10n.of(context).markAsUnread, + ), + ], + ), ), - ), - PopupMenuItem( - value: SpaceChildAction.removeFromSpace, - child: Row( - mainAxisSize: .min, - children: [ - const Icon(Icons.group_remove_outlined), - const SizedBox(width: 12), - Text(L10n.of(context).removeFromSpace), - ], + PopupMenuItem( + value: SpaceChildAction.leave, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + Icons.delete_outlined, + color: Theme.of(context).colorScheme.onErrorContainer, + ), + const SizedBox(width: 12), + Text( + L10n.of(context).leave, + style: TextStyle( + color: Theme.of(context).colorScheme.onErrorContainer, + ), + ), + ], + ), + ), + ], + if (space.canChangeStateEvent(EventTypes.SpaceChild) == true) + PopupMenuItem( + value: SpaceChildAction.removeFromSpace, + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.remove), + const SizedBox(width: 12), + Text(L10n.of(context).removeFromSpace), + ], + ), ), - ), ], ); if (action == null) return; if (!mounted) return; - final space = Matrix.of(context).client.getRoomById(widget.spaceId); - if (space == null) return; switch (action) { - case SpaceChildAction.edit: - context.push('/rooms/$roomId/details'); - case SpaceChildAction.moveToSpace: - final spacesWithPowerLevels = space.client.rooms - .where( - (room) => - room.isSpace && - room.canChangeStateEvent(EventTypes.SpaceChild) && - room.id != widget.spaceId, - ) - .toList(); - final newSpace = await showModalActionPopup( - context: context, - title: L10n.of(context).space, - actions: spacesWithPowerLevels - .map( - (space) => AdaptiveModalAction( - value: space, - label: space.getLocalizedDisplayname( - MatrixLocals(L10n.of(context)), - ), - ), - ) - .toList(), - ); - if (newSpace == null) return; - final result = await showFutureLoadingDialog( - context: context, - future: () async { - await newSpace.setSpaceChild(newSpace.id); - await space.removeSpaceChild(roomId); - }, - ); - if (result.isError) return; - if (!mounted) return; - _nextBatch = null; - _loadHierarchy(); - return; - case SpaceChildAction.removeFromSpace: final consent = await showOkCancelAlertDialog( context: context, @@ -381,6 +391,31 @@ class _SpaceViewState extends State { _nextBatch = null; _loadHierarchy(); return; + case SpaceChildAction.mute: + await showFutureLoadingDialog( + context: context, + future: () => room!.setPushRuleState(PushRuleState.mentionsOnly), + ); + case SpaceChildAction.unmute: + await showFutureLoadingDialog( + context: context, + future: () => room!.setPushRuleState(PushRuleState.notify), + ); + case SpaceChildAction.markAsUnread: + await showFutureLoadingDialog( + context: context, + future: () => room!.markUnread(true), + ); + case SpaceChildAction.markAsRead: + await showFutureLoadingDialog( + context: context, + future: () => room!.markUnread(false), + ); + case SpaceChildAction.leave: + await showFutureLoadingDialog( + context: context, + future: () => room!.leave(), + ); } } @@ -580,6 +615,7 @@ class _SpaceViewState extends State { if (joinedRoom?.membership == Membership.leave) { joinedRoom = null; } + return Padding( padding: const EdgeInsets.symmetric( horizontal: 8, @@ -607,13 +643,13 @@ class _SpaceViewState extends State { onTap: joinedRoom != null ? () => widget.onChatTab(joinedRoom!) : null, - onLongPress: isAdmin + onLongPress: joinedRoom != null ? () => _showSpaceChildEditMenu( context, item.roomId, ) : null, - leading: hovered && isAdmin + leading: hovered ? SizedBox.square( dimension: avatarSize, child: IconButton( @@ -627,11 +663,13 @@ class _SpaceViewState extends State { .colorScheme .tertiaryContainer, ), - onPressed: () => - _showSpaceChildEditMenu( - context, - item.roomId, - ), + onPressed: + isAdmin || joinedRoom != null + ? () => _showSpaceChildEditMenu( + context, + item.roomId, + ) + : null, icon: const Icon(Icons.edit_outlined), ), ) @@ -676,6 +714,16 @@ class _SpaceViewState extends State { ), ), ), + if (joinedRoom != null && + joinedRoom.pushRuleState != + PushRuleState.notify) + const Padding( + padding: EdgeInsets.only(left: 4.0), + child: Icon( + Icons.notifications_off_outlined, + size: 16, + ), + ), if (joinedRoom != null) UnreadBubble(room: joinedRoom) else From 9fd85a8b584887bb134ecbce1d5b012a818feab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 28 Feb 2026 15:52:57 +0100 Subject: [PATCH 185/333] refactor: Better UX for create space children --- lib/config/routes.dart | 12 ++- lib/pages/chat_list/space_view.dart | 144 +++++++--------------------- lib/pages/new_group/new_group.dart | 36 ++++++- 3 files changed, 76 insertions(+), 116 deletions(-) diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 451b1b66..a6d2d70c 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -176,8 +176,11 @@ abstract class AppRoutes { ), GoRoute( path: 'newgroup', - pageBuilder: (context, state) => - defaultPageBuilder(context, state, const NewGroup()), + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + NewGroup(spaceId: state.uri.queryParameters['space_id']), + ), redirect: loggedOutRedirect, ), GoRoute( @@ -185,7 +188,10 @@ abstract class AppRoutes { pageBuilder: (context, state) => defaultPageBuilder( context, state, - const NewGroup(createGroupType: CreateGroupType.space), + NewGroup( + createGroupType: CreateGroupType.space, + spaceId: state.uri.queryParameters['space_id'], + ), ), redirect: loggedOutRedirect, ), diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index 81352560..72c9446a 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'package:flutter/material.dart'; @@ -15,14 +16,11 @@ import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/utils/string_color.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; -import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/matrix.dart'; -enum AddRoomType { chat, subspace } - enum SpaceChildAction { mute, unmute, @@ -59,13 +57,30 @@ class _SpaceViewState extends State { bool _noMoreRooms = false; bool _isLoading = false; + StreamSubscription? _childStateSub; + @override void initState() { _loadHierarchy(); + _childStateSub = Matrix.of(context).client.onSync.stream + .where( + (syncUpdate) => + syncUpdate.rooms?.join?[widget.spaceId]?.timeline?.events?.any( + (event) => event.type == EventTypes.SpaceChild, + ) ?? + false, + ) + .listen(_loadHierarchy); super.initState(); } - Future _loadHierarchy() async { + @override + void dispose() { + _childStateSub?.cancel(); + super.dispose(); + } + + Future _loadHierarchy([_]) async { final matrix = Matrix.of(context); final room = matrix.client.getRoomById(widget.spaceId); if (room == null) return; @@ -189,83 +204,6 @@ class _SpaceViewState extends State { } } - Future _addChatOrSubspace(AddRoomType roomType) async { - final names = await showTextInputDialog( - context: context, - title: roomType == AddRoomType.subspace - ? L10n.of(context).newSubSpace - : L10n.of(context).createGroup, - hintText: roomType == AddRoomType.subspace - ? L10n.of(context).spaceName - : L10n.of(context).groupName, - minLines: 1, - maxLines: 1, - maxLength: 64, - validator: (text) { - if (text.isEmpty) { - return L10n.of(context).pleaseChoose; - } - return null; - }, - okLabel: L10n.of(context).create, - cancelLabel: L10n.of(context).cancel, - ); - if (names == null) return; - final client = Matrix.of(context).client; - final result = await showFutureLoadingDialog( - context: context, - future: () async { - late final String roomId; - final activeSpace = client.getRoomById(widget.spaceId)!; - await activeSpace.postLoad(); - final isPublicSpace = activeSpace.joinRules == JoinRules.public; - - if (roomType == AddRoomType.subspace) { - roomId = await client.createSpace( - name: names, - visibility: isPublicSpace - ? sdk.Visibility.public - : sdk.Visibility.private, - ); - } else { - roomId = await client.createGroupChat( - enableEncryption: !isPublicSpace, - groupName: names, - preset: isPublicSpace - ? CreateRoomPreset.publicChat - : CreateRoomPreset.privateChat, - visibility: isPublicSpace - ? sdk.Visibility.public - : sdk.Visibility.private, - initialState: isPublicSpace - ? null - : [ - StateEvent( - content: { - 'join_rule': 'restricted', - 'allow': [ - { - 'room_id': widget.spaceId, - 'type': 'm.room_membership', - }, - ], - }, - type: EventTypes.RoomJoinRules, - ), - ], - ); - } - await activeSpace.setSpaceChild(roomId); - }, - ); - if (result.error != null) return; - setState(() { - _nextBatch = null; - _discoveredChildren.clear(); - }); - _loadHierarchy(); - } - Future _showSpaceChildEditMenu( BuildContext posContext, String roomId, @@ -363,9 +301,17 @@ class _SpaceViewState extends State { child: Row( mainAxisSize: .min, children: [ - const Icon(Icons.remove), + Icon( + Icons.remove, + color: Theme.of(context).colorScheme.onErrorContainer, + ), const SizedBox(width: 12), - Text(L10n.of(context).removeFromSpace), + Text( + L10n.of(context).removeFromSpace, + style: TextStyle( + color: Theme.of(context).colorScheme.onErrorContainer, + ), + ), ], ), ), @@ -389,7 +335,6 @@ class _SpaceViewState extends State { if (result.isError) return; if (!mounted) return; _nextBatch = null; - _loadHierarchy(); return; case SpaceChildAction.mute: await showFutureLoadingDialog( @@ -455,34 +400,11 @@ class _SpaceViewState extends State { ), actions: [ if (isAdmin) - PopupMenuButton( - icon: const Icon(Icons.add_outlined), - onSelected: _addChatOrSubspace, + IconButton( + icon: Icon(Icons.add_outlined), tooltip: L10n.of(context).addChatOrSubSpace, - itemBuilder: (context) => [ - PopupMenuItem( - value: AddRoomType.chat, - child: Row( - mainAxisSize: .min, - children: [ - const Icon(Icons.group_add_outlined), - const SizedBox(width: 12), - Text(L10n.of(context).newGroup), - ], - ), - ), - PopupMenuItem( - value: AddRoomType.subspace, - child: Row( - mainAxisSize: .min, - children: [ - const Icon(Icons.workspaces_outlined), - const SizedBox(width: 12), - Text(L10n.of(context).newSubSpace), - ], - ), - ), - ], + onPressed: () => + context.go('/rooms/newgroup?space_id=${widget.spaceId}'), ), PopupMenuButton( useRootNavigator: true, diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index 51202f2b..f1945e47 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -14,7 +14,12 @@ import 'package:fluffychat/widgets/matrix.dart'; class NewGroup extends StatefulWidget { final CreateGroupType createGroupType; - const NewGroup({this.createGroupType = CreateGroupType.group, super.key}); + final String? spaceId; + const NewGroup({ + this.createGroupType = CreateGroupType.group, + this.spaceId, + super.key, + }); @override NewGroupController createState() => NewGroupController(); @@ -63,7 +68,9 @@ class NewGroupController extends State { Future _createGroup() async { if (!mounted) return; - final roomId = await Matrix.of(context).client.createGroupChat( + final client = Matrix.of(context).client; + + final roomId = await client.createGroupChat( visibility: groupCanBeFound ? sdk.Visibility.public : sdk.Visibility.private, @@ -79,7 +86,9 @@ class NewGroupController extends State { ), ], ); + await _addToSpace(roomId); if (!mounted) return; + context.go('/rooms/$roomId/invite'); } @@ -104,10 +113,23 @@ class NewGroupController extends State { ), ], ); + await _addToSpace(spaceId); if (!mounted) return; context.pop(spaceId); } + Future _addToSpace(String roomId) async { + final spaceId = widget.spaceId; + if (spaceId != null) { + final activeSpace = Matrix.of(context).client.getRoomById(spaceId); + if (activeSpace == null) { + throw Exception('Can not add group to space: Space not found $spaceId'); + } + await activeSpace.postLoad(); + await activeSpace.setSpaceChild(roomId); + } + } + Future submitAction([_]) async { final client = Matrix.of(context).client; @@ -143,6 +165,16 @@ class NewGroupController extends State { } } + @override + void initState() { + final spaceId = widget.spaceId; + if (spaceId != null) { + final space = Matrix.of(context).client.getRoomById(spaceId); + publicGroup = space?.joinRules == JoinRules.public; + } + super.initState(); + } + @override Widget build(BuildContext context) => NewGroupView(this); } From f18404fb7e0db9ec92dc3070a61cebd76cd96a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 1 Mar 2026 07:13:39 +0100 Subject: [PATCH 186/333] chore: Run matrix notification in pull request target --- .github/workflows/matrix_notify.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/matrix_notify.yaml b/.github/workflows/matrix_notify.yaml index 501c1b87..fe467280 100644 --- a/.github/workflows/matrix_notify.yaml +++ b/.github/workflows/matrix_notify.yaml @@ -3,7 +3,7 @@ name: Matrix Notification on: issues: types: [opened] - pull_request: + pull_request_target: types: [opened] jobs: From 197ed41ff2b53e27e2df674b29d908a0af9b31a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Sat, 28 Feb 2026 19:26:26 +0100 Subject: [PATCH 187/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 75.3% (641 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 98 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 08188f1c..43903775 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -2089,5 +2089,101 @@ "@unknownDevice": { "type": "String", "placeholders": {} - } + }, + "skip": "Zgel", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "Tangalt taɣbalutt", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "Tallunt d tazayezt", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "spaceName": "Isem n tallunt", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "startedACall": "{senderName} yebda-d asiwel", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "pleaseEnterRecoveryKeyDescription": "Akken ad tekkseḍ asekkeṛ i yiznan-ik·im iqburen, ttxil-k·m sekcem tasarut n tririt i d-yenulfan di tɣimit tuzwirt. Tasarut-ik·im n tririt UR TELLI ARA d awal-ik·im n uɛeddi.", + "experimentalVideoCalls": "Isawalen uvidya s wudem armitan", + "emailOrUsername": "Imayl neɣ isem n useqdac", + "indexedDbErrorTitle": "Uguren n uskar uslig", + "indexedDbErrorLong": "Asekles n yizen ur yettwarmed ara deg uskar uslig s wudem amezwer.\nTtxil-k·m rzu ɣer\n - ɣef:swel\n - sbadu om.indexedDB.privateBrowsing.enabled ɣer d ilaw\nMa ulac, ur yezmir ara ad isselkem FluffyChat.", + "switchToAccount": "Ddu ɣer umiḍan {number}", + "@switchToAccount": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "nextAccount": "Amiḍan uḍfir", + "previousAccount": "Amiḍan yezrin", + "addWidget": "Rnu awiǧit", + "widgetVideo": "Avidyu", + "widgetEtherpad": "Tazmilt n uḍris", + "widgetJitsi": "Asarag Jitsi", + "widgetCustom": "Sagen", + "newGroup": "Agraw amaynut", + "newSpace": "Tallunt tamaynut", + "enterSpace": "Kcem tallunt", + "enterRoom": "Kcem taxxamt", + "allSpaces": "Akk tallunin", + "numChats": "{number} idiwenniyen", + "@numChats": { + "type": "number", + "placeholders": { + "number": { + "type": "String" + } + } + }, + "verifiedDevicesOnly": "Ibenkan yettwasneqden kan", + "optionalMessage": "(D afrayan) izen…", + "notSupportedOnThisDevice": "Ur itteddu ara deg yibenk-agi", + "approve": "Sqbel", + "enterNewChat": "Sekcem adiwenni amaynut", + "pleaseWaitUntilInvited": "Ttxil-k·m, rǧu arma yeɛreḍ-ik-id yiwen seg texxamt.", + "commandHint_logout": "Senser seg yibenk-ik·im amiran", + "commandHint_logoutall": "Senser akk ibenkan urmiden", + "displayNavigationRail": "Sken afeggag n yinig deg uziraz", + "customReaction": "Tasedmirt yugnen", + "backToMainChat": "Uɣal ɣer udiwenni agejdan", + "createSticker": "Snulfu-d ticṛeṭ n tesfift neɣ imujiten", + "useAsSticker": "Seqdec am tcṛeṭ n tesfift", + "useAsEmoji": "Seqdec am imujit", + "stickerPackNameAlreadyExists": "Isem ukemmus n tcṛeṭ n tesfift yella yakan", + "newStickerPack": "Akemmus n tcṛeṭ n tesfift", + "stickerPackName": "Isem ukemmus n tcṛeṭ n tesfift", + "skipChatBackup": "Zgel aḥraz n udiwenni", + "skipChatBackupWarning": "tetḥeqqeḍ? S war armad n weḥraz n udiwenni, tzemreḍ ad tesruḥeḍ anekcum ɣer yiznan-ik·im ma tbeddeleḍ ibenk-ik·im.", + "loadingMessages": "Asali n yiznan", + "setupChatBackup": "Sbadu aḥraz n udiwenni", + "noMoreResultsFound": "Ulac ugar n igmaḍ yettwafen", + "clientWellKnownInformation": "Talɣut yettwasnen ɣef umsaɣ:", + "advancedConfigs": "Tawila leqqayen", + "advancedConfigurations": "Tawila tinaẓiyin", + "signUpGreeting": "FluffyChat d araslemmes! Fren aqeddac anda tebɣiḍ ad ternuḍ amiḍan-ik·im, u yyaw ad neddu!", + "signInGreeting": "Tesɛiḍ yakan amiḍan deg Matriks? Anṣuf yes-k·m tikkelt niḍen! Fren aqeddac-ik·im, u tkecmeḍ.", + "theProcessWasCanceled": "Tettwasefsex ukala-nni.", + "searchOrEnterHomeserverAddress": "Nadi neɣ sekcem tansa n uqeddac agejdan", + "setPowerLevel": "Sbadu aswir n tezmert", + "removeAdminRights": "Kkes izerfan n unedbal", + "powerLevel": "Aswir n tezmert" } From ab8574590d768a71bfe0815ec36f7c896836592e Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Fri, 27 Feb 2026 21:21:13 +0100 Subject: [PATCH 188/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 75.3% (641 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 185 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 184 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 43903775..821733ac 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -2185,5 +2185,188 @@ "searchOrEnterHomeserverAddress": "Nadi neɣ sekcem tansa n uqeddac agejdan", "setPowerLevel": "Sbadu aswir n tezmert", "removeAdminRights": "Kkes izerfan n unedbal", - "powerLevel": "Aswir n tezmert" + "powerLevel": "Aswir n tezmert", + "help": "Tallelt", + "@help": { + "type": "String", + "placeholders": {} + }, + "privacy": "Tabaḍnit", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "reason": "Taɣẓint", + "@reason": { + "type": "String", + "placeholders": {} + }, + "recording": "Asekles", + "@recording": { + "type": "String", + "placeholders": {} + }, + "register": "Jerred", + "@register": { + "type": "String", + "placeholders": {} + }, + "reject": "Aggi", + "@reject": { + "type": "String", + "placeholders": {} + }, + "search": "Nadi", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "Taɣellist", + "@security": { + "type": "String", + "placeholders": {} + }, + "settings": "Iɣewwaren", + "@settings": { + "type": "String", + "placeholders": {} + }, + "share": "Bḍu", + "@share": { + "type": "String", + "placeholders": {} + }, + "unpin": "Kkes anṭaḍ", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "knock": "Sqeṛbeb", + "knocking": "Sqeṛbeb", + "select": "Fren", + "gallery": "Timidelt", + "files": "Ifuyla", + "transparent": "Afrawan", + "discover": "Snirem", + "changelog": "Aɣmis n ibeddilen", + "notificationRuleCall": "Asiwel", + "notificationRuleMessage": "Izen", + "notificationRuleEncrypted": "Yettwawgelhen", + "notificationRuleJitsi": "Jitsi", + "more": "Ugar", + "logs": "Iɣmisen", + "join": "Ttekki", + "owner": "Amli", + "changePassword": "Asnifel n wawal n uɛeddi", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "commandHint_send": "Azen aḍris", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "addAccount": "Rnu amiḍan", + "directChat": "Adiwenni usrid", + "redactMessage": "Kkes izen", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "requestPermission": "Suter tasiregt", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "saveFile": "Sekles afaylu", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "Tasarut n tririt", + "setStatus": "Sbadu addad", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "Bḍu adig", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "showPassword": "Sken-d awal n uɛeddi", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "deviceKeys": "Tisura n yibenk:", + "learnMore": "Issin ugar", + "groupName": "Isem n ugraw", + "startConversation": "Bdu adiwenni", + "newPassword": "Awal n uɛeddi amaynut", + "publicLink": "Aseɣwen azayaz", + "thisDevice": "Ibenk-a:", + "userRole": "Tamlilt n useqdac", + "searchMore": "Nadi ugar…", + "allDevices": "Akk ibenkan", + "saveChanges": "Sekles ibeddilen", + "baseUrl": "URL n taffa", + "identityServer": "Aseqdac n tmagit:", + "versionWithNumber": "Lqem: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "signIn": "Qqen", + "matrixId": "Asulay ID Matrix", + "makeAdmin": "Err-it d anedbal", + "openInMaps": "Ldi-t deg maps", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "singlesignon": "Asesteb asuf", + "@singlesignon": { + "type": "String", + "placeholders": {} + }, + "encryptThisChat": "Wgelhen adiwenni-a", + "searchForUsers": "Nadi iseqdacen…", + "createNewAddress": "Snulfu-d tansa tamaynut", + "adminLevel": "{level} - Tadbelt", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "loginWithMatrixId": "Tuqqna s usulay ID n Matrix", + "calculatingFileSize": "Asiḍen n tiddi n ufaylu...", + "shareKeysWith": "Bḍu tisura akked…", + "takeAPhoto": "Ṭṭef tawlaft", + "recordAVideo": "Sekles tavidyut", + "createNewAccount": "Snulfu-d amiḍan amaynut", + "pleaseEnterYourPassword": "Ma ulac aɣilif, sekcem-d awal-ik n uɛeddi", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "doNotShowAgain": "Ur t-id-sskan ara tikkelt nniḍen", + "passwordsDoNotMatch": "Awalen n uɛeddi mgarraden", + "searchIn": "Nadi deg udiwenni \"{chat}\"...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + } } From a0ad140262bc6e5af19e6f5e262ecdbb3199d7e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 1 Mar 2026 07:40:29 +0100 Subject: [PATCH 189/333] build: Remove libssl-dev dependency for linux --- .github/workflows/integrate.yaml | 2 +- .github/workflows/release.yaml | 2 +- snap/snapcraft.yaml | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index e3172f76..824b0c75 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -86,7 +86,7 @@ jobs: - uses: actions/checkout@v6 - run: cat .github/workflows/versions.env >> $GITHUB_ENV - name: Install dependencies - run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y + run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y - name: Install Flutter run: | git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 18741331..09275b7e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -109,7 +109,7 @@ jobs: - uses: actions/checkout@v6 - run: cat .github/workflows/versions.env >> $GITHUB_ENV - name: Install dependencies - run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y + run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y - name: Install Flutter run: | git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 18615e0f..ca9a0a16 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -90,7 +90,6 @@ parts: build-packages: - libsecret-1-dev - libjsoncpp-dev - - libssl-dev - curl - libpciaccess-dev build-snaps: From 2cba2dde8318f1c09416f0504d705c1c2bf28482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Sun, 1 Mar 2026 19:08:52 +0100 Subject: [PATCH 190/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 77.4% (659 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 82 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 821733ac..56e01d1f 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -2368,5 +2368,87 @@ "type": "String" } } + }, + "enableMultiAccounts": "(armitan) Rmed aget n yimiḍanen deg yibenk-agi", + "hideMemberChangesInPublicChatsBody": "Ur d-skan ara deg yizirig n wakud ma yella win i d-yernan neɣ yeffɣen adiwenni azayez i usnerni n tɣara n tɣuṛi.", + "pleaseEnter4Digits": "Ttxil-k·m sekcem 4 n wuṭṭunen neɣ eǧǧ-it d ilem akken ad tsenseḍ asekkeṛ n usnas.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterRecoveryKey": "Ttxil-k·m sekcem tasarut-ik·im n tririt:", + "pleaseEnterYourPin": "Ttxil-k·m sekcem tangalt-ik·im pin", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "Ma ulac aɣilif sekcem isem n useqdac", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "Ma ulac aɣilif, ḍfeṛ iwellihen n usmel web sakin sit ɣef uḍfir.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "Tixxamin tizuyaz", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} yugi tinnubga-nni", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "rejoin": "ales attekki tikkelt nniḍen", + "@rejoin": { + "type": "String", + "placeholders": {} + }, + "reportMessage": "Mmel-d izen", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "Taxxamt tettwaleqqem", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "Lqem n texxamt", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "separateChatTypes": "Brez Idiwenniyen usriden akked igrawen", + "@separateChatTypes": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "Sbadu aglam n udiwenni", + "setInvitationLink": "Sbadu aseɣwen n tinubga", + "@setInvitationLink": { + "type": "String", + "placeholders": {} + }, + "setPermissionsLevel": "Sbadu aswir n tsirag", + "@setPermissionsLevel": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} yebḍa adig-is", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } } } From 6319dd101ca257ca168887eb4881a7a007e32826 Mon Sep 17 00:00:00 2001 From: Temuri Doghonadze Date: Mon, 2 Mar 2026 01:55:15 +0100 Subject: [PATCH 191/333] chore(translations): Translated using Weblate (Georgian) Currently translated at 17.6% (150 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ka/ --- lib/l10n/intl_ka.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/intl_ka.arb b/lib/l10n/intl_ka.arb index 0275d6c6..c885a04a 100644 --- a/lib/l10n/intl_ka.arb +++ b/lib/l10n/intl_ka.arb @@ -325,7 +325,7 @@ } } }, - "areGuestsAllowedToJoin": "შეუძლიათ თუ არა სტუმარ მომხმარებლებს გაწევრიანება", + "areGuestsAllowedToJoin": "შეუძლიათ სტუმარ მომხმარებლებს გაწევრება?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} From 644601ea937c42d8e6bfcde2813b6d96d67ea7da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 1 Mar 2026 15:06:02 +0100 Subject: [PATCH 192/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (851 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index 03c27b96..caae5d78 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -3153,5 +3153,13 @@ "theProcessWasCanceled": "Cuireadh an próiseas ar ceal.", "join": "Téigh i", "searchOrEnterHomeserverAddress": "Cuardaigh nó cuir isteach seoladh an fhreastalaí baile", - "matrixId": "Aitheantas Maitrís" + "matrixId": "Aitheantas Maitrís", + "setPowerLevel": "Socraigh leibhéal cumhachta", + "makeModerator": "Déan modhnóir", + "makeAdmin": "Déan riarthóir", + "removeModeratorRights": "Bain cearta an mhodhnóra", + "removeAdminRights": "Bain cearta riarthóra", + "powerLevel": "Leibhéal cumhachta", + "setPowerLevelDescription": "Sainmhíníonn leibhéil chumhachta cad a cheadaítear do bhall a dhéanamh sa seomra seo agus is gnách go mbíonn siad idir 0 agus 100.", + "owner": "Úinéir" } From f6a96617c7d92569b41e10bf6aef84df7886b3c2 Mon Sep 17 00:00:00 2001 From: Philip Fritzsche Date: Mon, 2 Mar 2026 16:10:33 +0100 Subject: [PATCH 193/333] fix: Fix formatting of messages with newlines Newlines were previously not formatted correctly in HTML/markdown messages. Formatting is of newlines is implemented in the matrix-dart-sdk, but was explicitly disabled when creating the matrix Client object. This fixes formatting by removing the parameter from the client config, causing the client to follow the expected, default behavior. This only affects outgoing new messages, both old wrongly formatted messages and new messages are rendered correctly in FluffyChat. New messages are now also correctly formatted in other clients. --- lib/utils/client_manager.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 817727e9..856a907a 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -138,7 +138,6 @@ abstract class ClientManager { (share) => share.name == shareKeysWith, ) ?? ShareKeysWith.all, - convertLinebreaksInFormatting: false, onSoftLogout: enableSoftLogout ? (client) => client.refreshAccessToken() : null, From 5053dd7978a78760a51cd480be83b080d9b7aa01 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Tue, 3 Mar 2026 16:55:45 +0100 Subject: [PATCH 194/333] chore: Set operations per run to 1000 --- .github/workflows/stale.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index eb1ab94c..4d7ecce8 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -17,4 +17,5 @@ jobs: days-before-pr-stale: 365 days-before-issue-close: 30 days-before-pr-close: 30 - exempt-all-assignees: true \ No newline at end of file + exempt-all-assignees: true + operations-per-run: 1000 \ No newline at end of file From c360abb0fca538d14ad384daf80fad3806e4ad2a Mon Sep 17 00:00:00 2001 From: krille-chan Date: Tue, 3 Mar 2026 16:57:40 +0100 Subject: [PATCH 195/333] chore: Check conventional commits in CI --- .github/workflows/integrate.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index e3172f76..ef9fdd6a 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -9,6 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 + - uses: webiny/action-conventional-commits@v1.3.1 - run: ./scripts/generate-locale-config.sh - run: git diff --exit-code - run: cat .github/workflows/versions.env >> $GITHUB_ENV From 652152481c3aef691fa89d98c706575129542d80 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Tue, 3 Mar 2026 17:07:20 +0100 Subject: [PATCH 196/333] chore: Set erase flag true on account deactivation --- lib/pages/settings_security/settings_security.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pages/settings_security/settings_security.dart b/lib/pages/settings_security/settings_security.dart index f73a0e18..25c17db2 100644 --- a/lib/pages/settings_security/settings_security.dart +++ b/lib/pages/settings_security/settings_security.dart @@ -79,7 +79,9 @@ class SettingsSecurityController extends State { delay: false, future: () => Matrix.of(context).client.uiaRequestBackground( - (auth) => Matrix.of(context).client.deactivateAccount(auth: auth), + (auth) => Matrix.of( + context, + ).client.deactivateAccount(auth: auth, erase: true), ), ); From 1a8a5c6187bc667f105df701087ae7a9d836ee88 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Tue, 3 Mar 2026 17:08:42 +0100 Subject: [PATCH 197/333] chore: Follow up seen by row --- lib/pages/chat/seen_by_row.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart index d6800883..65ecf6cd 100644 --- a/lib/pages/chat/seen_by_row.dart +++ b/lib/pages/chat/seen_by_row.dart @@ -26,7 +26,11 @@ class SeenByRow extends StatelessWidget { builder: (context, asyncSnapshot) { final seenByUsers = event.receipts .map((r) => r.user) - .where((user) => user.id != event.room.client.userID) + .where( + (user) => + user.id != event.room.client.userID && + user.id != event.senderId, + ) .toList(); return Container( width: double.infinity, From 95aca9f9d781db71485caa3bd1ff1b9f0de982c1 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Tue, 3 Mar 2026 17:11:09 +0100 Subject: [PATCH 198/333] chore: Adjust paddings --- lib/pages/chat/chat_input_row.dart | 2 +- lib/pages/chat/recording_input_row.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index 90173d23..eb92c55c 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -129,7 +129,7 @@ class ChatInputRow extends StatelessWidget { : const SizedBox.shrink(), ] : [ - const SizedBox(width: 4), + const SizedBox(width: 8), AnimatedContainer( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, diff --git a/lib/pages/chat/recording_input_row.dart b/lib/pages/chat/recording_input_row.dart index 5e4686e5..b5b66706 100644 --- a/lib/pages/chat/recording_input_row.dart +++ b/lib/pages/chat/recording_input_row.dart @@ -26,7 +26,7 @@ class RecordingInputRow extends StatelessWidget { crossAxisAlignment: .center, mainAxisAlignment: .spaceBetween, children: [ - const SizedBox(width: 4), + const SizedBox(width: 8), Container( alignment: .center, width: 48, From 23f97df1f1b1d410360edde649823a88e9f8e963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 24 Oct 2025 15:43:41 +0200 Subject: [PATCH 199/333] build: Add maestro based integration tests --- .github/workflows/integrate.yaml | 144 +++++++++++- integration_test/app_test.dart | 173 -------------- integration_test/data/integration_users.env | 5 + .../extensions/default_flows.dart | 165 ------------- integration_test/extensions/wait_for.dart | 49 ---- integration_test/login.yaml | 31 +++ integration_test/users.dart | 36 --- lib/main.dart | 4 + lib/pages/bootstrap/bootstrap_dialog.dart | 52 +++-- .../chat_list/client_chooser_button.dart | 29 ++- lib/pages/settings/settings.dart | 1 + lib/pages/sign_in/sign_in_page.dart | 221 +++++++++--------- .../view_model/sign_in_view_model.dart | 13 +- ...ntegration-create-environment-variables.sh | 6 - scripts/integration-prepare-homeserver.sh | 57 +---- 15 files changed, 353 insertions(+), 633 deletions(-) delete mode 100644 integration_test/app_test.dart create mode 100644 integration_test/data/integration_users.env delete mode 100644 integration_test/extensions/default_flows.dart delete mode 100644 integration_test/extensions/wait_for.dart create mode 100644 integration_test/login.yaml delete mode 100644 integration_test/users.dart delete mode 100755 scripts/integration-create-environment-variables.sh diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index e3172f76..6d0d25fa 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -44,9 +44,11 @@ jobs: - run: flutter test build_debug_apk: + needs: [ code_tests ] runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 + - uses: ./.github/actions/free_up_space - run: cat .github/workflows/versions.env >> $GITHUB_ENV - uses: actions/setup-java@v5 with: @@ -56,12 +58,27 @@ jobs: with: flutter-version: ${{ env.FLUTTER_VERSION }} cache: true - - uses: ./.github/actions/free_up_space - uses: moonrepo/setup-rust@v1 - - run: flutter pub get - - run: flutter build apk --debug --target-platform android-arm64 + with: + cache: true + - name: Cache Gradle + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: gradle-${{ runner.os }}- + - run: ./scripts/add-firebase-messaging.sh + - run: flutter build apk --debug --target-platform android-x64 + - name: Upload Debug APK + uses: actions/upload-artifact@v5 + with: + name: debug-apk-x64 + path: build/app/outputs/flutter-apk/app-debug.apk build_debug_web: + needs: [ code_tests ] runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 @@ -75,9 +92,15 @@ jobs: - run: flutter pub get - name: Prepare web run: ./scripts/prepare-web.sh - - run: flutter build web + - run: flutter build web --dart-define=WITH_SEMANTICS=true + - name: Upload Web Build + uses: actions/upload-artifact@v5 + with: + name: Web Build + path: build/web build_debug_linux: + needs: [ code_tests ] strategy: matrix: arch: [ x64, arm64 ] @@ -96,6 +119,7 @@ jobs: - run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }} build_debug_ios: + needs: [ code_tests ] runs-on: macos-15 steps: - uses: actions/checkout@v6 @@ -114,3 +138,115 @@ jobs: sed -i '' 's,//,,g' lib/utils/background_push.dart - run: flutter pub get - run: flutter build ios --no-codesign + + integration_test: + runs-on: ubuntu-latest + timeout-minutes: 60 + needs: [ build_debug_apk ] + strategy: + matrix: + api-level: [34] + env: + ANDROID_USER_HOME: /home/runner/.android + ANDROID_EMULATOR_HOME: /home/runner/.android + ANDROID_AVD_HOME: /home/runner/.android/avd + AVD_CONFIG_PATH: "~/.android/avd/test.avd/config.ini" + steps: + - uses: actions/checkout@v6 + - uses: actions/download-artifact@v7 + with: + name: debug-apk-x64 + path: . + - uses: ./.github/actions/free_up_space + # https://github.blog/changelog/2023-02-23-hardware-accelerated-android-virtualization-on-actions-windows-and-linux-larger-hosted-runners/ + - name: Enable KVM group perms + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: ~/.android/* + key: avd-${{ matrix.api-level }}-integration_docker + - name: create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b + with: + api-level: ${{ matrix.api-level }} + target: google_apis + arch: x86_64 + cores: 16 + ndk: 28.2.13676358 + force-avd-creation: false + disk-size: 4096M + ram-size: 4096M + sdcard-path-or-size: 4096M + emulator-options: -no-window -wipe-data -accel on -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + script: | + cat ${{ env.AVD_CONFIG_PATH }} + + sed -i.bak 's/hw.lcd.density = .*/hw.lcd.density=420/' ${{ env.AVD_CONFIG_PATH }} + sed -i.bak 's/hw.lcd.height = .*/hw.lcd.height=1920/' ${{ env.AVD_CONFIG_PATH }} + sed -i.bak 's/hw.lcd.width = .*/hw.lcd.width=1080/' ${{ env.AVD_CONFIG_PATH }} + + if ! grep -q "hw.lcd.density" ${{ env.AVD_CONFIG_PATH }} && echo "hw.lcd.density = 420" >> ${{ env.AVD_CONFIG_PATH }}; then :; fi + if ! grep -q "hw.lcd.height" ${{ env.AVD_CONFIG_PATH }} && echo "hw.lcd.height = 1920" >> ${{ env.AVD_CONFIG_PATH }}; then :; fi + if ! grep -q "hw.lcd.width" ${{ env.AVD_CONFIG_PATH }} && echo "hw.lcd.width = 1080" >> ${{ env.AVD_CONFIG_PATH }}; then :; fi + + echo "Emulator settings (${{ env.AVD_CONFIG_PATH }})" + cat ${{ env.AVD_CONFIG_PATH }} + echo "Generated AVD snapshot for caching." + - uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + cache: true + - uses: remarkablemark/setup-maestro-cli@v1 + - name: Load integration test env + run: cat integration_test/data/integration_users.env >> $GITHUB_ENV + - name: Prepare Homeserver + run: | + docker run -d --name synapse --tmpfs /data \ + --volume="$(pwd)/integration_test/synapse/data/homeserver.yaml":/data/homeserver.yaml:rw \ + --volume="$(pwd)/integration_test/synapse/data/localhost.log.config":/data/localhost.log.config:rw \ + -p 80:80 matrixdotorg/synapse:latest + while ! curl -XGET "http://$HOMESERVER/_matrix/client/v3/login" >/dev/null 2>/dev/null; do + echo "Waiting for homeserver to be available... (GET http://$HOMESERVER/_matrix/client/v3/login)" + sleep 2 + done + + echo "Homeserver is online!" + + # create users + curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER1_NAME\", \"password\":\"$USER1_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" + curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER2_NAME\", \"password\":\"$USER2_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" + + - name: Integration tests + id: integration_tests + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: ${{ matrix.api-level }} + target: google_apis + arch: x86_64 + cores: 16 + ndk: 28.2.13676358 + force-avd-creation: false + disk-size: 4096M + ram-size: 4096M + sdcard-path-or-size: 4096M + emulator-options: -no-snapshot-save -no-window -wipe-data -accel on -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + script: | + flutter run --use-application-binary=$PWD/app-debug.apk > flutter_logs.txt 2>&1 & + FLUTTER_PID=$! + sleep 10 + maestro test integration_test/login.yaml --env HOMESERVER=10.0.2.2 --env USER1_NAME=${USER1_NAME} --env USER1_PW=${USER1_PW} + kill $FLUTTER_PID 2>/dev/null || true + cp flutter_logs.txt ~/.maestro/tests/ + - name: Upload Flutter and Maestro logs + if: failure() + uses: actions/upload-artifact@v5 + with: + name: maestro-logs + path: ~/.maestro/tests + if-no-files-found: ignore \ No newline at end of file diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart deleted file mode 100644 index cb5db3cc..00000000 --- a/integration_test/app_test.dart +++ /dev/null @@ -1,173 +0,0 @@ -import 'package:fluffychat/pages/chat/chat_view.dart'; -import 'package:fluffychat/pages/chat_list/chat_list_body.dart'; -import 'package:fluffychat/pages/chat_list/search_title.dart'; -import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart'; - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:integration_test/integration_test.dart'; - -import 'package:fluffychat/main.dart' as app; -import 'package:shared_preferences/shared_preferences.dart'; - -import 'extensions/default_flows.dart'; -import 'extensions/wait_for.dart'; -import 'users.dart'; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - group('Integration Test', () { - setUpAll(() { - // this random dialog popping up is super hard to cover in tests - SharedPreferences.setMockInitialValues({ - 'chat.fluffy.show_no_google': false, - }); - }); - - testWidgets('Start app, login and logout', (WidgetTester tester) async { - app.main(); - await tester.ensureAppStartedHomescreen(); - await tester.ensureLoggedOut(); - }); - - testWidgets('Login again', (WidgetTester tester) async { - app.main(); - await tester.ensureAppStartedHomescreen(); - }); - - testWidgets('Start chat and send message', (WidgetTester tester) async { - app.main(); - await tester.ensureAppStartedHomescreen(); - await tester.waitFor(find.byType(TextField)); - await tester.enterText(find.byType(TextField), Users.user2.name); - await tester.pumpAndSettle(); - - await tester.scrollUntilVisible( - find.text('Chats').first, - 500, - scrollable: find - .descendant( - of: find.byType(ChatListViewBody), - matching: find.byType(Scrollable), - ) - .first, - ); - await tester.pumpAndSettle(); - await tester.tap(find.text('Chats')); - await tester.pumpAndSettle(); - await tester.waitFor(find.byType(SearchTitle)); - await tester.pumpAndSettle(); - - await tester.scrollUntilVisible( - find.text(Users.user2.name).first, - 500, - scrollable: find - .descendant( - of: find.byType(ChatListViewBody), - matching: find.byType(Scrollable), - ) - .first, - ); - await tester.pumpAndSettle(); - await tester.tap(find.text(Users.user2.name).first); - - try { - await tester.waitFor( - find.byType(ChatView), - timeout: const Duration(seconds: 5), - ); - } catch (_) { - // in case the homeserver sends the username as search result - if (find.byIcon(Icons.send_outlined).evaluate().isNotEmpty) { - await tester.tap(find.byIcon(Icons.send_outlined)); - await tester.pumpAndSettle(); - } - } - - await tester.waitFor(find.byType(ChatView)); - await tester.enterText(find.byType(TextField).last, 'Test'); - await tester.pumpAndSettle(); - try { - await tester.waitFor(find.byIcon(Icons.send_outlined)); - await tester.tap(find.byIcon(Icons.send_outlined)); - } catch (_) { - await tester.testTextInput.receiveAction(TextInputAction.done); - } - await tester.pumpAndSettle(); - await tester.waitFor(find.text('Test')); - await tester.pumpAndSettle(); - }); - - testWidgets('Spaces', (tester) async { - app.main(); - await tester.ensureAppStartedHomescreen(); - - await tester.waitFor(find.byTooltip('Show menu')); - await tester.tap(find.byTooltip('Show menu')); - await tester.pumpAndSettle(); - - await tester.waitFor(find.byIcon(Icons.workspaces_outlined)); - await tester.tap(find.byIcon(Icons.workspaces_outlined)); - await tester.pumpAndSettle(); - - await tester.waitFor(find.byType(TextField)); - await tester.enterText(find.byType(TextField).last, 'Test Space'); - await tester.pumpAndSettle(); - - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); - - await tester.waitFor(find.text('Invite contact')); - - await tester.tap(find.text('Invite contact')); - await tester.pumpAndSettle(); - - await tester.waitFor( - find.descendant( - of: find.byType(InvitationSelectionView), - matching: find.byType(TextField), - ), - ); - await tester.enterText( - find.descendant( - of: find.byType(InvitationSelectionView), - matching: find.byType(TextField), - ), - Users.user2.name, - ); - - await Future.delayed(const Duration(milliseconds: 250)); - await tester.testTextInput.receiveAction(TextInputAction.done); - - await Future.delayed(const Duration(milliseconds: 1000)); - await tester.pumpAndSettle(); - - await tester.tap( - find - .descendant( - of: find.descendant( - of: find.byType(InvitationSelectionView), - matching: find.byType(ListTile), - ), - matching: find.text(Users.user2.name), - ) - .last, - ); - await tester.pumpAndSettle(); - - await tester.waitFor(find.maybeUppercaseText('Yes')); - await tester.tap(find.maybeUppercaseText('Yes')); - await tester.pumpAndSettle(); - - await tester.tap(find.byTooltip('Back')); - await tester.pumpAndSettle(); - - await tester.waitFor(find.text('Load 2 more participants')); - await tester.tap(find.text('Load 2 more participants')); - await tester.pumpAndSettle(); - - expect(find.text(Users.user2.name), findsOneWidget); - }); - }); -} diff --git a/integration_test/data/integration_users.env b/integration_test/data/integration_users.env new file mode 100644 index 00000000..455ce847 --- /dev/null +++ b/integration_test/data/integration_users.env @@ -0,0 +1,5 @@ +HOMESERVER=localhost +USER1_NAME=alice +USER1_PW=AliceInWonderland +USER2_NAME=bob +USER2_PW=JoWirSchaffenDas \ No newline at end of file diff --git a/integration_test/extensions/default_flows.dart b/integration_test/extensions/default_flows.dart deleted file mode 100644 index 051d14b8..00000000 --- a/integration_test/extensions/default_flows.dart +++ /dev/null @@ -1,165 +0,0 @@ -import 'dart:developer'; - -import 'package:fluffychat/pages/chat_list/chat_list_body.dart'; -import 'package:fluffychat/pages/intro/intro_page.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import '../users.dart'; -import 'wait_for.dart'; - -extension DefaultFlowExtensions on WidgetTester { - Future login() async { - final tester = this; - - await tester.pumpAndSettle(); - - await tester.waitFor(find.text('Let\'s start')); - - expect(find.text('Let\'s start'), findsOneWidget); - - final input = find.byType(TextField); - - expect(input, findsOneWidget); - - // getting the placeholder in place - await tester.tap(find.byIcon(Icons.search)); - await tester.pumpAndSettle(); - await tester.enterText(input, homeserver); - await tester.pumpAndSettle(); - await tester.testTextInput.receiveAction(TextInputAction.done); - await tester.pumpAndSettle(); - - // in case registration is allowed - // try { - await Future.delayed(const Duration(milliseconds: 50)); - - await tester.scrollUntilVisible( - find.text('Login'), - 500, - scrollable: find.descendant( - of: find.byKey(const Key('ConnectPageListView')), - matching: find.byType(Scrollable).first, - ), - ); - await tester.pumpAndSettle(); - - await tester.tap(find.text('Login')); - await tester.pumpAndSettle(); - /*} catch (e) { - log('Registration is not allowed. Proceeding with login...'); - }*/ - await tester.pumpAndSettle(); - - await Future.delayed(const Duration(milliseconds: 50)); - - final inputs = find.byType(TextField); - - await tester.enterText(inputs.first, Users.user1.name); - await tester.enterText(inputs.last, Users.user1.password); - await tester.pumpAndSettle(); - await tester.testTextInput.receiveAction(TextInputAction.done); - - try { - // pumpAndSettle does not work in here as setState is called - // asynchronously - await tester.waitFor( - find.byType(LinearProgressIndicator), - timeout: const Duration(milliseconds: 1500), - skipPumpAndSettle: true, - ); - } catch (_) { - // in case the input action does not work on the desired platform - if (find.text('Login').evaluate().isNotEmpty) { - await tester.tap(find.text('Login')); - } - } - - try { - await tester.pumpAndSettle(); - } catch (_) { - // may fail because of ongoing animation below dialog - } - - await tester.waitFor( - find.byType(ChatListViewBody), - skipPumpAndSettle: true, - ); - } - - /// ensure PushProvider check passes - Future acceptPushWarning() async { - final tester = this; - - final matcher = find.maybeUppercaseText('Do not show again'); - - try { - await tester.waitFor(matcher, timeout: const Duration(seconds: 5)); - - // the FCM push error dialog to be handled... - await tester.tap(matcher); - await tester.pumpAndSettle(); - } catch (_) {} - } - - Future ensureLoggedOut() async { - final tester = this; - await tester.pumpAndSettle(); - if (find.byType(ChatListViewBody).evaluate().isNotEmpty) { - await tester.tap(find.byTooltip('Show menu')); - await tester.pumpAndSettle(); - await tester.tap(find.text('Settings')); - await tester.pumpAndSettle(); - await tester.scrollUntilVisible( - find.text('Account'), - 500, - scrollable: find.descendant( - of: find.byKey(const Key('SettingsListViewContent')), - matching: find.byType(Scrollable), - ), - ); - await tester.pumpAndSettle(); - await tester.tap(find.text('Logout')); - await tester.pumpAndSettle(); - await tester.tap(find.maybeUppercaseText('Yes')); - await tester.pumpAndSettle(); - } - } - - Future ensureAppStartedHomescreen({ - Duration timeout = const Duration(seconds: 20), - }) async { - final tester = this; - await tester.pumpAndSettle(); - - final homeserverPickerFinder = find.byType(IntroPage); - final chatListFinder = find.byType(ChatListViewBody); - - final end = DateTime.now().add(timeout); - - log( - 'Waiting for HomeserverPicker or ChatListViewBody...', - name: 'Test Runner', - ); - do { - if (DateTime.now().isAfter(end)) { - throw Exception( - 'Timed out waiting for HomeserverPicker or ChatListViewBody', - ); - } - - await pumpAndSettle(); - await Future.delayed(const Duration(milliseconds: 100)); - } while (homeserverPickerFinder.evaluate().isEmpty && - chatListFinder.evaluate().isEmpty); - - if (homeserverPickerFinder.evaluate().isNotEmpty) { - log('Found HomeserverPicker, performing login.', name: 'Test Runner'); - await tester.login(); - } else { - log('Found ChatListViewBody, skipping login.', name: 'Test Runner'); - } - - await tester.acceptPushWarning(); - } -} diff --git a/integration_test/extensions/wait_for.dart b/integration_test/extensions/wait_for.dart deleted file mode 100644 index cfd9d649..00000000 --- a/integration_test/extensions/wait_for.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -/// Workaround for https://github.com/flutter/flutter/issues/88765 -extension WaitForExtension on WidgetTester { - Future waitFor( - Finder finder, { - Duration timeout = const Duration(seconds: 20), - bool skipPumpAndSettle = false, - }) async { - final end = DateTime.now().add(timeout); - - do { - if (DateTime.now().isAfter(end)) { - throw Exception('Timed out waiting for $finder'); - } - - if (!skipPumpAndSettle) { - await pumpAndSettle(); - } - await Future.delayed(const Duration(milliseconds: 100)); - } while (finder.evaluate().isEmpty); - } -} - -extension MaybeUppercaseFinder on CommonFinders { - /// On Android some button labels are in uppercase while on iOS they - /// are not. This method tries both. - Finder maybeUppercaseText( - String text, { - bool findRichText = false, - bool skipOffstage = true, - }) { - try { - final finder = find.text( - text.toUpperCase(), - findRichText: findRichText, - skipOffstage: skipOffstage, - ); - expect(finder, findsOneWidget); - return finder; - } catch (_) { - return find.text( - text, - findRichText: findRichText, - skipOffstage: skipOffstage, - ); - } - } -} diff --git a/integration_test/login.yaml b/integration_test/login.yaml new file mode 100644 index 00000000..d32c255a --- /dev/null +++ b/integration_test/login.yaml @@ -0,0 +1,31 @@ +appId: chat.fluffy.fluffychat +--- +- assertVisible: "Sign in" +- tapOn: "Sign in" +- tapOn: "Search or enter homeserver address" +- inputText: "http://${HOMESERVER}" +- pressKey: "back" +- tapOn: + id: "homeserver_tile_0" +- tapOn: + id: "connect_to_homeserver_button" +- assertVisible: "Log in to http://${HOMESERVER}" +- inputText: "${USER1_NAME}" +- tapOn: "Password" +- inputText: "${USER1_PW}" +- tapOn: "Login" # Click the login button +- tapOn: + id: "store_in_secure_storage" +- tapOn: "Next" +- tapOn: + text: "Close" + index: 1 +- assertVisible: "Push notifications not available" +- tapOn: "Do not show again" +- tapOn: + id: "accounts_and_settings" # Open the popup menu +- tapOn: "Settings" +- scrollUntilVisible: + element: "Logout" +- tapOn: "Logout" +- tapOn: "Logout" # Confirm logout dialog \ No newline at end of file diff --git a/integration_test/users.dart b/integration_test/users.dart deleted file mode 100644 index 617bcb09..00000000 --- a/integration_test/users.dart +++ /dev/null @@ -1,36 +0,0 @@ -abstract class Users { - const Users._(); - - static const user1 = User( - String.fromEnvironment( - 'USER1_NAME', - defaultValue: 'alice', - ), - String.fromEnvironment( - 'USER1_PW', - defaultValue: 'AliceInWonderland', - ), - ); - static const user2 = User( - String.fromEnvironment( - 'USER2_NAME', - defaultValue: 'bob', - ), - String.fromEnvironment( - 'USER2_PW', - defaultValue: 'JoWirSchaffenDas', - ), - ); -} - -class User { - final String name; - final String password; - - const User(this.name, this.password); -} - -const homeserver = 'http://${String.fromEnvironment( - 'HOMESERVER', - defaultValue: 'localhost', -)}'; diff --git a/lib/main.dart b/lib/main.dart index 62355e51..12bd01e1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/semantics.dart'; import 'package:collection/collection.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; @@ -102,6 +103,9 @@ Future startGui(List clients, SharedPreferences store) async { await firstClient?.accountDataLoading; runApp(FluffyChatApp(clients: clients, pincode: pin, store: store)); + if (const String.fromEnvironment('WITH_SEMANTICS') == 'true') { + SemanticsBinding.instance.ensureSemantics(); + } } /// Watches the lifecycle changes to start the application when it diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index e565d42d..88d30813 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -204,31 +204,39 @@ class BootstrapDialogState extends State { ), const SizedBox(height: 16), if (_supportsSecureStorage) - CheckboxListTile.adaptive( - contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), - value: _storeInSecureStorage, - activeColor: theme.colorScheme.primary, - onChanged: (b) { - setState(() { - _storeInSecureStorage = b; - }); - }, - title: Text(_getSecureStorageLocalizedName()), - subtitle: Text( - L10n.of(context).storeInSecureStorageDescription, + Semantics( + identifier: 'store_in_secure_storage', + child: CheckboxListTile.adaptive( + contentPadding: const EdgeInsets.symmetric( + horizontal: 8.0, + ), + value: _storeInSecureStorage, + activeColor: theme.colorScheme.primary, + onChanged: (b) { + setState(() { + _storeInSecureStorage = b; + }); + }, + title: Text(_getSecureStorageLocalizedName()), + subtitle: Text( + L10n.of(context).storeInSecureStorageDescription, + ), ), ), const SizedBox(height: 16), - CheckboxListTile.adaptive( - contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), - value: _recoveryKeyCopied, - activeColor: theme.colorScheme.primary, - onChanged: (b) { - FluffyShare.share(key!, context); - setState(() => _recoveryKeyCopied = true); - }, - title: Text(L10n.of(context).copyToClipboard), - subtitle: Text(L10n.of(context).saveKeyManuallyDescription), + Semantics( + identifier: 'copy_to_clipboard', + child: CheckboxListTile.adaptive( + contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), + value: _recoveryKeyCopied, + activeColor: theme.colorScheme.primary, + onChanged: (b) { + FluffyShare.share(key!, context); + setState(() => _recoveryKeyCopied = true); + }, + title: Text(L10n.of(context).copyToClipboard), + subtitle: Text(L10n.of(context).saveKeyManuallyDescription), + ), ), const SizedBox(height: 16), ElevatedButton.icon( diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index d6431ad7..b4dca19d 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -175,18 +175,23 @@ class ClientChooserButton extends StatelessWidget { clipBehavior: Clip.hardEdge, borderRadius: BorderRadius.circular(99), color: Colors.transparent, - child: PopupMenuButton( - popUpAnimationStyle: FluffyThemes.isColumnMode(context) - ? AnimationStyle.noAnimation - : null, // https://github.com/flutter/flutter/issues/167180 - onSelected: (o) => _clientSelected(o, context), - itemBuilder: _bundleMenuItems, - child: Center( - child: Avatar( - mxContent: snapshot.data?.avatarUrl, - name: - snapshot.data?.displayName ?? matrix.client.userID?.localpart, - size: 32, + child: Semantics( + identifier: 'accounts_and_settings', + child: PopupMenuButton( + tooltip: 'Accounts and settings', + popUpAnimationStyle: FluffyThemes.isColumnMode(context) + ? AnimationStyle.noAnimation + : null, // https://github.com/flutter/flutter/issues/167180 + onSelected: (o) => _clientSelected(o, context), + itemBuilder: _bundleMenuItems, + child: Center( + child: Avatar( + mxContent: snapshot.data?.avatarUrl, + name: + snapshot.data?.displayName ?? + matrix.client.userID?.localpart, + size: 32, + ), ), ), ), diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 4f5be9a8..2611af78 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -79,6 +79,7 @@ class SettingsController extends State { context: context, future: () => matrix.client.logout(), ); + context.go('/'); } Future setAvatarAction() async { diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index ff790971..c5b49922 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -96,106 +96,112 @@ class SignInPage extends StatelessWidget { itemBuilder: (context, i) { final server = publicHomeservers[i]; final website = server.website; - return RadioListTile.adaptive( - value: server, - enabled: - state.loginLoading.connectionState != - ConnectionState.waiting, - radioScaleFactor: - FluffyThemes.isColumnMode(context) || - { - TargetPlatform.iOS, - TargetPlatform.macOS, - }.contains(theme.platform) - ? 2 - : 1, - title: Row( - children: [ - Expanded( - child: Text(server.name ?? 'Unknown'), - ), - if (website != null) - SizedBox.square( - dimension: 32, - child: IconButton( - icon: const Icon( - Icons.open_in_new_outlined, - size: 16, + return Semantics( + identifier: 'homeserver_tile_$i', + child: RadioListTile.adaptive( + value: server, + enabled: + state.loginLoading.connectionState != + ConnectionState.waiting, + radioScaleFactor: + FluffyThemes.isColumnMode(context) || + { + TargetPlatform.iOS, + TargetPlatform.macOS, + }.contains(theme.platform) + ? 2 + : 1, + title: Row( + children: [ + Expanded( + child: Text(server.name ?? 'Unknown'), + ), + if (website != null) + SizedBox.square( + dimension: 32, + child: IconButton( + icon: const Icon( + Icons.open_in_new_outlined, + size: 16, + ), + onPressed: () => + launchUrlString(website), ), - onPressed: () => - launchUrlString(website), ), - ), - ], - ), - subtitle: Column( - spacing: 4.0, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - if (server.features?.isNotEmpty == true) - Wrap( - spacing: 4.0, - runSpacing: 4.0, - children: [ - ...?server.languages?.map( - (language) => Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, - ), - color: theme - .colorScheme - .tertiaryContainer, - child: Padding( - padding: - const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, + ], + ), + subtitle: Column( + spacing: 4.0, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + if (server.features?.isNotEmpty == true) + Wrap( + spacing: 4.0, + runSpacing: 4.0, + children: [ + ...?server.languages?.map( + (language) => Material( + borderRadius: + BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .tertiaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + language, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onTertiaryContainer, ), - child: Text( - language, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onTertiaryContainer, ), ), ), ), - ), - ...server.features!.map( - (feature) => Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, - ), - color: theme - .colorScheme - .secondaryContainer, - child: Padding( - padding: - const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, + ...server.features!.map( + (feature) => Material( + borderRadius: + BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .secondaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + feature, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onSecondaryContainer, ), - child: Text( - feature, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onSecondaryContainer, ), ), ), ), - ), - ], + ], + ), + Text( + server.description ?? + 'A matrix homeserver', ), - Text( - server.description ?? 'A matrix homeserver', - ), - ], + ], + ), ), ); }, @@ -219,26 +225,29 @@ class SignInPage extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(16.0), child: SafeArea( - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: theme.colorScheme.primary, - foregroundColor: theme.colorScheme.onPrimary, + child: Semantics( + identifier: 'connect_to_homeserver_button', + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, + ), + onPressed: + state.loginLoading.connectionState == + ConnectionState.waiting + ? null + : () => connectToHomeserverFlow( + selectedHomserver, + context, + viewModel.setLoginLoading, + signUp, + ), + child: + state.loginLoading.connectionState == + ConnectionState.waiting + ? const CircularProgressIndicator.adaptive() + : Text(L10n.of(context).continueText), ), - onPressed: - state.loginLoading.connectionState == - ConnectionState.waiting - ? null - : () => connectToHomeserverFlow( - selectedHomserver, - context, - viewModel.setLoginLoading, - signUp, - ), - child: - state.loginLoading.connectionState == - ConnectionState.waiting - ? const CircularProgressIndicator.adaptive() - : Text(L10n.of(context).continueText), ), ), ), diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart index 6d9bcc87..cb4a41ae 100644 --- a/lib/pages/sign_in/view_model/sign_in_view_model.dart +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -39,14 +39,13 @@ class SignInViewModel extends ValueNotifier { ) .toList() ?? []; - final splitted = filterText.split('.'); - if (splitted.length >= 2 && !splitted.any((part) => part.isEmpty)) { - if (!filteredPublicHomeservers.any( - (homeserver) => homeserver.name == filterText, - )) { - filteredPublicHomeservers.add(PublicHomeserverData(name: filterText)); - } + if (Uri.tryParse(filterText) != null && + !filteredPublicHomeservers.any( + (homeserver) => homeserver.name == filterText, + )) { + filteredPublicHomeservers.add(PublicHomeserverData(name: filterText)); } + value = value.copyWith( filteredPublicHomeservers: filteredPublicHomeservers, ); diff --git a/scripts/integration-create-environment-variables.sh b/scripts/integration-create-environment-variables.sh deleted file mode 100755 index d2b3a8fe..00000000 --- a/scripts/integration-create-environment-variables.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -export USER1_NAME="alice" -export USER1_PW="AliceInWonderland" -export USER2_NAME="bob" -export USER2_PW="JoWirSchaffenDas" diff --git a/scripts/integration-prepare-homeserver.sh b/scripts/integration-prepare-homeserver.sh index 6bbee117..61c43e07 100755 --- a/scripts/integration-prepare-homeserver.sh +++ b/scripts/integration-prepare-homeserver.sh @@ -1,60 +1,11 @@ #!/usr/bin/env bash -if [ -z $HOMESERVER ]; then - echo "Please ensure HOMESERVER environment variable is set to the IP or hostname of the homeserver." - exit 1 -fi -if [ -z $USER1_NAME ]; then - echo "Please ensure USER1_NAME environment variable is set to first user name." - exit 1 -fi -if [ -z $USER1_PW ]; then - echo "Please ensure USER1_PW environment variable is set to first user password." - exit 1 -fi -if [ -z $USER2_NAME ]; then - echo "Please ensure USER2_NAME environment variable is set to second user name." - exit 1 -fi -if [ -z $USER2_PW ]; then - echo "Please ensure USER2_PW environment variable is set to second user password." - exit 1 -fi -echo "Waiting for homeserver to be available... (GET http://$HOMESERVER/_matrix/client/v3/login)" - -while ! curl -XGET "http://$HOMESERVER/_matrix/client/v3/login" >/dev/null 2>/dev/null; do +while ! curl -XGET "http://localhost/_matrix/client/v3/login" >/dev/null 2>/dev/null; do + echo "Waiting for homeserver to be available... (GET http://localhost/_matrix/client/v3/login)" sleep 2 done -echo "Homeserver is up." - # create users - -curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER1_NAME\", \"password\":\"$USER1_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" -curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER2_NAME\", \"password\":\"$USER2_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" - -usertoken1=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/login" -H "Content-Type: application/json" -d "{\"type\": \"m.login.password\", \"identifier\": {\"type\": \"m.id.user\",\"user\": \"$USER1_NAME\"},\"password\":\"$USER1_PW\"}" | jq -r '.access_token') -usertoken2=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/login" -H "Content-Type: application/json" -d "{\"type\": \"m.login.password\", \"identifier\": {\"type\": \"m.id.user\",\"user\": \"$USER2_NAME\"},\"password\":\"$USER2_PW\"}" | jq -r '.access_token') - - -# get usernames' mxids -mxid1=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/account/whoami" -H "Authorization: Bearer $usertoken1" | jq -r .user_id) -mxid2=$(curl -fS --retry 3 "http://$HOMESERVER/_matrix/client/r0/account/whoami" -H "Authorization: Bearer $usertoken2" | jq -r .user_id) - -# setting the display name to username -curl -fS --retry 3 -XPUT -d "{\"displayname\":\"$USER1_NAME\"}" "http://$HOMESERVER/_matrix/client/v3/profile/$mxid1/displayname" -H "Authorization: Bearer $usertoken1" -curl -fS --retry 3 -XPUT -d "{\"displayname\":\"$USER2_NAME\"}" "http://$HOMESERVER/_matrix/client/v3/profile/$mxid2/displayname" -H "Authorization: Bearer $usertoken2" - -echo "Set display names" - -# create new room to invite user too -roomID=$(curl --retry 3 --silent --fail -XPOST -d "{\"name\":\"$USER2_NAME\", \"is_direct\": true}" "http://$HOMESERVER/_matrix/client/r0/createRoom?access_token=$usertoken2" | jq -r '.room_id') -echo "Created room '$roomID'" - -# send message in created room -curl --retry 3 --fail --silent -XPOST -d '{"msgtype":"m.text", "body":"joined room successfully"}' "http://$HOMESERVER/_matrix/client/r0/rooms/$roomID/send/m.room.message?access_token=$usertoken2" -echo "Sent message" - -curl -fS --retry 3 -XPOST -d "{\"user_id\":\"$mxid1\"}" "http://$HOMESERVER/_matrix/client/r0/rooms/$roomID/invite?access_token=$usertoken2" -echo "Invited $USER1_NAME" +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER1_NAME\", \"password\":\"$USER1_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://localhost/_matrix/client/r0/register" +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER2_NAME\", \"password\":\"$USER2_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://localhost/_matrix/client/r0/register" From d83ea7731a27d6331852bc51fdf42901ca93bc56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amad=C9=A3as?= Date: Mon, 2 Mar 2026 19:40:53 +0100 Subject: [PATCH 200/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 78.9% (672 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 56e01d1f..4b3cfc7f 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -2450,5 +2450,29 @@ "type": "String" } } - } + }, + "compressVideo": "Asekkussem n tvidyut...", + "sendingAttachmentCountOfCount": "Tuzna umedday {index} n {length}…", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "welcomeText": "Azul Azul 👋 Wa d FluffyChat. Tzemreḍ ad tkecmeḍ ɣer uqeddac agejdan, yellan yemsaḍa akked https://matrix.org. Dɣa meslay d win tebɣiḍ, d aẓeṭṭa n udiwenni araslemmas amuqṛan!", + "notificationRuleRoomnotif": "Alɣu n texxamt", + "notificationRuleRoomnotifDescription": "Azen alɣu i useqdec mi ara yelli yizen yegber '@room'.", + "notificationRuleTombstoneDescription": "Azen alɣu i useqdec ɣef yiznan n usens n texxamt.", + "notificationRuleReaction": "Tasedmirt", + "notificationRuleReactionDescription": "Kkes ilɣa i tsedmirin.", + "notificationRuleSuppressEdits": "Kkes Asiẓreg", + "notificationRuleSuppressEditsDescription": "Kkes ilɣa i yeznan yettwaẓergen.", + "notificationRuleCallDescription": "Azen alɣu i useqdac ɣef isawalen.", + "notificationRuleEncryptedRoomOneToOne": "Taxxamt yettwawgelhen s wudem n yiwen ɣer yiwen", + "notificationRuleRoomOneToOne": "Taxxamt s wudem n yiwen ɣer yiwen" } From 266f2759df6afb2ac570984fe783a9af4ea0e6cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m=2E?= Date: Tue, 3 Mar 2026 07:44:02 +0100 Subject: [PATCH 201/333] chore(translations): Translated using Weblate (Galician) Currently translated at 100.0% (851 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/ --- lib/l10n/intl_gl.arb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index 995746a2..cc61db23 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -3147,5 +3147,13 @@ "theProcessWasCanceled": "Desbotouse o proceso.", "join": "Unirse", "searchOrEnterHomeserverAddress": "Busca ou escribe o enderezo do servidor de inicio", - "matrixId": "ID en Matrix" + "matrixId": "ID en Matrix", + "setPowerLevel": "Establecer responsabilidade", + "makeModerator": "Facer moderadora", + "makeAdmin": "Facer admin", + "removeModeratorRights": "Retirar permiso de moderación", + "removeAdminRights": "Retirar permiso de administración", + "powerLevel": "Nivel responsabilidade", + "setPowerLevelDescription": "Os niveis de responsabilidade definen o que pode facer unha usuaria na sala, normalmente varía de 0 a 100.", + "owner": "Propietaria" } From d58b65a4b8caf6df11103c4eb9e8a95157d5b39d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 21:38:12 +0000 Subject: [PATCH 202/333] build: (deps): Bump actions/cache from 4 to 5 Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/cache dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/integrate.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 0b87a34c..90152ded 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -63,7 +63,7 @@ jobs: with: cache: true - name: Cache Gradle - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.gradle/caches @@ -166,7 +166,7 @@ jobs: sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm - name: AVD cache - uses: actions/cache@v4 + uses: actions/cache@v5 id: avd-cache with: path: ~/.android/* From 76c5335d3222aa2e2aab27843200da250406ad0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 21:38:17 +0000 Subject: [PATCH 203/333] build: (deps): Bump actions/download-artifact from 7 to 8 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7 to 8. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/integrate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 0b87a34c..f33dac62 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -154,7 +154,7 @@ jobs: AVD_CONFIG_PATH: "~/.android/avd/test.avd/config.ini" steps: - uses: actions/checkout@v6 - - uses: actions/download-artifact@v7 + - uses: actions/download-artifact@v8 with: name: debug-apk-x64 path: . From d808fc857c391cf73873d15ece6351e5e308db27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 21:38:23 +0000 Subject: [PATCH 204/333] build: (deps): Bump actions/upload-artifact from 5 to 7 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v5...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/integrate.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 0b87a34c..802a6e82 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -73,7 +73,7 @@ jobs: - run: ./scripts/add-firebase-messaging.sh - run: flutter build apk --debug --target-platform android-x64 - name: Upload Debug APK - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 with: name: debug-apk-x64 path: build/app/outputs/flutter-apk/app-debug.apk @@ -95,7 +95,7 @@ jobs: run: ./scripts/prepare-web.sh - run: flutter build web --dart-define=WITH_SEMANTICS=true - name: Upload Web Build - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 with: name: Web Build path: build/web @@ -246,7 +246,7 @@ jobs: cp flutter_logs.txt ~/.maestro/tests/ - name: Upload Flutter and Maestro logs if: failure() - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 with: name: maestro-logs path: ~/.maestro/tests From c4cf4a3e7cb86ea900f430f8c82e3ecc8d876689 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 21:39:54 +0000 Subject: [PATCH 205/333] build: (deps): Bump flutter_foreground_task from 9.2.0 to 9.2.1 Bumps [flutter_foreground_task](https://github.com/Dev-hwang/flutter_foreground_task) from 9.2.0 to 9.2.1. - [Changelog](https://github.com/Dev-hwang/flutter_foreground_task/blob/master/CHANGELOG.md) - [Commits](https://github.com/Dev-hwang/flutter_foreground_task/commits) --- updated-dependencies: - dependency-name: flutter_foreground_task dependency-version: 9.2.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 3edd5d9e..6d30bd23 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -511,10 +511,10 @@ packages: dependency: "direct main" description: name: flutter_foreground_task - sha256: "48ea45056155a99fb30b15f14f4039a044d925bc85f381ed0b2d3b00a60b99de" + sha256: "1903697944a31f596622e51a6af55e3a9dfb27762f9763ab2841184098c6b0ba" url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "9.2.1" flutter_linkify: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index d3ebae0c..9ecb47e9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,7 +29,7 @@ dependencies: file_selector: ^1.1.0 flutter: sdk: flutter - flutter_foreground_task: ^9.2.0 + flutter_foreground_task: ^9.2.1 flutter_linkify: ^6.0.0 flutter_local_notifications: ^20.1.0 flutter_localizations: From 7f7e7eb928bdee00842ecece78bd523530d72fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 4 Mar 2026 07:57:03 +0100 Subject: [PATCH 206/333] chore: Check of unused localizations --- .github/workflows/integrate.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index d06333bc..303e577b 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -12,6 +12,8 @@ jobs: - uses: webiny/action-conventional-commits@v1.3.1 - run: ./scripts/generate-locale-config.sh - run: git diff --exit-code + - name: Check for unused translations + run: flutter pub run translations_cleaner list-unused-terms -a - run: cat .github/workflows/versions.env >> $GITHUB_ENV - uses: subosito/flutter-action@v2 with: @@ -20,7 +22,6 @@ jobs: - run: flutter pub get - name: Check if pubspec.lock is up to date run: git diff --exit-code pubspec.lock - - run: flutter gen-l10n - name: Check formatting run: dart format lib/ test/ --set-exit-if-changed - name: Check import formatting From 08e396c02c34519bc9516e6b45931f9a8db9ad5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 4 Mar 2026 07:58:08 +0100 Subject: [PATCH 207/333] refactor: Remove unused localizations --- .github/workflows/integrate.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 303e577b..c809d548 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -12,13 +12,13 @@ jobs: - uses: webiny/action-conventional-commits@v1.3.1 - run: ./scripts/generate-locale-config.sh - run: git diff --exit-code - - name: Check for unused translations - run: flutter pub run translations_cleaner list-unused-terms -a - run: cat .github/workflows/versions.env >> $GITHUB_ENV - uses: subosito/flutter-action@v2 with: flutter-version: ${{ env.FLUTTER_VERSION }} cache: true + - name: Check for unused translations + run: flutter pub run translations_cleaner list-unused-terms -a - run: flutter pub get - name: Check if pubspec.lock is up to date run: git diff --exit-code pubspec.lock From 4dfa9873eed73c0fa3ff7dec6df59a24bfe93166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 4 Mar 2026 07:58:18 +0100 Subject: [PATCH 208/333] refactor: Remove unused translations --- lib/l10n/intl_ar.arb | 416 +---------------------------------- lib/l10n/intl_be.arb | 430 +------------------------------------ lib/l10n/intl_bn.arb | 36 +--- lib/l10n/intl_bo.arb | 245 +-------------------- lib/l10n/intl_ca.arb | 369 +------------------------------ lib/l10n/intl_cs.arb | 364 +------------------------------ lib/l10n/intl_da.arb | 6 +- lib/l10n/intl_de.arb | 361 +------------------------------ lib/l10n/intl_el.arb | 43 +--- lib/l10n/intl_en.arb | 360 +------------------------------ lib/l10n/intl_eo.arb | 196 +---------------- lib/l10n/intl_es.arb | 369 +------------------------------ lib/l10n/intl_et.arb | 370 +------------------------------ lib/l10n/intl_eu.arb | 370 +------------------------------ lib/l10n/intl_fa.arb | 364 +------------------------------ lib/l10n/intl_fi.arb | 430 +------------------------------------ lib/l10n/intl_fil.arb | 104 +-------- lib/l10n/intl_fr.arb | 414 +---------------------------------- lib/l10n/intl_ga.arb | 370 +------------------------------ lib/l10n/intl_gl.arb | 370 +------------------------------ lib/l10n/intl_he.arb | 118 +--------- lib/l10n/intl_hi.arb | 8 +- lib/l10n/intl_hr.arb | 372 +------------------------------- lib/l10n/intl_hu.arb | 420 +----------------------------------- lib/l10n/intl_ia.arb | 2 +- lib/l10n/intl_id.arb | 369 +------------------------------ lib/l10n/intl_ie.arb | 281 +----------------------- lib/l10n/intl_it.arb | 430 +------------------------------------ lib/l10n/intl_ja.arb | 286 +----------------------- lib/l10n/intl_ka.arb | 62 +----- lib/l10n/intl_kab.arb | 298 +------------------------ lib/l10n/intl_ko.arb | 420 +----------------------------------- lib/l10n/intl_lt.arb | 295 +------------------------ lib/l10n/intl_lv.arb | 370 +------------------------------ lib/l10n/intl_nb.arb | 370 +------------------------------ lib/l10n/intl_nl.arb | 370 +------------------------------ lib/l10n/intl_pl.arb | 420 +----------------------------------- lib/l10n/intl_pt.arb | 35 +-- lib/l10n/intl_pt_BR.arb | 369 +------------------------------ lib/l10n/intl_pt_PT.arb | 157 +------------- lib/l10n/intl_ro.arb | 306 +------------------------- lib/l10n/intl_ru.arb | 360 +------------------------------ lib/l10n/intl_sk.arb | 129 +---------- lib/l10n/intl_sl.arb | 68 +----- lib/l10n/intl_sq.arb | 2 +- lib/l10n/intl_sr.arb | 189 +--------------- lib/l10n/intl_sv.arb | 355 +----------------------------- lib/l10n/intl_ta.arb | 420 +----------------------------------- lib/l10n/intl_te.arb | 2 +- lib/l10n/intl_th.arb | 246 +-------------------- lib/l10n/intl_tr.arb | 418 +---------------------------------- lib/l10n/intl_uk.arb | 370 +------------------------------ lib/l10n/intl_uz.arb | 372 +------------------------------- lib/l10n/intl_vi.arb | 113 +--------- lib/l10n/intl_yue_Hant.arb | 43 +--- lib/l10n/intl_zh.arb | 370 +------------------------------ lib/l10n/intl_zh_Hant.arb | 420 +----------------------------------- 57 files changed, 68 insertions(+), 15554 deletions(-) diff --git a/lib/l10n/intl_ar.arb b/lib/l10n/intl_ar.arb index 8bcfa71e..1a28b672 100644 --- a/lib/l10n/intl_ar.arb +++ b/lib/l10n/intl_ar.arb @@ -313,16 +313,6 @@ "type": "String", "placeholders": {} }, - "confirm": "أكّد", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "اتصل", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "دعيَ المراسل للمجموعة", "@contactHasBeenInvitedToTheGroup": { "type": "String", @@ -392,33 +382,6 @@ } } }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "لا مجال للعودة، أتأكد تعطيل حسابك؟", "@deactivateAccountWarning": { "type": "String", @@ -484,11 +447,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "اختر صورة ورمزا للانفعالة!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "محادثة فارغة", "@emptyChat": { "type": "String", @@ -518,11 +476,6 @@ } } }, - "enterYourHomeserver": "أدخل الخادم", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "fileName": "اسم الملف", "@fileName": { "type": "String", @@ -599,11 +552,6 @@ "type": "String", "placeholders": {} }, - "identity": "المُعرّف", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignoredUsers": "المستخدمون المتجاهلون", "@ignoredUsers": { "type": "String", @@ -729,11 +677,6 @@ "type": "String", "placeholders": {} }, - "license": "الرخصة", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "فاتح", "@lightTheme": { "type": "String", @@ -939,11 +882,6 @@ } } }, - "rejoin": "أعد الانضمام", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "أزِل", "@remove": { "type": "String", @@ -963,11 +901,6 @@ } } }, - "removeDevice": "أزل جهازا", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "فك حجبه من المحادثة", "@unbanFromChat": { "type": "String", @@ -988,15 +921,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "رآه {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "أرسل", "@send": { "type": "String", @@ -1022,11 +946,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "أرسل الملف الأصلي", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "أرسل فيديو", "@sendVideo": { "type": "String", @@ -1086,11 +1005,6 @@ } } }, - "setInvitationLink": "عيّن رابط الدعوة", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "setStatus": "عيّن الحالة", "@setStatus": { "type": "String", @@ -1216,15 +1130,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 محادثة غير مقروءة} other{{unreadCount} محادثات غير مقروءة}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} و {count} أخرون يكتبون…", "@userAndOthersAreTyping": { "type": "String", @@ -1344,11 +1249,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "الخلفية:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "تحذير!", "@warning": { "type": "String", @@ -1384,11 +1284,6 @@ "type": "String", "placeholders": {} }, - "people": "أشخاص", - "@people": { - "type": "String", - "placeholders": {} - }, "scanQrCode": "امسح رمز الاستجابة السريعة", "@scanQrCode": {}, "noMatrixServer": "{server1} ليس خادم ماتريكس، بدلًا منه أتريد استخدام {server2}؟", @@ -1428,11 +1323,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "تغييرات تخص الأعضاء", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "inoffensive": "غير مسيء", "@inoffensive": { "type": "String", @@ -1463,11 +1353,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "انتقل للغرفة الجديدة", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "fontSize": "حجم الخط", "@fontSize": { "type": "String", @@ -1545,16 +1430,6 @@ "type": "String", "placeholders": {} }, - "containsUserName": "يحوي اسم المستخدم", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "يحوي الاسم العلني", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "commandMissing": "{command} ليس بأمر.", "@commandMissing": { "type": "String", @@ -1641,8 +1516,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "أُضيفت المحادثة الى هذا المساحة", - "@chatHasBeenAddedToThisSpace": {}, "chatBackup": "النسخ الاحتياطي للمحادثات", "@chatBackup": { "type": "String", @@ -1770,11 +1643,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "اختر رجاء", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "passwordRecovery": "استعادة كلمة السر", "@passwordRecovery": { "type": "String", @@ -1835,26 +1703,11 @@ } } }, - "notificationsEnabledForThisAccount": "الإشعارات مفعلة لهذا الحساب", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "spaceIsPublic": "عام في المساحة", "@spaceIsPublic": { "type": "String", "placeholders": {} }, - "toggleFavorite": "بدّل حالة التفضيل", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "علّمه كمقروء/غير مقروء", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "unavailable": "غير متوفر", "@unavailable": { "type": "String", @@ -1870,16 +1723,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "تسجيل دخول أحادي", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "بدّل حالة الكتم", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "showPassword": "أظهر كلمة السر", "@showPassword": { "type": "String", @@ -1945,11 +1788,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "رسائل البوت", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "sendAsText": "أرسل نصًا", "@sendAsText": { "type": "String" @@ -1959,11 +1797,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "دعوات لي", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "replaceRoomWithNewerVersion": "استبدل الغرفة باصدار أحدث", "@replaceRoomWithNewerVersion": { "type": "String", @@ -1979,26 +1812,11 @@ "type": "String", "placeholders": {} }, - "sendSticker": "أرسل ملصقًا", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "defaultPermissionLevel": "مستوى الأذونات الافتراضية للمستخدمين الجدد", "@defaultPermissionLevel": { "type": "String", "placeholders": {} }, - "setPermissionsLevel": "تعيين مستوى الأذونات", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "setCustomEmotes": "عيّن وجوهًا تعبيرية مخصصة", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "oneClientLoggedOut": "أُ خرج أحد العملاء الذي تسختدمها", "@oneClientLoggedOut": {}, "pleaseEnter4Digits": "أدخل 4 أرقام أو أتركه فارغ لتعطيل القفل.", @@ -2079,18 +1897,6 @@ "type": "String", "placeholders": {} }, - "badServerVersionsException": "يدعم الخادم الرئيسي المستخدم إصدارات المواصفات:\n{serverVersions}\nلكن هذا التطبيق يدعم فقط:\n{supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "offensive": "عدواني", "@offensive": { "type": "String", @@ -2142,17 +1948,6 @@ "@videoCallsBetaWarning": {}, "placeCall": "إجراء مكالمة", "@placeCall": {}, - "videoWithSize": "فيديو ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "emailOrUsername": "البريد الإلكتروني أو اسم المستخدم", - "@emailOrUsername": {}, "dismiss": "رفض", "@dismiss": {}, "setAsCanonicalAlias": "تعيين كاسم مستعار رئيسي", @@ -2189,17 +1984,8 @@ }, "markAsRead": "حدد كمقروء", "@markAsRead": {}, - "openVideoCamera": "افتح الكاميرا لمقطع فيديو", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "start": "إبدأ", "@start": {}, - "publish": "انشر", - "@publish": {}, - "addToSpaceDescription": "إختر مساحة لإضافة هذه المحادثة إليها.", - "@addToSpaceDescription": {}, "reportUser": "التبيلغ عن المستخدم", "@reportUser": {}, "openChat": "فتح المحادثة", @@ -2230,8 +2016,6 @@ } } }, - "widgetVideo": "فيديو", - "@widgetVideo": {}, "recoveryKeyLost": "هل فقدت مفتاح الاسترداد؟", "@recoveryKeyLost": {}, "pleaseEnterRecoveryKeyDescription": "لإلغاء قفل رسائلك القديمة ، يرجى إدخال مفتاح الاسترداد الذي تم إنشاؤه في جلسة سابقة. مفتاح الاسترداد ليس كلمة المرور الخاصة بك.", @@ -2247,8 +2031,6 @@ } } }, - "hydrateTor": "مستخدمو تور: استيراد تصدير الجلسة", - "@hydrateTor": {}, "commandHint_googly": "أرسل بعض عيون googly", "@commandHint_googly": {}, "commandHint_cuddle": "أرسل عناق", @@ -2268,33 +2050,14 @@ "@unlockOldMessages": {}, "commandHint_markasdm": "وضع علامة على أنها غرفة رسائل مباشرة لمعرف المصفوفة", "@commandHint_markasdm": {}, - "allRooms": "جميع الدردشات الجماعية", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "dehydrate": "تصدير الجلسة ومسح الجهاز", "@dehydrate": {}, "dehydrateWarning": "لا يمكن التراجع عن هذا الإجراء. تأكد من تخزين ملف النسخ الاحتياطي بأمان.", "@dehydrateWarning": {}, - "dehydrateTorLong": "بالنسبة لمستخدمي تور ، يوصى بتصدير الجلسة قبل إغلاق النافذة.", - "@dehydrateTorLong": {}, - "dehydrateTor": "مستخدمو تور: تصدير الجلسة", - "@dehydrateTor": {}, "hydrate": "استعادة من ملف النسخ الاحتياطي", "@hydrate": {}, - "pleaseEnterRecoveryKey": "الرجاء إدخال مفتاح الاسترداد:", - "@pleaseEnterRecoveryKey": {}, "recoveryKey": "مفتاح الاسترداد", "@recoveryKey": {}, - "startFirstChat": "ابدأ محادثتك الأولى", - "@startFirstChat": {}, - "widgetCustom": "مُخصّص", - "@widgetCustom": {}, - "widgetNameError": "يرجى تقديم اسم العرض.", - "@widgetNameError": {}, - "errorAddingWidget": "خطأ في إضافة الأداة.", - "@errorAddingWidget": {}, "youRejectedTheInvitation": "لقد رفضت الدعوة", "@youRejectedTheInvitation": {}, "youJoinedTheChat": "لقد انضممت إلى المحادثة", @@ -2343,28 +2106,14 @@ "@foregroundServiceRunning": {}, "screenSharingTitle": "مشاركة الشاشة", "@screenSharingTitle": {}, - "appearOnTop": "يظهر في الأعلى", - "@appearOnTop": {}, - "otherCallingPermissions": "الميكروفون والكاميرا وأذونات FluffyChat الأخرى", - "@otherCallingPermissions": {}, - "enterSpace": "أدخل المساحة", - "@enterSpace": {}, - "enterRoom": "أدخل الغرفة", - "@enterRoom": {}, "deviceKeys": "مفاتيح الجهاز:", "@deviceKeys": {}, "whyIsThisMessageEncrypted": "لماذا هذه الرسالة غير قابلة للقراءة؟", "@whyIsThisMessageEncrypted": {}, - "nextAccount": "الحساب التالي", - "@nextAccount": {}, - "previousAccount": "الحساب السابق", - "@previousAccount": {}, "encryptThisChat": "تشفير هذه المحادثة", "@encryptThisChat": {}, "screenSharingDetail": "أنت تشارك شاشتك في FuffyChat", "@screenSharingDetail": {}, - "hideUnimportantStateEvents": "إخفاء أحداث الحالة غير المهمة", - "@hideUnimportantStateEvents": {}, "newGroup": "مجموعة جديدة", "@newGroup": {}, "youKicked": "👞 لقد ركلت {user}", @@ -2379,11 +2128,6 @@ "@newSpace": {}, "commandHint_markasgroup": "وضع علامة كمجموعة", "@commandHint_markasgroup": {}, - "separateChatTypes": "الدردشات المباشرة والمجموعات المنفصلة", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "hugContent": "{senderName} يعانقك", "@hugContent": { "type": "String", @@ -2393,27 +2137,6 @@ } } }, - "hydrateTorLong": "هل قمت بتصدير جلستك الأخيرة على تور؟ قم باستيرادها بسرعة واستمر في المحادثة.", - "@hydrateTorLong": {}, - "widgetUrlError": "هذا ليس عنوان URL صالحًا.", - "@widgetUrlError": {}, - "indexedDbErrorTitle": "مشاكل الوضع الخاص", - "@indexedDbErrorTitle": {}, - "indexedDbErrorLong": "للأسف ، لم يتم تمكين تخزين الرسائل في الوضع الخاص افتراضيا.\nيرجى زيارة\n - حول:التكوين\n - تعيين dom.indexedDB.privateBrowsing.enabled إلى true\nخلاف ذلك ، لا يمكن تشغيل FluffyChat.", - "@indexedDbErrorLong": {}, - "switchToAccount": "التبديل إلى الحساب {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "addWidget": "إضافة اداة", - "@addWidget": {}, - "widgetEtherpad": "ملاحظة نصية", - "@widgetEtherpad": {}, "youKickedAndBanned": "🙅 لقد ركلت وحظرت {user}", "@youKickedAndBanned": { "placeholders": { @@ -2432,8 +2155,6 @@ }, "saveKeyManuallyDescription": "احفظ هذا المفتاح يدويا عن طريق تشغيل مربع حوار مشاركة النظام أو الحافظة.", "@saveKeyManuallyDescription": {}, - "widgetJitsi": "اجتماعات جيتسي", - "@widgetJitsi": {}, "youInvitedUser": "📩 قمت بدعوة {user}", "@youInvitedUser": { "placeholders": { @@ -2444,27 +2165,8 @@ }, "storeInSecureStorageDescription": "قم بتخزين مفتاح الاسترداد في التخزين الآمن لهذا الجهاز.", "@storeInSecureStorageDescription": {}, - "widgetName": "الاسم", - "@widgetName": {}, "users": "المستخدمون", "@users": {}, - "callingPermissions": "أذونات الاتصال", - "@callingPermissions": {}, - "callingAccount": "الاتصال بالحساب", - "@callingAccount": {}, - "callingAccountDetails": "يسمح لـ FluffyChat باستخدام تطبيق android Dialer الأصلي.", - "@callingAccountDetails": {}, - "appearOnTopDetails": "يسمح للتطبيق بالظهور في الأعلى (ليست هناك حاجة إذا قمت بالفعل بإعداد Fluffychat كحساب اتصال)", - "@appearOnTopDetails": {}, - "numChats": "{number} الدردشات", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "jump": "قفز", "@jump": {}, "report": "الإبلاغ", @@ -2506,19 +2208,6 @@ "@jumpToLastReadMessage": {}, "readUpToHere": "اقرأ حتى هنا", "@readUpToHere": {}, - "signInWithPassword": "سجل الدخول بكلمة السر", - "@signInWithPassword": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "رجاء حاول مجددا أو اختر خادما مختلفا.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "signInWith": "تسجيل الدخول باستخدام {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "importNow": "استيراد الآن", "@importNow": {}, "importEmojis": "استيراد الرموز التعبيرية", @@ -2539,14 +2228,8 @@ "@messagesStyle": {}, "shareInviteLink": "شارك رابط الدعوة", "@shareInviteLink": {}, - "profileNotFound": "لا يمكن العثور على المستخدم على الخادم. ربما هناك مشكلة في الاتصال أو المستخدم غير موجود.", - "@profileNotFound": {}, - "setTheme": "تعيين السمة:", - "@setTheme": {}, "setColorTheme": "تعيين لون السمة:", "@setColorTheme": {}, - "inviteContactToGroupQuestion": "هل تريد دعوة {contact} إلى المحادثة \"{groupName}\"؟?", - "@inviteContactToGroupQuestion": {}, "tryAgain": "أعد المحاولة", "@tryAgain": {}, "redactMessageDescription": "سيتم تنقيح الرسالة لجميع المشاركين في هذه المحادثة. هذا لا يمكن التراجع عنها.", @@ -2576,8 +2259,6 @@ }, "invite": "دعوة", "@invite": {}, - "addChatDescription": "أضف وصفًا للدردشة...", - "@addChatDescription": {}, "chatPermissions": "صلاحيات المحادثة", "@chatPermissions": {}, "chatDescription": "وصف المحادثة", @@ -2594,8 +2275,6 @@ "@directChat": {}, "inviteGroupChat": "📨 دعوة للمحادثة الجماعية", "@inviteGroupChat": {}, - "invitePrivateChat": "📨 دعوة دردشة خاصة", - "@invitePrivateChat": {}, "emoteKeyboardNoRecents": "التعبيرات المستخدمة مؤخرًا ستظهر هنا ...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2659,8 +2338,6 @@ "@groupName": {}, "searchChatsRooms": "ابحث عن #الدردشات، @المستخدمين...", "@searchChatsRooms": {}, - "startConversation": "بدء محادثة", - "@startConversation": {}, "commandHint_sendraw": "إرسال جيسون الخام", "@commandHint_sendraw": {}, "wrongRecoveryKey": "عذرًا... لا يبدو أن هذا هو مفتاح الاسترداد الصحيح.", @@ -2685,18 +2362,12 @@ "@passwordIsWrong": {}, "pleaseEnterYourCurrentPassword": "من فضلك أدخل كلمة السر الحالية", "@pleaseEnterYourCurrentPassword": {}, - "publicLink": "رابط عام", - "@publicLink": {}, "nothingFound": "لم نجد شيئاً.", "@nothingFound": {}, - "decline": "رفض", - "@decline": {}, "newPassword": "كلمة المرور الجديدة", "@newPassword": {}, "passwordsDoNotMatch": "كلمات المرور لا تتطابق", "@passwordsDoNotMatch": {}, - "subspace": "مساحة فرعية", - "@subspace": {}, "select": "اختر", "@select": {}, "pleaseChooseAStrongPassword": "الرجاء اختيار كلمة مرور قوية", @@ -2709,18 +2380,6 @@ "@joinSpace": {}, "searchForUsers": "ابحث عن @users...", "@searchForUsers": {}, - "databaseBuildErrorBody": "غير قادر على بناء قاعدة بيانات SQlite. يحاول التطبيق استخدام قاعدة بيانات قديمة في الوقت الحالي. الرجاء الإبلاغ عن هذا الخطأ للمطورين على {url}. رسالة الخطأ هي: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "initAppError": "حدث خطأ بداخل التطبيق", "@initAppError": {}, "sessionLostBody": "جلستك مفقودة يرجى إبلاغ المطورين بهذا الخطأ في {url}. رسالة الخطأ هي: {error}", @@ -2767,14 +2426,6 @@ }, "transparent": "شفّاف", "@transparent": {}, - "youInvitedToBy": "📩 تمت دعوتك عبر الرابط إلى:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "formattedMessagesDescription": "عرض محتوى الرسالة الغنية مثل النص الغامق باستخدام الماركداون.", "@formattedMessagesDescription": {}, "verifyOtherUserDescription": "إذا قمت بالتحقق من مستخدم آخر، فيمكنك التأكد من أنك تعرف من تكتب إليه حقًا. 💪\n\nعند بدء عملية التحقق، سترى أنت والمستخدم الآخر نافذة منبثقة في التطبيق. هناك سترى بعد ذلك سلسلة من الرموز التعبيرية أو الأرقام التي يتعين عليك مقارنتها مع بعضها البعض.\n\nأفضل طريقة للقيام بذلك هي الالتقاء أو بدء مكالمة فيديو. 👭", @@ -2787,15 +2438,6 @@ "@sendReadReceipts": {}, "verifyOtherDevice": "🔐 التحقق من الجهاز الآخر", "@verifyOtherDevice": {}, - "forwardMessageTo": "هل تريد إعادة توجيه الرسالة إلى {roomName}؟", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendTypingNotificationsDescription": "يستطيع المشاركون الآخرون في المحادثة رؤيتك عند كتابة رسالة جديدة.", "@sendTypingNotificationsDescription": {}, "sendReadReceiptsDescription": "يمكن للمشاركين الآخرين في المحادثة معرفة متى قرأت الرسالة.", @@ -2842,11 +2484,6 @@ "@hidePresences": {}, "incomingMessages": "الرسائل الواردة", "@incomingMessages": {}, - "presenceStyle": "الحضور:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "إظهار رسائل الحالة من المستخدمين الآخرين", "@presencesToggle": { "type": "String", @@ -2888,8 +2525,6 @@ "@hideInvalidOrUnknownMessageFormats": {}, "overview": "نظرة عامة", "@overview": {}, - "notifyMeFor": "أعلمني بـ", - "@notifyMeFor": {}, "passwordRecoverySettings": "إعدادات استعادة كلمة المرور", "@passwordRecoverySettings": {}, "globalChatId": "معرف المحادثة العامة", @@ -2900,10 +2535,6 @@ "@customEmojisAndStickersBody": {}, "hideRedactedMessages": "إخفاء الرسائل المكررة", "@hideRedactedMessages": {}, - "hideMemberChangesInPublicChats": "إخفاء تغييرات الأعضاء في الدردشات العامة", - "@hideMemberChangesInPublicChats": {}, - "hideMemberChangesInPublicChatsBody": "لا تظهر في المخطط الزمني للدردشة إذا انضم شخص ما إلى محادثة عامة أو غادرها لتحسين إمكانية القراءة.", - "@hideMemberChangesInPublicChatsBody": {}, "usersMustKnock": "المستخدم يجب أن يطرق الباب", "@usersMustKnock": {}, "chatCanBeDiscoveredViaSearchOnServer": "يمكن اكتشاف الشات عن طريق البحث في {server}", @@ -2919,16 +2550,6 @@ "@noOneCanJoin": {}, "knocking": "طرق", "@knocking": {}, - "userWouldLikeToChangeTheChat": "{user} يرغب في الانضمام إلى المحادثة.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "لم يتم بعد إنشاء أي رابط عام", - "@noPublicLinkHasBeenCreatedYet": {}, "knock": "دق", "@knock": {}, "thereAreCountUsersBlocked": "يوجد حاليًا {count} من المستخدمين المحظورين.", @@ -2940,17 +2561,6 @@ "@publicChatAddresses": {}, "createNewAddress": "إنشاء عنوان جديد", "@createNewAddress": {}, - "userRole": "دور المستخدم", - "@userRole": {}, - "minimumPowerLevel": "{level} هو الحد الأدنى من مستوى الطاقة.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchIn": "بحث في {chat}...", "@searchIn": { "type": "String", @@ -2976,22 +2586,8 @@ "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, - "countChatsAndCountParticipants": "{chats} دردشات و {participants} مشاركين", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "لم يتم العثور على دردشات...", "@noMoreChatsFound": {}, - "joinedChats": "انضم إلى الدردشة", - "@joinedChats": {}, "unread": "غير المقروءة", "@unread": {}, "space": "المساحة", @@ -3073,12 +2669,6 @@ "@noChatsFoundHere": {}, "loginWithMatrixId": "تسجيل الدخول باستخدام معرف ماتريكس", "@loginWithMatrixId": {}, - "discoverHomeservers": "اكتشف الخوادم المنزلية", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "ما هو خادم المنزل ؟", - "@whatIsAHomeserver": {}, - "homeserverDescription": "يتم تخزين جميع بياناتك على خادم المنزل، تمامًا مثل مزود خدمة البريد الإلكتروني. يمكنك اختيار خادم البيت الذي تريد استخدامه، بينما لا يزال بإمكانك التواصل مع الجميع. اعرف المزيد على https://matrix.org.", - "@homeserverDescription": {}, "doesNotSeemToBeAValidHomeserver": "لا يبدو أنه خادم منزلي متوافق. عنوان URL غير صحيح ؟", "@doesNotSeemToBeAValidHomeserver": {}, "calculatingFileSize": "جارٍ حساب حجم الملف...", @@ -3181,7 +2771,5 @@ "previous": "السابق", "@previous": {}, "otherPartyNotLoggedIn": "لم يقم الطرف الآخر بتسجيل الدخول حالياً وبالتالي لا يمكنه تلقي الرسائل!", - "@otherPartyNotLoggedIn": {}, - "setCustomPermissionLevel": "حدد مستوى صلاحية مخصص", - "@setCustomPermissionLevel": {} -} + "@otherPartyNotLoggedIn": {} +} \ No newline at end of file diff --git a/lib/l10n/intl_be.arb b/lib/l10n/intl_be.arb index 0ae7d887..05534575 100644 --- a/lib/l10n/intl_be.arb +++ b/lib/l10n/intl_be.arb @@ -7,14 +7,8 @@ "@repeatPassword": {}, "notAnImage": "Не файл выявы.", "@notAnImage": {}, - "setCustomPermissionLevel": "Задаць карыстальніцкі ўзровень дазволу", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Калі ласка, выберыце ролю ніжэй ці ўвядзіце карыстальніцкі ўзровень дазволу паміж 0 і 100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Ігнараваць карыстальніка", "@ignoreUser": {}, - "normalUser": "Звычайны карыстальнік", - "@normalUser": {}, "remove": "Прыбраць", "@remove": { "type": "String", @@ -85,8 +79,6 @@ } } }, - "addChatDescription": "Дадайце апісанне чату...", - "@addChatDescription": {}, "addToSpace": "Дадаць у прастору", "@addToSpace": {}, "admin": "Адмін", @@ -222,36 +214,10 @@ "@swipeRightToLeftToReply": {}, "sendOnEnter": "Дасылаць на enter", "@sendOnEnter": {}, - "badServerVersionsException": "Хатні сервер падтрымлівае наступныя версіі спецыфікацыі:\n{serverVersions}\nАле гэта праграма падтрымлівае толькі:{supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "countChatsAndCountParticipants": "{chats} чатаў і {participants} удзельнікаў", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Болей чатаў не знойдзена...", "@noMoreChatsFound": {}, "noChatsFoundHere": "Здаецца, тут пуста. Пачніце новы чат з кімсьці праз кнопку ніжэй. ⤵️", "@noChatsFoundHere": {}, - "joinedChats": "Чаты, да якіх вы далучыліся", - "@joinedChats": {}, "unread": "Непрачытаные", "@unread": {}, "space": "Прастора", @@ -290,11 +256,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Паведамленні ботаў", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Скасаваць", "@cancel": { "type": "String", @@ -512,8 +473,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Чат быў дададзены ў гэту прастору", - "@chatHasBeenAddedToThisSpace": {}, "chats": "Чаты", "@chats": { "type": "String", @@ -654,31 +613,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Пацвердзіць", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Далучыцца", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Кантакт быў запрошаны ў групу", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Мае адлюстроўваемае імя", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Мае імя карыстальніка", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Пра кантэнт было паведамлена адміністратарам сервера", "@contentHasBeenReported": { "type": "String", @@ -771,33 +710,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Гэта дэактывіруе ваш уліковы запіс. Гэта дзеянне не можа быць адменена! Вы ўпэўнены?", "@deactivateAccountWarning": { "type": "String", @@ -843,11 +755,6 @@ "type": "String", "placeholders": {} }, - "allRooms": "Усе групавыя чаты", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "displaynameHasBeenChanged": "Адлюстроўваемае імя было зменена", "@displaynameHasBeenChanged": { "type": "String", @@ -927,11 +834,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Вы павінны задаць скарачэнне эмодзі і выяву!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Пусты чат", "@emptyChat": { "type": "String", @@ -985,11 +887,6 @@ }, "homeserver": "Дамашні сервер", "@homeserver": {}, - "enterYourHomeserver": "Увядзіце адрас дамашняга сервера", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Памылка атрымання месцазнаходжання: {error}", "@errorObtainingLocation": { "type": "String", @@ -1039,11 +936,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Перайсці ў новы пакой", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Група", "@group": { "type": "String", @@ -1120,11 +1012,6 @@ "type": "String", "placeholders": {} }, - "identity": "Ідэнтыфікацыя", - "@identity": { - "type": "String", - "placeholders": {} - }, "block": "Заблакіраваць", "@block": {}, "blockedUsers": "Заблакіраваныя карыстальнікі", @@ -1153,8 +1040,6 @@ "type": "String", "placeholders": {} }, - "inviteContactToGroupQuestion": "Вы хаціце запрасіць {contact} да чату \"{groupName}\"?", - "@inviteContactToGroupQuestion": {}, "inviteContactToGroup": "Запрасіць кантакт да {groupName}", "@inviteContactToGroup": { "type": "String", @@ -1196,11 +1081,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Запрашэнне для мяне", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} запрасіў вас у FluffyChat.\n1. Перайдзіце на fluffychat.im і ўстанавіце праграму\n2. Зарэгестрыруйцесь альбо ўвайдзіце\n3. Перайдзіце па запрашальнай спасылцы:\n{link}", "@inviteText": { "type": "String", @@ -1280,11 +1160,6 @@ "type": "String", "placeholders": {} }, - "license": "Ліцэнзія", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Светлая", "@lightTheme": { "type": "String", @@ -1303,14 +1178,6 @@ "@dehydrate": {}, "dehydrateWarning": "Гэта дзеянне не можа быць адменена. Пераканайцеся, што вы бяспечна захавалі файл рэзервовай копіі.", "@dehydrateWarning": {}, - "dehydrateTor": "Карыстальнікі TOR: Экспарт сесіі", - "@dehydrateTor": {}, - "dehydrateTorLong": "Для карыстальнікаў TOR прапануем экспартаваць сесію перад тым, як закрыць акно.", - "@dehydrateTorLong": {}, - "hydrateTor": "Карыстальнікі TOR: Імпарт экспарту сесіі", - "@hydrateTor": {}, - "hydrateTorLong": "Вы экспартавалі сесію ў мінулы раз праз TOR? Хутка імпартуйце яе і працягніце размовы.", - "@hydrateTorLong": {}, "hydrate": "Аднавіць з рэзервовай копіі", "@hydrate": {}, "loadingPleaseWait": "Загрузка... Калі ласка, пачакайце.", @@ -1352,11 +1219,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Змяненні ўдзельнікаў", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Згадаць", "@mention": { "type": "String", @@ -1472,16 +1334,6 @@ }, "setChatDescription": "Задаць апісанне чату", "@setChatDescription": {}, - "setInvitationLink": "Задаць запрашальную спасылку", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Задаць ўзровееь дазволаў", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Задаць статус", "@setStatus": { "type": "String", @@ -1516,21 +1368,11 @@ "type": "String", "placeholders": {} }, - "presenceStyle": "Прысутнасць:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Паказваць паведасленні статусаў іншых карыстальнікаў", "@presencesToggle": { "type": "String", "placeholders": {} }, - "singlesignon": "Адзіны ўваход", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Прапусціць", "@skip": { "type": "String", @@ -1560,8 +1402,6 @@ } } }, - "startFirstChat": "Пачніце ваш першы чат", - "@startFirstChat": {}, "status": "Статус", "@status": { "type": "String", @@ -1612,16 +1452,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Пераключыць Захаванае", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Пераключыць гук", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "visibleForEveryone": "Бачна ўсім", "@visibleForEveryone": { "type": "String", @@ -1647,11 +1477,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Шпалеры:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Увага!", "@warning": { "type": "String", @@ -1729,23 +1554,10 @@ "@openGallery": {}, "removeFromSpace": "Выдаліць з прасторы", "@removeFromSpace": {}, - "addToSpaceDescription": "Выберыце прастору, да якой дадаць гэты чат.", - "@addToSpaceDescription": {}, "start": "Пачаць", "@start": {}, "pleaseEnterRecoveryKeyDescription": "Каб разблакіраваць вашы мінулыя паведамленні, калі ласка, увядзіце ключ аднаўлення, што быў згенерыраваны ў мінулай сесіі. Ключ аднаўлення гэта НЕ ваш пароль.", "@pleaseEnterRecoveryKeyDescription": {}, - "publish": "Апублікаваць", - "@publish": {}, - "videoWithSize": "Відэа ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "openChat": "Адкрыць чат", "@openChat": {}, "markAsRead": "Адзначыць як прачытанае", @@ -1784,43 +1596,6 @@ "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Эксперыментальныя відэа выклікі", "@experimentalVideoCalls": {}, - "emailOrUsername": "Email ці імя карыстальніка", - "@emailOrUsername": {}, - "indexedDbErrorTitle": "Праблемы з прыватным рэжымам", - "@indexedDbErrorTitle": {}, - "indexedDbErrorLong": "Сховішча паведамленняў, на жаль, не ўключана ў прыватным рэжыме па змаўчанні.\nКалі ласка, наведайце\n - about:config\n - што dom.indexedDB.privateBrowsing.enabled уключаны\nІнакш, FluffyChat будзе немагчыма запусціць.", - "@indexedDbErrorLong": {}, - "switchToAccount": "Пераключыцца на ўліковы запіс {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Наступны ўліковы запіс", - "@nextAccount": {}, - "previousAccount": "Мінулы ўліковы запіс", - "@previousAccount": {}, - "addWidget": "Дадаць віджэт", - "@addWidget": {}, - "widgetVideo": "Відэа", - "@widgetVideo": {}, - "widgetEtherpad": "Тэкставая нататка", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Карыстальніцкі", - "@widgetCustom": {}, - "widgetName": "Імя", - "@widgetName": {}, - "widgetUrlError": "Гэта хібны URL.", - "@widgetUrlError": {}, - "widgetNameError": "Калі ласка, укажыце адлюстроўваемаем імя.", - "@widgetNameError": {}, - "errorAddingWidget": "Памылка дадання віджэту.", - "@errorAddingWidget": {}, "youRejectedTheInvitation": "Вы скасавалі запрашэнне", "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Вы далучыліся да чату", @@ -1843,14 +1618,6 @@ } } }, - "youInvitedToBy": "📩 Вы былі запрошаны па спасылцы на:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "youInvitedBy": "📩 Вы былі запрошаны карыстальнікам {user}", "@youInvitedBy": { "placeholders": { @@ -1911,16 +1678,6 @@ "@usersMustKnock": {}, "noOneCanJoin": "Ніхто не можа далучыцца", "@noOneCanJoin": {}, - "userWouldLikeToChangeTheChat": "{user} хоча далучыцца да чату.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Публічны ключ яшчэ не створаны", - "@noPublicLinkHasBeenCreatedYet": {}, "knock": "Пагрукацца", "@knock": {}, "users": "Карыстальнікі", @@ -1955,18 +1712,6 @@ "@screenSharingTitle": {}, "screenSharingDetail": "Вы дзеліцеся экранам у FluffyChat", "@screenSharingDetail": {}, - "callingPermissions": "Дазволы на выклікі", - "@callingPermissions": {}, - "callingAccount": "Уліковы запіс для выклікаў", - "@callingAccount": {}, - "callingAccountDetails": "Дазваляе FluffyChat выкарыстоўваць сістэмную праграму для выклікаў.", - "@callingAccountDetails": {}, - "appearOnTop": "З'яўляцца зверху", - "@appearOnTop": {}, - "appearOnTopDetails": "Дазваляе праграму з'яўляцца наверсе (не патрэбна, калі FluffyChat наладжаны як уліковы запіс для выклікаў)", - "@appearOnTopDetails": {}, - "otherCallingPermissions": "Мікрафон, камера і іншыя дазволы FluffyChat", - "@otherCallingPermissions": {}, "whyIsThisMessageEncrypted": "Чаму гэта паведамленне нельга прачытаць?", "@whyIsThisMessageEncrypted": {}, "noKeyForThisMessage": "Гэта можа здарыцца з-за таго, што паведамленне было даслана да таго, як вы увайшлі ў уліковы запіс на гэтай прыладзе.\n\nТаксама верагодна, што адпраўшчык заблакіраваў вашу прыладу ці ў вас хібы з інтэрнэтам.\n\nВы можаце чытаць гэта паведамленне з іншага сеансу? Тад дашліце паведамленне адтуль! Перайдзіце ў Налады > Прылады і пераканайцеся ў тым, што вашы прылады верыфікавалі адна адну. Калі вы адкрыеце пакой наступны раз і абодве сэсіі будуць запушчаны, ключы павінны сінхранізавацца аўтаматычна.\n\nВы не хаціце згубіць клбчы, калі будзеце выходзіць ці змяняць прылады? Пераканайцеся ў тым, што вы уключылі рэзервовае капіраванне чатаў у наладах.", @@ -1975,23 +1720,8 @@ "@newGroup": {}, "newSpace": "Новая прастора", "@newSpace": {}, - "enterSpace": "Увайсці ў прастору", - "@enterSpace": {}, - "enterRoom": "Увайсці ў пакой", - "@enterRoom": {}, "allSpaces": "Усе прасторы", "@allSpaces": {}, - "numChats": "{number} чатаў", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Хаваць неабавязковыя падзеі статусу", - "@hideUnimportantStateEvents": {}, "hidePresences": "Хаваць спіс статусаў?", "@hidePresences": {}, "doNotShowAgain": "Не паказваць зноў", @@ -2051,8 +1781,6 @@ "@reportErrorDescription": {}, "report": "паскардзіцца", "@report": {}, - "signInWithPassword": "Увайсці з паролем", - "@signInWithPassword": {}, "manageAccount": "Кіраванне ўліковым запісам", "@manageAccount": {}, "noContactInformationProvided": "Сервер не мае ніякай вернай кантактнай інфармацыі", @@ -2106,8 +1834,6 @@ "@open": {}, "waitingForServer": "Чаканне сервера...", "@waitingForServer": {}, - "appIntroduction": "FluffyChat дазваляе вам і вашым сябрам размаўляць скрозь розныя мэсэнджары. Даведайцеся болей на https://matrix.org ці націсніце *Працягнуць*.", - "@appIntroduction": {}, "newChatRequest": "📩 Запыт новага чату", "@newChatRequest": {}, "contentNotificationSettings": "Налады паведамленняў кантэнту", @@ -2172,11 +1898,6 @@ "@moreEvents": {}, "declineInvitation": "Скасаваць запрашэнне", "@declineInvitation": {}, - "notificationsEnabledForThisAccount": "Паведамленні ўклбчаны для гжтага ўліковага запісу", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} карыстальнікаў пішуць…", "@numUsersTyping": { "type": "String", @@ -2236,11 +1957,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "Адкрыць камеру для відэа", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "oneClientLoggedOut": "Адзін з вашых кліентаў выйшаў", "@oneClientLoggedOut": {}, "addAccount": "Дадаць уліковы запіс", @@ -2292,14 +2008,8 @@ "type": "String", "placeholders": {} }, - "hideMemberChangesInPublicChats": "Хаваць змяненні ўдзельнікаў у публічных чатах", - "@hideMemberChangesInPublicChats": {}, - "hideMemberChangesInPublicChatsBody": "Не паказваць далучэнні і выхады з чату ў шкале часу для лепшай чытальнасці.", - "@hideMemberChangesInPublicChatsBody": {}, "overview": "Агляд", "@overview": {}, - "notifyMeFor": "Паведамляць мяне пра", - "@notifyMeFor": {}, "passwordRecoverySettings": "Налады скіду пароля", "@passwordRecoverySettings": {}, "passwordRecovery": "Аднаўленне пароля", @@ -2307,11 +2017,6 @@ "type": "String", "placeholders": {} }, - "people": "Людзі", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Абраць выяву", "@pickImage": { "type": "String", @@ -2331,11 +2036,6 @@ } } }, - "pleaseChoose": "Калі ласка, выберыце", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Калі ласка, выберыце код доступу", "@pleaseChooseAPasscode": { "type": "String", @@ -2351,8 +2051,6 @@ "type": "String", "placeholders": {} }, - "pleaseEnterRecoveryKey": "Увядзіце ключ аднаўлення:", - "@pleaseEnterRecoveryKey": {}, "pleaseEnterYourPassword": "Калі ласка, увядзіце ваш пароль", "@pleaseEnterYourPassword": { "type": "String", @@ -2454,11 +2152,6 @@ } } }, - "rejoin": "Далучыцца зноў", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "removeAllOtherDevices": "Выдаліць усе іншыя прылады", "@removeAllOtherDevices": { "type": "String", @@ -2473,11 +2166,6 @@ } } }, - "removeDevice": "Выдаліць прыладу", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Разблакіраваць у чаце", "@unbanFromChat": { "type": "String", @@ -2537,15 +2225,6 @@ "@recoveryKey": {}, "recoveryKeyLost": "Ключ абнаўлення страчаны?", "@recoveryKeyLost": {}, - "seenByUser": "Прагледжана {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Даслаць", "@send": { "type": "String", @@ -2589,16 +2268,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Даслаць арыгінал", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Даслаць стыкер", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Даслаць відэа", "@sendVideo": { "type": "String", @@ -2658,26 +2327,11 @@ } } }, - "separateChatTypes": "Падзяляць асобныя чаты і групы", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Задаць як асноўны псеўданім", "@setAsCanonicalAlias": { "type": "String", "placeholders": {} }, - "setCustomEmotes": "Задаць карыстальніцкі эмодзі", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Пазначыць прачытаным/непрачытаным", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Занадта шмат запытаў. Паспрабуйце пазней!", "@tooManyRequestsWarning": { "type": "String", @@ -2744,15 +2398,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 непрачытаны чат} other{{unreadCount} непрачытаных чатаў}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} і {count} іншых удзельнікаў пішуць…", "@userAndOthersAreTyping": { "type": "String", @@ -2870,8 +2515,6 @@ } } }, - "homeserverDescription": "Вашыя даныя захоўваюцца на дамашнім серверы, як у правайдара электронай пошты. Вы можаце самастойна абраць дамашні сервер, захоўвая пры тым магчымасць размаўляць. Даведайцеся болей на https://matrix.org.", - "@homeserverDescription": {}, "longPressToRecordVoiceMessage": "Доўга цісніце, каб запісаць галасавое паведамленне.", "@longPressToRecordVoiceMessage": {}, "visibilityOfTheChatHistory": "Бачнасць гісторыі чату", @@ -2884,29 +2527,12 @@ "type": "String", "placeholders": {} }, - "pleaseTryAgainLaterOrChooseDifferentServer": "Калі ласка, паспрабуйце пазней ці абярыце іншы сервер.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "signInWith": "Увайсці з {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "profileNotFound": "Карыстальнік не знойдзены на гэтым серверы. Гэта можа быць памылка сеткі ці карыстальніка не існуе.", - "@profileNotFound": {}, - "setTheme": "Тэма:", - "@setTheme": {}, "setColorTheme": "Каляровая схема:", "@setColorTheme": {}, "invite": "Запрасіць", "@invite": {}, "inviteGroupChat": "📨 Запрашэнне ў групавы чат", "@inviteGroupChat": {}, - "invitePrivateChat": "📨 Запрашэнне ў асобны чат", - "@invitePrivateChat": {}, "invalidInput": "Недапушчальны ўвод!", "@invalidInput": {}, "wrongPinEntered": "Няверны пін-код! Паспрабуйце праз {seconds} секунд...", @@ -2983,8 +2609,6 @@ "@createGroupAndInviteUsers": {}, "groupCanBeFoundViaSearch": "Група можа быць знойдзена праз пошук", "@groupCanBeFoundViaSearch": {}, - "startConversation": "Пачаць размову", - "@startConversation": {}, "commandHint_sendraw": "Даслаць толькі json", "@commandHint_sendraw": {}, "databaseMigrationTitle": "База даных аптымізавана", @@ -3007,8 +2631,6 @@ "@passwordsDoNotMatch": {}, "passwordIsWrong": "Вы ўвялі няверны пароль", "@passwordIsWrong": {}, - "publicLink": "Публічная спасылка", - "@publicLink": {}, "publicChatAddresses": "Публічныя адрасы чату", "@publicChatAddresses": {}, "createNewAddress": "Стварыць новы адрас", @@ -3019,25 +2641,10 @@ "@publicSpaces": {}, "addChatOrSubSpace": "Дадаць чат ці пад-прастору", "@addChatOrSubSpace": {}, - "subspace": "Пад-прастора", - "@subspace": {}, - "decline": "Адхіліць", - "@decline": {}, "thisDevice": "Гэта прылада:", "@thisDevice": {}, "initAppError": "Адбылася памылка пры ініцыялізацыі праграмы", "@initAppError": {}, - "userRole": "Роль карыстальніка", - "@userRole": {}, - "minimumPowerLevel": "{level} - мінімальны ўзровень дазволаў.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchIn": "Пошук у чаце \"{chat}\"...", "@searchIn": { "type": "String", @@ -3053,18 +2660,6 @@ "@gallery": {}, "files": "Файлы", "@files": {}, - "databaseBuildErrorBody": "Немагчыма стварыць базу даных SQlite. Праграма спрабуе выкарыстоўваць састарэлую базу. Калі ласка, паведаміце распрацоўшчыкам пра гэта: {url}. Паведамленне памылкі: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "Ваш сеанс страчаны. Калі ласка, паведаміце пра гэта распрацоўшчыкам: {url}. Паведамленне памылкі: {error}", "@sessionLostBody": { "type": "String", @@ -3077,15 +2672,6 @@ } } }, - "forwardMessageTo": "Пераслаць паведамленне ў {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "Дасылаць адзнаку аб чытанні", "@sendReadReceipts": {}, "sendReadReceiptsDescription": "Іншыя карыстальнікі чатаў будуць бачыць, калі вы прачыталі паведамленні.", @@ -3244,10 +2830,6 @@ "@sendCanceled": {}, "loginWithMatrixId": "Увайсці з Matrix-ID", "@loginWithMatrixId": {}, - "discoverHomeservers": "Даследаваць дамашнія сервера", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "Што такое дамашні сервер?", - "@whatIsAHomeserver": {}, "doesNotSeemToBeAValidHomeserver": "Гэта не выглядае як дамашні сервер. Няслушны URL?", "@doesNotSeemToBeAValidHomeserver": {}, "calculatingFileSize": "Вылічэнне памеру файла...", @@ -3390,14 +2972,6 @@ "@pause": {}, "resume": "Працягнуць", "@resume": {}, - "newSubSpace": "Новая пад-прастора", - "@newSubSpace": {}, - "moveToDifferentSpace": "Перамясціцца ў іншую прастору", - "@moveToDifferentSpace": {}, - "moveUp": "Перамясціць вышэй", - "@moveUp": {}, - "moveDown": "Перамясціць ніжэй", - "@moveDown": {}, "removeFromSpaceDescription": "Гэты чат будзе выдалены з прасторы, але з'явіцца ў вашым спісе чатаў.", "@removeFromSpaceDescription": {}, "countChats": "{chats} чатаў", @@ -3437,8 +3011,6 @@ "@endPoll": {}, "answersVisible": "Адказы бачны", "@answersVisible": {}, - "answersHidden": "Адказы схаваны", - "@answersHidden": {}, "pollQuestion": "Пытанне апытання", "@pollQuestion": {}, "answerOption": "Варыянт адказу", @@ -3499,4 +3071,4 @@ "@loadingMessages": {}, "setupChatBackup": "Наладзіць рэзервовае капіраванне чатаў", "@setupChatBackup": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_bn.arb b/lib/l10n/intl_bn.arb index fa010fdf..df16f69a 100644 --- a/lib/l10n/intl_bn.arb +++ b/lib/l10n/intl_bn.arb @@ -32,8 +32,6 @@ "@repeatPassword": {}, "notAnImage": "ইমেজ ফাইল না।", "@notAnImage": {}, - "setCustomPermissionLevel": "কাস্টম অনুমতি লেভেল ঠিক করো", - "@setCustomPermissionLevel": {}, "admin": "অ্যাডমিস", "@admin": { "type": "String", @@ -69,16 +67,6 @@ "type": "String", "placeholders": {} }, - "confirm": "নিশ্চিত করো", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "কানেক্ট", - "@connect": { - "type": "String", - "placeholders": {} - }, "copy": "অনুলিপি", "@copy": { "type": "String", @@ -89,18 +77,6 @@ "type": "String", "placeholders": {} }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "delete": "অপসারণ", "@delete": { "type": "String", @@ -161,11 +137,6 @@ "type": "String", "placeholders": {} }, - "identity": "পরিচয়", - "@identity": { - "type": "String", - "placeholders": {} - }, "invited": "আমন্ত্রিত", "@invited": { "type": "String", @@ -181,14 +152,9 @@ "type": "String", "placeholders": {} }, - "license": "অনুমতিপত্র (লাইসেন্স)", - "@license": { - "type": "String", - "placeholders": {} - }, "login": "প্রবেশ", "@login": { "type": "String", "placeholders": {} } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_bo.arb b/lib/l10n/intl_bo.arb index f6b08666..8335f1c3 100644 --- a/lib/l10n/intl_bo.arb +++ b/lib/l10n/intl_bo.arb @@ -27,15 +27,7 @@ "type": "String", "placeholders": {} }, - "@connect": { - "type": "String", - "placeholders": {} - }, "@jumpToLastReadMessage": {}, - "@allRooms": { - "type": "String", - "placeholders": {} - }, "@obtainingLocation": { "type": "String", "placeholders": {} @@ -45,7 +37,6 @@ "type": "String", "placeholders": {} }, - "@widgetVideo": {}, "@dismiss": {}, "@unknownDevice": { "type": "String", @@ -68,10 +59,6 @@ "type": "String", "placeholders": {} }, - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "@inviteContactToGroup": { "type": "String", "placeholders": { @@ -89,7 +76,6 @@ "type": "String", "placeholders": {} }, - "@chatHasBeenAddedToThisSpace": {}, "@reply": { "type": "String", "placeholders": {} @@ -115,7 +101,6 @@ "type": "String", "description": "Usage hint for the command /html" }, - "@widgetJitsi": {}, "@youAreNoLongerParticipatingInThisChat": { "type": "String", "placeholders": {} @@ -125,12 +110,7 @@ "placeholders": {} }, "@messageType": {}, - "@indexedDbErrorLong": {}, "@oneClientLoggedOut": {}, - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "@unsupportedAndroidVersionLong": {}, "@kicked": { "type": "String", @@ -172,8 +152,6 @@ "type": "String", "placeholders": {} }, - "@startFirstChat": {}, - "@callingAccount": {}, "@requestPermission": { "type": "String", "placeholders": {} @@ -202,15 +180,10 @@ } }, "@setColorTheme": {}, - "@nextAccount": {}, "@commandHint_create": { "type": "String", "description": "Usage hint for the command /create" }, - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "@warning": { "type": "String", "placeholders": {} @@ -312,7 +285,6 @@ "type": "String", "placeholders": {} }, - "@widgetEtherpad": {}, "@waitingPartnerAcceptRequest": { "type": "String", "placeholders": {} @@ -353,10 +325,6 @@ } } }, - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "@tryAgain": {}, "@areGuestsAllowedToJoin": { "type": "String", @@ -373,21 +341,6 @@ } } }, - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "@unbanUserDescription": {}, "@userAndUserAreTyping": { "type": "String", @@ -422,7 +375,6 @@ } }, "@youRejectedTheInvitation": {}, - "@otherCallingPermissions": {}, "@messagesStyle": {}, "@couldNotDecryptMessage": { "type": "String", @@ -437,11 +389,8 @@ "placeholders": {} }, "@link": {}, - "@widgetUrlError": {}, - "@emailOrUsername": {}, "@newSpaceDescription": {}, "@chatDescription": {}, - "@callingAccountDetails": {}, "@next": { "type": "String", "placeholders": {} @@ -458,25 +407,10 @@ } } }, - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "@editRoomAliases": { "type": "String", "placeholders": {} }, - "@enterSpace": {}, "@encryptThisChat": {}, "@fileName": { "type": "String", @@ -486,7 +420,6 @@ "type": "String", "placeholders": {} }, - "@previousAccount": {}, "@publicRooms": { "type": "String", "placeholders": {} @@ -503,20 +436,11 @@ "type": "String", "placeholders": {} }, - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "@reopenChat": {}, - "@pleaseEnterRecoveryKey": {}, "@create": { "type": "String", "placeholders": {} }, - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "@no": { "type": "String", "placeholders": {} @@ -525,7 +449,6 @@ "type": "String", "placeholders": {} }, - "@widgetNameError": {}, "@inoffensive": { "type": "String", "placeholders": {} @@ -543,7 +466,6 @@ "type": "String", "placeholders": {} }, - "@addWidget": {}, "@all": { "type": "String", "placeholders": {} @@ -596,7 +518,6 @@ } } }, - "@hydrateTor": {}, "@pushNotificationsNotAvailable": {}, "@passwordRecovery": { "type": "String", @@ -647,7 +568,6 @@ "type": "String", "placeholders": {} }, - "@signInWithPassword": {}, "@ignoredUsers": { "type": "String", "placeholders": {} @@ -712,10 +632,6 @@ "type": "String", "placeholders": {} }, - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "@commandHint_clearcache": { "type": "String", "description": "Usage hint for the command /clearcache" @@ -739,14 +655,6 @@ "placeholders": {} }, "@whyIsThisMessageEncrypted": {}, - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "@rejectedTheInvitation": { "type": "String", "placeholders": { @@ -769,19 +677,11 @@ "placeholders": {} }, "@importFromZipFile": {}, - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "@or": { "type": "String", "placeholders": {} }, "@dehydrateWarning": {}, - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "@noOtherDevicesFound": {}, "@whoIsAllowedToJoinThisGroup": { "type": "String", @@ -791,14 +691,6 @@ "type": "String", "placeholders": {} }, - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "@storeSecurlyOnThisDevice": {}, "@yourChatBackupHasBeenSetUp": {}, "@chatBackup": { @@ -862,18 +754,6 @@ "type": "String", "placeholders": {} }, - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "@username": { "type": "String", "placeholders": {} @@ -896,10 +776,6 @@ "type": "String", "placeholders": {} }, - "@people": { - "type": "String", - "placeholders": {} - }, "@changedTheHistoryVisibilityTo": { "type": "String", "placeholders": { @@ -932,7 +808,6 @@ } } }, - "@callingPermissions": {}, "@delete": { "type": "String", "placeholders": {} @@ -956,18 +831,6 @@ "placeholders": {} }, "@unlockOldMessages": {}, - "@identity": { - "type": "String", - "placeholders": {} - }, - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "@changedTheJoinRulesTo": { "type": "String", "placeholders": { @@ -1067,10 +930,6 @@ "@sendAsText": { "type": "String" }, - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "@archiveRoomDescription": {}, "@exportEmotePack": {}, "@changedTheChatNameTo": { @@ -1084,22 +943,10 @@ } } }, - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "@account": { "type": "String", "placeholders": {} }, - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "@commandInvalid": { "type": "String" }, @@ -1170,7 +1017,6 @@ "type": "String", "placeholders": {} }, - "@inviteContactToGroupQuestion": {}, "@emoteExists": { "type": "String", "placeholders": {} @@ -1213,12 +1059,10 @@ "type": "String", "placeholders": {} }, - "@appearOnTopDetails": {}, "@roomHasBeenUpgraded": { "type": "String", "placeholders": {} }, - "@enterRoom": {}, "@enableEmotesGlobally": { "type": "String", "placeholders": {} @@ -1276,17 +1120,6 @@ } }, "@confirmEventUnpin": {}, - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "@youInvitedUser": { "placeholders": { "user": { @@ -1317,10 +1150,6 @@ } } }, - "@license": { - "type": "String", - "placeholders": {} - }, "@addToSpace": {}, "@unbanFromChat": { "type": "String", @@ -1336,10 +1165,6 @@ "description": "State that {command} is not a valid /command." }, "@redactMessageDescription": {}, - "@rejoin": { - "type": "String", - "placeholders": {} - }, "@recoveryKey": {}, "@redactMessage": { "type": "String", @@ -1366,7 +1191,6 @@ "type": "String", "placeholders": {} }, - "@dehydrateTorLong": {}, "@yourPublicKey": { "type": "String", "placeholders": {} @@ -1428,10 +1252,6 @@ "type": "String", "placeholders": {} }, - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "@joinRoom": { "type": "String", "placeholders": {} @@ -1446,9 +1266,7 @@ "placeholders": {} }, "@serverRequiresEmail": {}, - "@hideUnimportantStateEvents": {}, "@screenSharingTitle": {}, - "@widgetCustom": {}, "@sentCallInformations": { "type": "String", "placeholders": { @@ -1457,7 +1275,6 @@ } } }, - "@addToSpaceDescription": {}, "@googlyEyesContent": { "type": "String", "placeholders": { @@ -1485,7 +1302,6 @@ "type": "String", "placeholders": {} }, - "@addChatDescription": {}, "@sentAnAudio": { "type": "String", "placeholders": { @@ -1521,7 +1337,6 @@ } } }, - "@publish": {}, "@openLinkInBrowser": {}, "@clearArchive": {}, "@appLock": { @@ -1569,8 +1384,6 @@ "placeholders": {} }, "@inviteGroupChat": {}, - "@appearOnTop": {}, - "@invitePrivateChat": {}, "@verifyTitle": { "type": "String", "placeholders": {} @@ -1606,10 +1419,6 @@ "description": "Usage hint for the command /ban" }, "@importEmojis": {}, - "@confirm": { - "type": "String", - "placeholders": {} - }, "@wasDirectChatDisplayName": { "type": "String", "placeholders": { @@ -1660,7 +1469,6 @@ }, "@newGroup": {}, "@bundleName": {}, - "@dehydrateTor": {}, "@removeFromSpace": {}, "@dateAndTimeOfDay": { "type": "String", @@ -1730,7 +1538,6 @@ } } }, - "@profileNotFound": {}, "@jump": {}, "@groups": { "type": "String", @@ -1759,14 +1566,6 @@ } }, "@sorryThatsNotPossible": {}, - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "@oopsSomethingWentWrong": { "type": "String", "placeholders": {} @@ -1798,10 +1597,6 @@ } } }, - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "@messages": { "type": "String", "placeholders": {} @@ -1831,10 +1626,6 @@ "type": "String", "placeholders": {} }, - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "@startedACall": { "type": "String", "placeholders": { @@ -1851,10 +1642,6 @@ "type": "String", "placeholders": {} }, - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "@deleteMessage": { "type": "String", "placeholders": {} @@ -1867,20 +1654,11 @@ "type": "String", "placeholders": {} }, - "@setTheme": {}, "@changeTheHomeserver": { "type": "String", "placeholders": {} }, "@youJoinedTheChat": {}, - "@wallpaper": { - "type": "String", - "placeholders": {} - }, - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "@play": { "type": "String", "placeholders": { @@ -1914,7 +1692,6 @@ "type": "String", "placeholders": {} }, - "@widgetName": {}, "@sentASticker": { "type": "String", "placeholders": { @@ -1923,7 +1700,6 @@ } } }, - "@errorAddingWidget": {}, "@commandHint_dm": { "type": "String", "description": "Usage hint for the command /dm" @@ -2003,16 +1779,11 @@ "type": "String", "placeholders": {} }, - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "@share": { "type": "String", "placeholders": {} }, "@commandHint_googly": {}, - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "@createGroup": {}, "@privacy": { "type": "String", @@ -2026,16 +1797,7 @@ "type": "String", "placeholders": {} }, - "@hydrateTorLong": {}, "@time": {}, - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, - "@botMessages": { - "type": "String", - "placeholders": {} - }, "@contentHasBeenReported": { "type": "String", "placeholders": {} @@ -2070,10 +1832,6 @@ "type": "String", "placeholders": {} }, - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "@pinMessage": {}, "@screenSharingDetail": {}, "@muteChat": { @@ -2090,7 +1848,6 @@ "type": "String", "placeholders": {} }, - "@indexedDbErrorTitle": {}, "@endedTheCall": { "type": "String", "placeholders": { @@ -2099,4 +1856,4 @@ } } } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_ca.arb b/lib/l10n/intl_ca.arb index 05148753..796ba782 100644 --- a/lib/l10n/intl_ca.arb +++ b/lib/l10n/intl_ca.arb @@ -123,11 +123,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Missatges del bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Cancel·la", "@cancel": { "type": "String", @@ -364,31 +359,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Confirma", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Connecta", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "El contacte ha estat convidat al grup", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Conté l'àlies", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Inclou nom d'usuàriï", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "copiedToClipboard": "S’ha copiat al porta-retalls", "@copiedToClipboard": { "type": "String", @@ -453,33 +428,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Es desactivarà el vostre compte d’usuàriï. És irreversible! Voleu fer-ho igualment?", "@deactivateAccountWarning": { "type": "String", @@ -565,11 +513,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Has de seleccionar un codi d'emoticona i una imatge!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Xat buit", "@emptyChat": { "type": "String", @@ -614,11 +557,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Introdueix el teu servidor", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "fileName": "Nom del fitxer", "@fileName": { "type": "String", @@ -705,11 +643,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identitat", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignoredUsers": "Usuaris ignorats", "@ignoredUsers": { "type": "String", @@ -761,11 +694,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Invitació per a mi", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} t'ha convidat a FluffyChat.\n1. Visita fluffychat.im i instaŀla l'app\n2. Registra't o inicia sessió\n3. Obre l'enllaç d'invitació:\n{link}", "@inviteText": { "type": "String", @@ -845,11 +773,6 @@ "type": "String", "placeholders": {} }, - "license": "Llicència", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Clar", "@lightTheme": { "type": "String", @@ -903,11 +826,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Canvis de participants", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Menciona", "@mention": { "type": "String", @@ -983,11 +901,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notificacions activades per a aquest compte", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} usuàriïs escrivint…", "@numUsersTyping": { "type": "String", @@ -1149,11 +1062,6 @@ } } }, - "rejoin": "Torna-t'hi a unir", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Elimina", "@remove": { "type": "String", @@ -1173,11 +1081,6 @@ } } }, - "removeDevice": "Elimina dispositiu", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Aixeca el veto", "@unbanFromChat": { "type": "String", @@ -1203,15 +1106,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Vist per {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Envia", "@send": { "type": "String", @@ -1241,16 +1135,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Envia l’original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Envia adhesiu", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Envia un vídeo", "@sendVideo": { "type": "String", @@ -1310,16 +1194,6 @@ } } }, - "setInvitationLink": "Defineix l’enllaç per a convidar", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Defineix el nivell de permisos", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Defineix l’estat", "@setStatus": { "type": "String", @@ -1344,11 +1218,6 @@ } } }, - "singlesignon": "Autenticació única", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Omet", "@skip": { "type": "String", @@ -1399,11 +1268,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "Marca com a llegit/sense llegir", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Massa sol·licituds. Torna-ho a provar més tard!", "@tooManyRequestsWarning": { "type": "String", @@ -1465,15 +1329,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 xat no llegit} other{{unreadCount} xats no llegits}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} i {count} més estan escrivint…", "@userAndOthersAreTyping": { "type": "String", @@ -1588,11 +1443,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Fons:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Atenció!", "@warning": { "type": "String", @@ -1668,22 +1518,12 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Ves a la sala nova", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "next": "Següent", "@next": { "type": "String", "placeholders": {} }, "link": "Enllaç", - "people": "Gent", - "@people": { - "type": "String", - "placeholders": {} - }, "redactMessage": "Estripa el missatge", "@redactMessage": { "type": "String", @@ -1696,7 +1536,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "El xat s’ha afegit a aquest espai", "autoplayImages": "Reprodueix automàticament enganxines i emoticones animades", "@autoplayImages": { "type": "String", @@ -1814,26 +1653,11 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Commuta l’estat «preferit»", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Commuta l’estat «silenci»", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "transferFromAnotherDevice": "Transfereix des d’un altre dispositiu", "@transferFromAnotherDevice": { "type": "String", "placeholders": {} }, - "setCustomEmotes": "Defineix emoticones personalitzades", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "whoCanPerformWhichAction": "Qui pot efectuar quina acció", "@whoCanPerformWhichAction": { "type": "String", @@ -2030,13 +1854,7 @@ } }, "jumpToLastReadMessage": "Salta a l'últim missatge llegit", - "allRooms": "Tots els xats de grup", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "commandHint_cuddle": "Envia una carícia", - "widgetVideo": "Vídeo", "dismiss": "Ignora-ho", "reportErrorDescription": "😭 Oh no. Hi ha hagut algun error. Si vols, pots informar d'aquest bug a l'equip de desenvolupament.", "removeYourAvatar": "Esborra el teu avatar", @@ -2045,14 +1863,9 @@ "placeholders": {} }, "unsupportedAndroidVersion": "Aquesta versió d'Android és incompatible", - "widgetJitsi": "Jitsi Meet", "messageType": "Tipus de missatge", - "indexedDbErrorLong": "L'emmagatzematge de missatges no està disponible per defecte en el mode privat.\nVisita\n - about:config\n - posa a true l'opció dom.indexedDB.privateBrowsing.enabled\nSi no ho fas, no podràs fer servir FluffyChat en mode privat.", "oneClientLoggedOut": "Una de les teves aplicacions ha tancat la sessió", - "startFirstChat": "Comença el teu primer xat", - "callingAccount": "Compte de la trucada", "setColorTheme": "Tria el color del tema:", - "nextAccount": "Compte següent", "allSpaces": "Tots els espais", "supposedMxid": "Això hauria de ser {mxid}", "@supposedMxid": { @@ -2086,13 +1899,7 @@ } }, "banUserDescription": "Es vetarà li usuàriï al xat i no podrà tornar-hi a entrar fins que se li aixequi el veto.", - "widgetEtherpad": "Nota de text", "removeDevicesDescription": "Tancaràs la sessió d'aquest dispositiu i no hi podràs rebre més missatges.", - "separateChatTypes": "Separa xats directes i grups", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "tryAgain": "Torna-ho a provar", "youKickedAndBanned": "🙅 Has expulsat i vetat a {user}", "@youKickedAndBanned": { @@ -2104,31 +1911,22 @@ }, "unbanUserDescription": "L'usuàrïi ja pot tornar a entrar al xat.", "youRejectedTheInvitation": "Has rebutjat la invitació", - "otherCallingPermissions": "Micròfon, càmera i altres permisos del FluffyChat", "messagesStyle": "Missatges:", - "widgetUrlError": "La URL no és vàlida.", - "emailOrUsername": "Email o nom d'usuàrïi", "newSpaceDescription": "Els espais et permeten consolidar els teus xats i construir comunitats públiques o privades.", "chatDescription": "Descripció del xat", - "callingAccountDetails": "Permet al FluffyChat de fer servir l'app de trucades nativa de l'Android.", "editRoomAliases": "Canvia els àlies de la sala", "@editRoomAliases": { "type": "String", "placeholders": {} }, - "enterSpace": "Obre l'espai", "encryptThisChat": "Xifra aquest xat", - "previousAccount": "Compte anterior", "reopenChat": "Reobre el xat", - "pleaseEnterRecoveryKey": "Introdueix la teva clau de recuperació:", - "widgetNameError": "Posa el nom públic.", "inoffensive": "Inofensiu", "@inoffensive": { "type": "String", "placeholders": {} }, "addToBundle": "Afegeix al pquet", - "addWidget": "Afegeix un giny", "countFiles": "{count} arxius", "@countFiles": { "placeholders": { @@ -2139,7 +1937,6 @@ }, "noKeyForThisMessage": "Això pot passar si el missatge es va enviar abans que haguessis iniciat sessió al teu compte des d'aquest dispositiu.\n\nTambé pot ser que l'emissor hagi bloquejat el teu dispositiu o que la connexió a internet anés malament.\n\nQue pots llegir el missatge des d'una altra sessió? Si és així, llavors pots transferir-lo! Ves a Paràmetres → Dispositius i assegura't que els teus dispositius s'ha verificat mútuament. Quan obris la sala la propera vegada i totes dues sessions estiguin executant-se, en primer pla, llavors les claus es trasnsmetran automàticament.\n\nVols evitar perdre les claus en tancar la sessió o en canviar de dispositiu? Llavors assegura't que has activat la còpia de seguretat del xat als paràmetres.", "commandHint_markasgroup": "Marca com un grup", - "hydrateTor": "Usuàrïis de Tor: Importa una sessió anterior", "pushNotificationsNotAvailable": "Les notificacions push no estan disponibles", "storeInAppleKeyChain": "Desa en la Apple KeyChain", "replaceRoomWithNewerVersion": "Substitueix la sala amb la versió més recent", @@ -2152,7 +1949,6 @@ "chatPermissions": "Permisos del xat", "sender": "Remitent", "storeInAndroidKeystore": "Desa en la Android KeyStore", - "signInWithPassword": "Inicia sessió amb contrasenya", "offensive": "Ofensiu", "@offensive": { "type": "String", @@ -2181,18 +1977,8 @@ "type": "String", "placeholders": {} }, - "signInWith": "Inicia sessió amb {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "fileIsTooBigForServer": "No s'ha pogut enviar! El servidor només accepta adjunts de fins a {max}.", "homeserver": "Servidor", - "callingPermissions": "Permisos de trucada", "readUpToHere": "Llegit fins aquí", "start": "Comença", "register": "Registra't", @@ -2201,28 +1987,10 @@ "placeholders": {} }, "unlockOldMessages": "Desbloqueja els missatges antics", - "numChats": "{number} xats", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "optionalRedactReason": "(Opcional) El motiu per estripar el missatge...", "dehydrate": "Exporta la sessió i neteja el dispositiu", "archiveRoomDescription": "Aquest xat serà arxivat. Els altres contactes del grup ho veuran com si haguessis abandonat el xat.", "exportEmotePack": "Exporta com un pack Emote en .zip", - "switchToAccount": "Canvia al compte {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "experimentalVideoCalls": "Trucades de vídeo experimentals", "pleaseEnterRecoveryKeyDescription": "Per desbloquejar els missatges antics, introdueix la clau de recuperació que vas generar en una sessió anterior. La clau de recuperació NO és la teva contrasenya.", "openInMaps": "Obre als mapes", @@ -2230,7 +1998,6 @@ "type": "String", "placeholders": {} }, - "inviteContactToGroupQuestion": "Vols convidar {contact} al xat \"{groupName}\"?", "redactedByBecause": "Estripat per {username} per: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2251,22 +2018,8 @@ } } }, - "appearOnTopDetails": "Permet a l'app que aparegui sobre d'altres apps. No cal si ja has afegit FluffyChat com a compte de trucades", - "enterRoom": "Entra a la sala", "reportUser": "Denuncia l'usuàrïi", "confirmEventUnpin": "Vols desfixar l'esdeveniment permanentment?", - "badServerVersionsException": "Aquest servidor suporta aquestes versions de Matrix:\n{serverVersions}\nPerò aquesta aplicación només és compatible amb {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "youInvitedUser": "📩 Has convidat a {user}", "@youInvitedUser": { "placeholders": { @@ -2287,14 +2040,10 @@ "redactMessageDescription": "S'estriparà el missatge per a totser d'aquesta conversa. Aquesta acció és irreversible.", "recoveryKey": "Clau de recuperació", "invalidInput": "L'entrada no és vàlida!", - "dehydrateTorLong": "Per a lis usuàrïis de Tor, es recomana exportar la sessió abans de tancar la finestra.", "doNotShowAgain": "No ho tornis a mostrar", "report": "informa", "serverRequiresEmail": "Aquest servidor necessita validar la teva adreça per registrar-t'hi.", - "hideUnimportantStateEvents": "Amaga canvis d'estat poc importants", "screenSharingTitle": "compartició de pantalla", - "widgetCustom": "Personalització", - "addToSpaceDescription": "Tria un espai per afegir-hi el xat.", "googlyEyesContent": "{senderName} t'ha enviat un parell d'ulls", "@googlyEyesContent": { "type": "String", @@ -2312,7 +2061,6 @@ } } }, - "addChatDescription": "Afegeix una descripció al xat...", "editRoomAvatar": "Canvia la imatge de la sala", "@editRoomAvatar": { "type": "String", @@ -2326,7 +2074,6 @@ } } }, - "publish": "Publica", "openLinkInBrowser": "Obre l'enllaç en un navegador", "messageInfo": "Informació del missatge", "disableEncryptionWarning": "Per motius de seguretat, un cop activat, no es pot desactivar el xifratge.", @@ -2342,8 +2089,6 @@ }, "sendTypingNotifications": "Envia notificacions d'escriptura", "inviteGroupChat": "📨 Invitació de grup", - "appearOnTop": "Mostra per sobre", - "invitePrivateChat": "📨 Invitació a un xat privat", "foregroundServiceRunning": "Aquesta notificació apareix quan el servei de primer pla està corrent.", "voiceCall": "Videotrucada", "commandHint_unban": "Aixeca el veto a aquesti usuàriï per aquesta sala", @@ -2371,7 +2116,6 @@ "chatDescriptionHasBeenChanged": "Ha canviat la descripció del xat", "newGroup": "Grup nou", "bundleName": "Nom del paquet", - "dehydrateTor": "Usuàrïis de Tor: Exporta la sessió", "removeFromSpace": "Esborra de l'espai", "roomUpgradeDescription": "El xat serà recreat amb una versió de sala nova. Totis lis participants seran notificadis que han de canviar al nou xat. Pots llegir més sobre les versions de sala a https://spec.matrix.org/latest/rooms/", "pleaseEnterANumber": "Introdueix un número major que 0", @@ -2383,7 +2127,6 @@ } } }, - "profileNotFound": "No s'ha trobat el compte en aquest servidor. Pot ser un error de connexió, o que realment no existeixi.", "jump": "Salta", "reactedWith": "{sender} ha reaccionat amb {reaction}", "@reactedWith": { @@ -2398,15 +2141,6 @@ } }, "sorryThatsNotPossible": "Aquesta acció no és possible", - "videoWithSize": "Vídeo {size}", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "shareInviteLink": "Comparteix un enllaç d'invitació", "commandHint_markasdm": "Marca com a conversa directa la sala amb aquesta ID de Matrix", "recoveryKeyLost": "Que has perdut la clau de recuperació?", @@ -2425,16 +2159,8 @@ "type": "String", "placeholders": {} }, - "setTheme": "Tria el tema:", "youJoinedTheChat": "T'has afegit al xat", - "openVideoCamera": "Obre la càmera per a fer un vídeo", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "markAsRead": "Marca com a llegit", - "widgetName": "Nom", - "errorAddingWidget": "S'ha produït un error en afegir el giny.", "commandHint_hug": "Envia una abraçada", "replace": "Reemplaça", "oopsPushError": "Ep! Sembla que s'ha produït un error en configurar les notificacions.", @@ -2457,15 +2183,8 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Escull", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "commandHint_googly": "Envia uns ulls curiosos", - "pleaseTryAgainLaterOrChooseDifferentServer": "Torna-ho a provar més tard o tria un servidor diferent.", "createGroup": "Crea un grup", - "hydrateTorLong": "Que vas exportar la teva última sessió a Tor? La pots importar ara i continuar xatejant.", "time": "Temps", "custom": "Personalitzat", "noBackupWarning": "Compte! Si no actives la còpia de seguretat dels xats, perdràs accés als teus missatges xifrats. És molt recomanable activar-ho abans de tancar la sessió.", @@ -2476,7 +2195,6 @@ "pinMessage": "Fixa a la sala", "invite": "Convida", "enableMultiAccounts": "(Beta) Activa multi-compte en aquest dispositiu", - "indexedDbErrorTitle": "Problemes amb el mode privat", "unsupportedAndroidVersionLong": "Aquesta funcionalitat només funciona amb versions d'Android més noves.", "storeSecurlyOnThisDevice": "Desa de forma segura en aquest dispositiu", "screenSharingDetail": "Estàs compartint la teva pantalla a FluffyChat", @@ -2486,22 +2204,12 @@ "blockedUsers": "Usuàrïis blocadis", "blockListDescription": "Pots bloquejar usuàrïis que et molestin. No rebràs missatges seus ni invitacions de part seva a cap sala.", "pleaseChooseAStrongPassword": "Tria una contrasenya forta", - "youInvitedToBy": "📩 T'han enviat un enllaç d'invitació per:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "groupName": "Nom del grup", "createGroupAndInviteUsers": "Crea un grup i convida-hi usuàrïis", "wrongRecoveryKey": "Malauradament, aquesta clau de recuperació no és la correcta.", - "publicLink": "Enllaç públic", "transparent": "Transparent", "sendReadReceiptsDescription": "Lis altris participants d'un xat poden veure quan has llegit un missatge.", "yourGlobalUserIdIs": "La teva ID global és: ", - "startConversation": "Comença una conversa", "commandHint_sendraw": "Envia un json pelat", "databaseMigrationTitle": "La base de dades ha estat optimitzada", "pleaseEnterYourCurrentPassword": "Fica la teva contrasenya actual", @@ -2522,18 +2230,6 @@ "formattedMessagesDescription": "Mostra contingut amb format enriquit com text en cursiva, fent servir markdown.", "verifyOtherUser": "🔐 Verifica uni altri usuàrïi", "verifyOtherDevice": "🔐 Verifica un altre dispositiu", - "databaseBuildErrorBody": "No s'ha pogut construir la base de dades SQLite. L'aplicació provarà de fer servir un format de base de dades antiquat. Si us plau, comunica aquesta situació a la comunitat de desenvolupament a {url}. El missatge d'error és: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "initAppError": "S'ha produït un error mentre s'inicialitzava l'aplicació", "hidePresences": "Amagar la llista de Status?", "noUsersFoundWithQuery": "No s'ha trobat cap usuàrïi amb \"{query}\". Revisa si ho has escrit malament.", @@ -2548,17 +2244,10 @@ "leaveEmptyToClearStatus": "Per esborrar el teu estat, deixa-ho en blanc.", "select": "Tria", "searchForUsers": "Cerca @usuariïs...", - "subspace": "Subespai", "addChatOrSubSpace": "Afegeix un xat o un subespai", - "decline": "Denega", "sendReadReceipts": "Envia informes de tecleig", "sendTypingNotificationsDescription": "Lis altris participants d'un xat poden veure quan estàs teclejant un missatge nou.", "incomingMessages": "Missatge d'entrada", - "presenceStyle": "Presència:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "acceptedKeyVerification": "{sender} ha acceptat la verificació de claus", "@acceptedKeyVerification": { "type": "String", @@ -2616,15 +2305,6 @@ } } }, - "forwardMessageTo": "Vols reenviar el missatge a {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "verifyOtherUserDescription": "Si verifiques aquesti usuàrïi, podràs estar seguri de a qui estàs escrivint. . 💪\n\nQuan inicies una verificació, l'altra persona i tu veureu un missatge emergent a l'app. Us sortiran un seguit d'emojis o números a cada pantalla, que haureu de comparar.\n\nLa millor manera de fer-ho és quedar en persona o fer una vídeo-trucada. 👭", "verifyOtherDeviceDescription": "Quan verifiques un altre dispositiu, aquests poden intercanviar claus, així que es millora la seguretat total. 💪 Quan comences una verificació, apareixerà un missatge emergent a tots dos dispositius. A cadascun hi apareixerà un seguit d'emojis o de números que hauràs de comparar. El millor és tenir tots dos dispositius a mà abans d'iniciar la verificació. 🤳", "requestedKeyVerification": "{sender} ha soŀlicitat verificar claus", @@ -2656,7 +2336,6 @@ "commandHint_unignore": "Deixa d'ignorar el compt de matrix especificat", "sendCanceled": "S'ha canceŀlat l'enviament", "noChatsFoundHere": "Encara no hi ha xats. Obre una conversa amb algú picant al botó de sota. ⤵️", - "hideMemberChangesInPublicChatsBody": "No mostres a l'històric de conversa de les sales públiques quan algú hi entra o surt. Això facilita la lectura.", "invitedBy": "📩 Convidadi per {user}", "@invitedBy": { "placeholders": { @@ -2715,32 +2394,12 @@ "calls": "Trucades", "hideRedactedMessages": "Amaga els missatges estripats", "hideInvalidOrUnknownMessageFormats": "Amaga els missatges que tinguin un format desconegut", - "hideMemberChangesInPublicChats": "Amaga els canvis d'estat de lis membres a les sales públiques", - "notifyMeFor": "Nofica'm que", "overview": "Resum", "passwordRecoverySettings": "Recuperació de contrasenya", - "userRole": "Rol d'usuàriï", - "minimumPowerLevel": "El nivell mínim de permisos és {level}.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "gallery": "Galeria", "noDatabaseEncryption": "No es pot xifrar la base de dades en aquesta plataforma", "usersMustKnock": "Lis membres han de picar a la porta", "noOneCanJoin": "Ningú s'hi pot ficar", - "userWouldLikeToChangeTheChat": "{user} vol entrar al xat.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "customEmojisAndStickersBody": "Afegeix o comparteix emojis o stickers. Els podràs fer servir en qualsevol conversa.", "hideRedactedMessagesBody": "Si algú estripa un missatge, ja no apareixerà a l'historial de la conversa.", "searchIn": "Cerca al xat \"{chat}\"...", @@ -2792,28 +2451,11 @@ "count": {} }, "loginWithMatrixId": "Entra amb l'id de Matrix", - "discoverHomeservers": "Descobreix servidors", - "whatIsAHomeserver": "Què és un servidor de Matrix?", - "homeserverDescription": "Totes les teves dades s'emmagatzemen al servidor, com passa amb el e-mail. Pots triar quin servidor vols fer servir sense témer a no poder comunicar gent d'altres servidors. Llegeix-ne més a https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "No sembla un servidor compatible. Pot ser que la URL estigui malament?", - "countChatsAndCountParticipants": "{chats} xats i {participants} participants", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "No hi ha més xats...", "space": "Espai", - "joinedChats": "Xats on has entrat", "unread": "Sense llegir", "spaces": "Espais", - "noPublicLinkHasBeenCreatedYet": "No s'ha creat cap enllaç públic", "chatCanBeDiscoveredViaSearchOnServer": "El xat es pot descobrir amb la cerca de {server}", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2974,7 +2616,6 @@ }, "appWantsToUseForLoginDescription": "Consenteixes que l'app i la web comparteixen informació sobre tu.", "open": "Obre", - "appIntroduction": "El FluffyChat et permet xatejar amb amiguis entre diverses aplicacions. Llegeix-ne més a https://matrix.org o pica \"Continua\".", "waitingForServer": "S'està esperant el servidor...", "shareKeysWith": "Comparteix les claus amb...", "crossVerifiedDevicesIfEnabled": "Els dispositius verificats mútuament, si està activat", @@ -2984,10 +2625,7 @@ "optionalMessage": "(Opcional) missatge...", "enterNewChat": "Entra al nou xat", "notSupportedOnThisDevice": "No suportat en aquest dispositiu", - "setCustomPermissionLevel": "Afegeix un nivell de permisos personalitzat", - "setPermissionsLevelDescription": "Tria un role predefinit o bé introdueix un nivell de permís personalitzat d'entre 0 i 100.", "ignoreUser": "Ignora l'usuàriï", - "normalUser": "Usuàriï normal", "changedTheChatDescription": "{username} ha canviat la descripció del xat", "changedTheChatName": "{username} ha canviat el nom del xat", "checkList": "Llista de tasques", @@ -3025,10 +2663,6 @@ "longPressToRecordVoiceMessage": "Deixa picat per gravar un missatge de veu.", "pause": "Pausa", "resume": "Continua", - "newSubSpace": "Crea un sub-espai", - "moveToDifferentSpace": "Mou-lo a un altre espai", - "moveUp": "Mou-lo amunt", - "moveDown": "Mou-lo avall", "removeFromSpaceDescription": "S'esborrarà de l'espai el xat, però encara apareixerà a la llista de xats.", "countChats": "{chats} xats", "@countChats": { @@ -3071,7 +2705,6 @@ "startPoll": "Comença una enquesta", "endPoll": "Acaba l'enquesta", "answersVisible": "Respostes visibles", - "answersHidden": "Respostes amagades", "pollQuestion": "Pregunta de l'enquesta", "answerOption": "Opció de resposta", "addAnswerOption": "Afegeix una opció", @@ -3143,4 +2776,4 @@ "signInGreeting": "Si ja tens un compte a Matrix, benvingudi! Tria el teu servidor i inicia-hi sessió.", "appIntro": "Pots xatejar amb lis tevis amiguis amb Fluffychat. És una app de missatgeria [matrix] descentralitzada! Llegeix-ne més a https://matrix.org si vols, o inicia sessió.", "theProcessWasCanceled": "S'ha canceŀlat el procés." -} +} \ No newline at end of file diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb index 4b4660a1..9b61e29e 100644 --- a/lib/l10n/intl_cs.arb +++ b/lib/l10n/intl_cs.arb @@ -129,18 +129,6 @@ } } }, - "badServerVersionsException": "Homeserver podporuje specifikaci verzí:\n{serverVersions}\nAle tato aplikace podporuje pouze verze {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Zakázat chat", "@banFromChat": { "type": "String", @@ -173,11 +161,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Zprávy od bota", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Zrušit", "@cancel": { "type": "String", @@ -506,31 +489,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Potvrdit", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Připojit", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt byl pozván do skupiny", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Obsahuje zobrazovaný název", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Obsahuje uživatelské jméno", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Obsah byl nahlášen správcům serveru", "@contentHasBeenReported": { "type": "String", @@ -610,33 +573,6 @@ } } }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}. {month}. {year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Tímto krokem se deaktivuje váš uživatelský účet. Akci nelze vrátit zpět! Jste si jistí?", "@deactivateAccountWarning": { "type": "String", @@ -742,11 +678,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Musíte si vybrat klávesovou zkratku emotikonu a obrázek!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Prázdný chat", "@emptyChat": { "type": "String", @@ -796,11 +727,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Zadejte svůj domovský server", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Chyba při získávání polohy: {error}", "@errorObtainingLocation": { "type": "String", @@ -850,11 +776,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Přejít do nové místnost", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Skupina", "@group": { "type": "String", @@ -926,11 +847,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identita", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorovat", "@ignore": { "type": "String", @@ -992,11 +908,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Pozvěte mě", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} vás pozval/a na FluffyChat.\n1. Navštivte fluffychat.im a nainstalujte si aplikaci.\n2. Zaregistrujte se nebo se přihlaste.\n3. Otevřte pozvánku: \n {link}", "@inviteText": { "type": "String", @@ -1076,11 +987,6 @@ "type": "String", "placeholders": {} }, - "license": "Licence", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Světlé", "@lightTheme": { "type": "String", @@ -1134,11 +1040,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Změny členů", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Zmínit se", "@mention": { "type": "String", @@ -1246,11 +1147,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Oznámení povolena pro tento účet", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} uživatelé píší…", "@numUsersTyping": { "type": "String", @@ -1350,11 +1246,6 @@ "type": "String", "placeholders": {} }, - "people": "Lidé", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Zvolit obrázek", "@pickImage": { "type": "String", @@ -1374,11 +1265,6 @@ } } }, - "pleaseChoose": "Prosím vyberte si", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Vyberte přístupový kód", "@pleaseChooseAPasscode": { "type": "String", @@ -1472,11 +1358,6 @@ } } }, - "rejoin": "Znovu se připojte", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Odstranit", "@remove": { "type": "String", @@ -1496,11 +1377,6 @@ } } }, - "removeDevice": "Odstraňit zařízení", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Zrušit zákaz chatu", "@unbanFromChat": { "type": "String", @@ -1556,15 +1432,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Viděno uživatelem {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Odeslat", "@send": { "type": "String", @@ -1599,16 +1466,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Odeslat originál", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Odeslat nálepku", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Odeslat video", "@sendVideo": { "type": "String", @@ -1673,21 +1530,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Nastavit vlastní emotikony", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Nastavit zvací odkaz", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Nastavit úroveň oprávnění", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Nastavit stav", "@setStatus": { "type": "String", @@ -1722,11 +1564,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Jedinečné přihlášení", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Přeskočit", "@skip": { "type": "String", @@ -1797,21 +1634,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Přepnout Oblíbené", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Přepnout ztlumené", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Označit jako přečtené/nepřečtené", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Příliš mnoho požadavků. Prosím zkuste to znovu později!", "@tooManyRequestsWarning": { "type": "String", @@ -1878,15 +1700,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 nepřečtený chat} other{{unreadCount} nepřečtené chaty}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} a {count} dalších píší…", "@userAndOthersAreTyping": { "type": "String", @@ -2011,11 +1824,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Pozadí:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Varování!", "@warning": { "type": "String", @@ -2081,7 +1889,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Do tohoto prostoru byl přidán chat", "addToSpace": "Přidat do prostoru", "scanQrCode": "Naskenujte QR kód", "sendOnEnter": "Odeslat při vstupu", @@ -2103,7 +1910,6 @@ "sender": "Odesílatel", "repeatPassword": "Zopakujte heslo", "openGallery": "Otevřít galerii", - "addToSpaceDescription": "Vyberte umístění, do kterého chcete tento chat přidat.", "start": "Start", "removeFromSpace": "Odstranit z tohoto místa", "commandHint_clearcache": "Vymazat mezipamět", @@ -2126,21 +1932,6 @@ "type": "String", "description": "Usage hint for the command /create" }, - "openVideoCamera": "Otevřete fotoaparát pro video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "publish": "Uveřejnit", - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "markAsRead": "Označit jako přečtené", "reportUser": "Nahlásit uživatele", "openChat": "Otevřete chat", @@ -2162,16 +1953,10 @@ "unsupportedAndroidVersion": "Nepodporovaná verze Androidu", "videoCallsBetaWarning": "Upozorňujeme, že videohovory jsou aktuálně ve verzi beta. Nemusí fungovat podle očekávání nebo fungovat vůbec na všech platformách.", "placeCall": "Zavolejte", - "emailOrUsername": "E-mail nebo uživatelské jméno", "experimentalVideoCalls": "Experimentální videohovory", "unsupportedAndroidVersionLong": "Tato funkce vyžaduje novější verzi Android. Zkontrolujte prosím aktualizace nebo podporu Lineage OS.", "pinMessage": "Připnout zprávu do místnosti", "confirmEventUnpin": "Opravdu chcete událost trvale odepnout?", - "separateChatTypes": "Odděĺlit přímé chaty, skupiny a prostory", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "youKicked": "Vykopli jste uživatele {user}", "@youKicked": { "placeholders": { @@ -2180,17 +1965,6 @@ } } }, - "switchToAccount": "Přepnout na účet {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "previousAccount": "Předchozí účet", - "widgetJitsi": "Jitsi Meet", "youAcceptedTheInvitation": "Přijal jsi pozvání", "youJoinedTheChat": "Připojili jste se k chatu", "youInvitedBy": "Byli jste pozváni uživatelem {user}", @@ -2201,11 +1975,6 @@ } } }, - "nextAccount": "Další účet", - "addWidget": "Přidat widget", - "widgetVideo": "Video", - "widgetEtherpad": "Textová poznámka", - "widgetName": "Jméno", "youBannedUser": "Zakázali jste uživatele {user}", "@youBannedUser": { "placeholders": { @@ -2238,7 +2007,6 @@ } } }, - "widgetCustom": "Vlastní", "youRejectedTheInvitation": "Odmítli jste pozvání", "youHaveWithdrawnTheInvitationFor": "Stáhli jste pozvánku pro uživatele {user}", "@youHaveWithdrawnTheInvitationFor": { @@ -2248,9 +2016,6 @@ } } }, - "widgetUrlError": "Toto není platná adresa URL.", - "widgetNameError": "Zadejte jméno pro zobrazení.", - "errorAddingWidget": "Chyba při přidávání widgetu.", "disableEncryptionWarning": "Z bezpečnostních důvodů nemůžete vypnout šifrování v chatu, kde již bylo dříve zapnuto.", "confirmMatrixId": "Pro smazání svého účtu potvrďte, prosím, své Matrix ID.", "commandHint_googly": "Poslat kroutící se očička", @@ -2298,25 +2063,12 @@ } }, "storeInAndroidKeystore": "Uložit v Android KeyStore", - "dehydrateTorLong": "Uživatelům TOR se doporučuje exportovat relaci před zavřením okna.", - "numChats": "{number} konverzací", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "dehydrate": "Exportovat relaci a promazat zařízení", "newGroup": "Nová skupina", - "hydrateTor": "TOR uživatelé: Import exportovanou relaci", "doNotShowAgain": "Nezobrazovat znovu", "commandHint_markasdm": "Označit jako místnost přímé konverzace s daným Matrix ID", "recoveryKey": "Klíč k obnovení", - "hydrateTorLong": "Exportovali jste vaši poslední relaci na TOR? Rychle ji importujte a pokračujte v konverzaci.", "hydrate": "Obnovit ze souboru zálohy", - "pleaseEnterRecoveryKey": "Prosím vložte váš klíč pro obnovení:", "createGroup": "Vytvořit skupinu", "shareInviteLink": "Sdílet pozvánku", "pleaseEnterRecoveryKeyDescription": "K odemknutí vašich starých zpráv prosím vložte váš klíč k obnovení vygenerovaný v předchozím sezení. Váš klíč k obnovení NENÍ vaše heslo.", @@ -2328,7 +2080,6 @@ "users": "Uživatelé", "storeInAppleKeyChain": "Uložit v Apple KeyChain", "jumpToLastReadMessage": "Skočit na naposledy přečtenou zprávu", - "signInWithPassword": "Přihlásit se pomocí hesla", "redactedBy": "Smazáno uživatelem {username}", "@redactedBy": { "type": "String", @@ -2338,15 +2089,12 @@ } } }, - "inviteContactToGroupQuestion": "Chcete pozvat {contact} do konverzace \"{groupName}\"?", - "dehydrateTor": "TOR uživatelé: Export relace", "tryAgain": "Zkuste to znovu", "redactMessageDescription": "Tato zpráva bude smazána pro všechny účastníky konverzace. Tuto akci nelze vzít zpět.", "optionalRedactReason": "(Nepovinné) Důvod smazání této zprávy…", "messagesStyle": "Zprávy:", "allSpaces": "Všechny prostory", "noOtherDevicesFound": "Žádná ostatní zařízení nebyla nalezena", - "addChatDescription": "Přidat popis konverzace...", "chatDescription": "Popis konverzace", "chatDescriptionHasBeenChanged": "Popis konverzace byl změněn", "noChatDescriptionYet": "Zatím nebyl vytvořen žádný popis konverzace.", @@ -2354,8 +2102,6 @@ "chatPermissions": "Oprávnění konverzace", "directChat": "Přímá konverzace", "setChatDescription": "Nastavit popis konverzace", - "startFirstChat": "Začněte svou první konverzaci", - "callingPermissions": "Oprávnění volání", "whyIsThisMessageEncrypted": "Proč nelze přečíst tuto zprávu?", "wasDirectChatDisplayName": "Prázdná konverzace (dříve {oldDisplayName})", "@wasDirectChatDisplayName": { @@ -2367,22 +2113,12 @@ } }, "newSpaceDescription": "Prostory umožňují organizovat Vaše konverzace a vytvářet soukromé nebo veřejné komunity.", - "profileNotFound": "Uživatel nebyl na serveru nalezen. Možná je problém s připojením nebo uživatel neexistuje.", - "setTheme": "Nastavit vzhled:", "sendTypingNotifications": "Posílat oznámení o psaní", "commandHint_markasgroup": "Označit jako skupinu", - "allRooms": "Všechny skupinové konverzace", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "recoveryKeyLost": "Ztracený klíč k obnovení?", "unlockOldMessages": "Odemknout staré zprávy", "foregroundServiceRunning": "Toto oznámení se zobrazuje když běží služba na pozadí.", "screenSharingDetail": "Sdílíte svou obrazovku přes FluffyChat", - "callingAccountDetails": "Opravňuje FluffyChat používat Android systémovou aplikaci pro vytáčení.", - "appearOnTop": "Zobrazovat nahoře", - "otherCallingPermissions": "Mikrofon, kamera a ostatní oprávnění FluffyChat", "encryptThisChat": "Zašifrovat tuto konverzaci", "sorryThatsNotPossible": "Omlouváme se… to není možné", "deviceKeys": "Klíče zařízení:", @@ -2390,16 +2126,6 @@ "fileIsTooBigForServer": "Neodesláno! Server povoluje maximálně {max} příloh.", "jump": "Skočit", "openLinkInBrowser": "Otevřít odkaz v prohlížeči", - "pleaseTryAgainLaterOrChooseDifferentServer": "Prosím zkuste to znovu nebo si vyberte jiný server.", - "signInWith": "Přihlásit se pomocí {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "supposedMxid": "Tady by mělo být {mxid}", "@supposedMxid": { "type": "String", @@ -2447,44 +2173,14 @@ "accessAndVisibilityDescription": "Kdo se může připojit a najít tuto konverzaci.", "customEmojisAndStickersBody": "Přidat nebo sdílet vlastní emodži či nálepky, které lze použít v konverzaci.", "swipeRightToLeftToReply": "Potáhnutím zprava doleva odpovědět na zprávu", - "countChatsAndCountParticipants": "{chats} konverzaci a {participants} účastníci", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Žádné další konverzace nalezeny...", "hideRedactedMessages": "Skrýt upravené zprávy", "hideRedactedMessagesBody": "Pokud někdo zprávu zrediguje, nebude tato zpráva v chatu již viditelná.", "hideInvalidOrUnknownMessageFormats": "Skrýt nesprávné nebo neznámé formáty zpráv", "blockUsername": "Ignorovat uživatelské jméno", - "hideMemberChangesInPublicChats": "Skrýt změny členů ve veřejných chatech", - "hideMemberChangesInPublicChatsBody": "Nezobrazovat na časové ose chatu, pokud se někdo připojí nebo opustí veřejný chat, aby se zlepšila čitelnost.", "overview": "Přehled", - "notifyMeFor": "Upozorněte mě na", "passwordRecoverySettings": "Nastavení obnovení hesla", - "presenceStyle": "Dostupnost:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "block": "Zablokovat", - "indexedDbErrorLong": "Ukládání zpráv bohužel není ve výchozím nastavení v soukromém režimu povoleno.\nNavštivte prosím\n - about:config\n - nastavte dom.indexedDB.privateBrowsing.enabled na true\nV opačném případě nebude možné FluffyChat spustit.", - "youInvitedToBy": "📩 Prostřednictvím odkazu jste byli pozváni na:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "indexedDbErrorTitle": "Problémy privátního prostředí", "blockListDescription": "Můžete blokovat uživatele, kteří vás obtěžují. Od uživatelů na vašem osobním seznamu blokovaných uživatelů nebudete moci přijímat žádné zprávy ani pozvánky do místnosti.", "blockedUsers": "Zablokování uživatelé", "alwaysUse24HourFormat": "Vypnuto", @@ -2492,7 +2188,6 @@ "description": "Set to true to always display time of day in 24 hour format." }, "noChatsFoundHere": "Nejsou zde žádné konverzace. Začněte novou konverzaci s někým pomocí tlačítka níže. ⤵️", - "joinedChats": "Připojené chaty", "unread": "Nepřečtené", "space": "Prostor", "spaces": "Prostory", @@ -2511,7 +2206,6 @@ } }, "ignoreUser": "Ignorovat uživatele", - "normalUser": "Normalní uživatel", "countInvited": "{count} pozváno", "@countInvited": { "type": "String", @@ -2538,22 +2232,10 @@ } }, "usersMustKnock": "Uživatelé musí zaklepat", - "setCustomPermissionLevel": "Nastavit vlastní úroveň oprávnění", "changedTheChatDescription": "{username} změnil/a popis konverzace", "changedTheChatName": "{username} změnil/a název konverzace", "checkList": "Kontrolní seznam", "knock": "Zaklepat", - "userWouldLikeToChangeTheChat": "{user} požádal/a o přidání do konverzace.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "enterSpace": "Vstoupit do prostoru", - "enterRoom": "Vstoupit do místnosti", - "hideUnimportantStateEvents": "Skrýt nedůležité stavové události", "hidePresences": "Skrýt seznam událostí?", "noBackupWarning": "Pozor! Bez povolení zálohování konverzací ztratíte přístup k zašifrovaným zprávám. Důrazně doporučujeme zálohování konverzací před odhlášením povolit.", "readUpToHere": "Čtěte až sem", @@ -2561,8 +2243,6 @@ "report": "hlášení", "invite": "Pozvánka", "inviteGroupChat": "📨 Skupinová pozvánka", - "invitePrivateChat": "📨 Soukromá pozvánka", - "appearOnTopDetails": "Umožňuje zobrazit aplikaci nahoře (není nutné, pokud již máte Fluffychat nastaven jako účet volajícího)", "noKeyForThisMessage": "K tomuto může dojít, pokud byla zpráva odeslána před přihlášením k účtu v tomto zařízení.\n\nJe také možné, že odesílatel zablokoval vaše zařízení nebo se něco pokazilo s internetovým připojením.\n\nJste schopni si zprávu přečíst v jiné relaci? Pak můžete zprávu přenést z něj! Přejděte do Nastavení > Zařízení a zkontrolujte, zda se Vaše zařízení vzájemně ověřila. Při příštím otevření místnosti, kdy budou obě relace v popředí, se klíče přenesou automaticky.\n\nNechcete klíče ztratit při odhlašování nebo přepínání zařízení? Ujistěte se, že jste v nastaveních povolili zálohování konverzací.", "invalidInput": "Nevhodný vstup!", "wrongPinEntered": "Nespravný PIN! Zkuste to znovu za {seconds} vteřin...", @@ -2599,7 +2279,6 @@ "groupName": "Název skupiny", "createGroupAndInviteUsers": "Vytvořit skupinu a pozvat uživatele", "groupCanBeFoundViaSearch": "Skupinu naleznete vyhledávním", - "startConversation": "Začít konverzaci", "commandHint_sendraw": "Odeslat soubor json", "databaseMigrationTitle": "Databáze je optimalizována", "databaseMigrationBody": "Vydržte prosím. Bude to chvilku trvat.", @@ -2611,11 +2290,9 @@ "pleaseChooseAStrongPassword": "Prosím, zvolte si silné heslo", "passwordsDoNotMatch": "Hesla se neshodují", "passwordIsWrong": "Zadané heslo je nesprávné", - "publicLink": "Veřejný odkaz", "publicChatAddresses": "Adresy veřejných konverzací", "createNewAddress": "Vytvořit novou adresu", "thisDevice": "Toto zařzení:", - "setPermissionsLevelDescription": "Zvolte, prosím, níže roli, nebo zadejte vlastní úroveň oprávnění mezi 0 a 100.", "synchronizingPleaseWaitCounter": " Synchronizuji… ({percentage} %)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -2626,7 +2303,6 @@ } }, "noOneCanJoin": "Nikdo se nemůže připojit", - "noPublicLinkHasBeenCreatedYet": "Zatím nebyl vytvořen žádný veřejný odkaz", "kickUserDescription": "Uživatel bude vyhozen z chatu, ale nikoliv zabanován. V případě veřejných chatů to znamená, že se kdykoliv může znovu připojit.", "noUsersFoundWithQuery": "Nepodařilo se najít uživatele \"{query}\". Zkontrolujte, prosím, že jste se nepřepsali.", "@noUsersFoundWithQuery": { @@ -2640,31 +2316,9 @@ "wrongRecoveryKey": "Jejda... toto nejspíš není správný obnovovací klíč.", "joinSpace": "Připojit se do prostoru", "publicSpaces": "Veřejné prostory", - "decline": "Odmítnout", "initAppError": "Při načítání nastala chyba", - "minimumPowerLevel": "Minimální úroveň oprávnění je {level}.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "gallery": "Galerie", "files": "Soubory", - "databaseBuildErrorBody": "Nepodařilo se sestavit SQlite databázi. Aplikace se pokusí použít starší verzi databáze. Nahlaste, prosím, tuto chybu vývojářům na adrese {url}. Chybová hláška je: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "Vaše relace byla ztracena. Nahlaste, prosím, tuto chybu vývojářům na adrese {url}. Chybová hláška je: {error}", "@sessionLostBody": { "type": "String", @@ -2689,15 +2343,6 @@ } } }, - "forwardMessageTo": "Přeposlat zprávu do {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "Posílat potvrzení o přečtení", "sendTypingNotificationsDescription": "Ostatní účastníci konverzace uvidí, že píšete novou zprávu.", "sendReadReceiptsDescription": "Ostatní účastníci konverzace uvidí, že jste si přečetl/a jejich zprávu.", @@ -2820,7 +2465,6 @@ "appWantsToUseForLoginDescription": "Pokračováním povolíte aplikaci a webové stránce sdílet mezi sebou informace o vás.", "open": "Otevřít", "waitingForServer": "Čekám na server...", - "appIntroduction": "FluffyChat vám umožňuje chatovat s přáteli napříč různými aplikacemi. Zjistěte více na https://matrix.org nebo prostě klepněte na *Pokračovat*.", "newChatRequest": "📩 Nová žádost o konverzaci", "generalNotificationSettings": "Obecné nastavení oznámení", "roomNotificationSettings": "Nastavení oznámení pro místnost", @@ -2888,8 +2532,6 @@ "longPressToRecordVoiceMessage": "Podržte pro nahrání hlasové zprávy.", "pause": "Pozastavit", "resume": "Pokračovat", - "newSubSpace": "Nový podprostor", - "moveToDifferentSpace": "Přesunout do jiného prostoru", "removeFromSpaceDescription": "Tato konverzace bude odstraněna z tohoto prostoru, stále však bude dostupná ve vašem seznamu konverzací.", "countChats": "{chats} konverzací", "@countChats": { @@ -2932,7 +2574,6 @@ "startPoll": "Spustit hlasování", "endPoll": "Ukončit hlasování", "answersVisible": "Odpovědi budou viditelné", - "answersHidden": "Odpovědi budou skryté", "pollQuestion": "Předmět hlasování", "answerOption": "Možnost", "addAnswerOption": "Přidat možnost", @@ -2992,6 +2633,5 @@ } } }, - "commandHint_roomupgrade": "Aktualizovat místnost na danou verzi", - "subspace": "Podprostor" -} + "commandHint_roomupgrade": "Aktualizovat místnost na danou verzi" +} \ No newline at end of file diff --git a/lib/l10n/intl_da.arb b/lib/l10n/intl_da.arb index 5f9f53f5..402faf13 100644 --- a/lib/l10n/intl_da.arb +++ b/lib/l10n/intl_da.arb @@ -1,8 +1,6 @@ { "repeatPassword": "Gentag password", "notAnImage": "Ikke en billedfil.", - "setCustomPermissionLevel": "Indstil særligt tilladelsesniveau", - "setPermissionsLevelDescription": "Vælg en prædefineret rolle herunder eller indtaste et særligt tilladelsesniveau mellem 0 og 100.", "ignoreUser": "Ignorér bruger", "remove": "Fjern", "@remove": { @@ -11,7 +9,6 @@ }, "importNow": "Importer nu", "importEmojis": "Importer emojis", - "normalUser": "Normal bruger", "importFromZipFile": "Importer fra .zip fil", "alwaysUse24HourFormat": "true", "@alwaysUse24HourFormat": { @@ -72,7 +69,6 @@ } } }, - "addChatDescription": "Tilføj en beskrivelse af chatten...", "addToSpace": "Tilføj til gruppe", "admin": "Admin", "@admin": { @@ -134,4 +130,4 @@ "type": "String", "placeholders": {} } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 2af7eb0e..cded8028 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -128,18 +128,6 @@ } } }, - "badServerVersionsException": "Der Homeserver unterstützt die Spec-Versionen:\n{serverVersions}\nAber diese App unterstützt nur:\n{supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Aus dem Chat verbannen", "@banFromChat": { "type": "String", @@ -172,11 +160,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Bot-Nachrichten", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Abbrechen", "@cancel": { "type": "String", @@ -505,31 +488,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Bestätigen", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Verbinden", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt wurde in die Gruppe eingeladen", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Enthält Anzeigenamen", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Enthält Benutzernamen", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Der Inhalt wurde den Serveradministratoren gemeldet", "@contentHasBeenReported": { "type": "String", @@ -609,33 +572,6 @@ } } }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}.{month}.{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Dies deaktiviert dein Konto. Es kann nicht rückgängig gemacht werden! Bist du sicher?", "@deactivateAccountWarning": { "type": "String", @@ -741,11 +677,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Wähle ein Emoticon-Kürzel und ein Bild!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Leerer Chat", "@emptyChat": { "type": "String", @@ -795,11 +726,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Gib Deinen Homeserver ein", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Fehler beim Suchen des Standortes: {error}", "@errorObtainingLocation": { "type": "String", @@ -849,11 +775,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Zum neuen Raum wechseln", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Gruppe", "@group": { "type": "String", @@ -925,11 +846,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identität", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorieren", "@ignore": { "type": "String", @@ -991,11 +907,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Einladung für mich", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} hat Dich zu FluffyChat eingeladen. \n1. Gehe auf fluffychat.im und installiere die App \n2. Melde Dich in der App an \n3. Öffne den Einladungslink: \n {link}", "@inviteText": { "type": "String", @@ -1075,11 +986,6 @@ "type": "String", "placeholders": {} }, - "license": "Lizenz", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Hell", "@lightTheme": { "type": "String", @@ -1133,11 +1039,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Änderungen der Mitglieder", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Erwähnen", "@mention": { "type": "String", @@ -1233,11 +1134,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Benachrichtigungen für dieses Konto aktiviert", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} Mitglieder schreiben …", "@numUsersTyping": { "type": "String", @@ -1337,11 +1233,6 @@ "type": "String", "placeholders": {} }, - "people": "Personen", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Bild wählen", "@pickImage": { "type": "String", @@ -1361,11 +1252,6 @@ } } }, - "pleaseChoose": "Bitte wählen", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Bitte einen Code festlegen", "@pleaseChooseAPasscode": { "type": "String", @@ -1459,11 +1345,6 @@ } } }, - "rejoin": "Wieder beitreten", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Entfernen", "@remove": { "type": "String", @@ -1483,11 +1364,6 @@ } } }, - "removeDevice": "Gerät entfernen", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Verbannung aufheben", "@unbanFromChat": { "type": "String", @@ -1543,15 +1419,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Gelesen von {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Senden", "@send": { "type": "String", @@ -1586,16 +1453,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Sende Original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Sticker senden", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Sende Video", "@sendVideo": { "type": "String", @@ -1660,21 +1517,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Eigene Emoticons einstellen", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Einladungslink festlegen", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Berechtigungsstufe einstellen", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Status ändern", "@setStatus": { "type": "String", @@ -1709,11 +1551,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Einmalige Anmeldung", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Überspringe", "@skip": { "type": "String", @@ -1784,21 +1621,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Favorite umschalten", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Stummgeschaltete umschalten", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Markieren als gelesen/ungelesen", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Zu viele Anfragen. Bitte versuche es später noch einmal!", "@tooManyRequestsWarning": { "type": "String", @@ -1865,15 +1687,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 ungelesene Unterhaltung} other{{unreadCount} ungelesene Unterhaltungen}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} und {count} andere schreiben …", "@userAndOthersAreTyping": { "type": "String", @@ -1998,11 +1811,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Hintergrund:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Achtung!", "@warning": { "type": "String", @@ -2081,7 +1889,6 @@ } }, "scanQrCode": "QR-Code scannen", - "chatHasBeenAddedToThisSpace": "Chat wurde zum Space hinzugefügt", "autoplayImages": "Animierte Sticker und Emotes automatisch abspielen", "@autoplayImages": { "type": "String", @@ -2107,7 +1914,6 @@ "sender": "Absender:in", "openGallery": "Galerie öffnen", "removeFromSpace": "Aus dem Space entfernen", - "addToSpaceDescription": "Wähle einen Space aus, um diesen Chat hinzuzufügen.", "start": "Start", "repeatPassword": "Passwort wiederholen", "commandHint_dm": "Starte einen direkten Chat\nBenutze --no-encryption, um die Verschlüsselung auszuschalten", @@ -2130,28 +1936,12 @@ "type": "String", "description": "Usage hint for the command /create" }, - "openVideoCamera": "Video aufnehmen", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "publish": "Veröffentlichen", "pinMessage": "An Raum anheften", "emojis": "Emojis", "placeCall": "Anruf tätigen", "voiceCall": "Sprachanruf", "unsupportedAndroidVersion": "Nicht unterstützte Android-Version", "videoCallsBetaWarning": "Bitte beachte, dass sich Videoanrufe derzeit in der Beta-Phase befinden. Sie funktionieren möglicherweise nicht wie erwartet oder überhaupt nicht auf allen Plattformen.", - "emailOrUsername": "E-Mail oder Benutzername", "unsupportedAndroidVersionLong": "Diese Funktion erfordert eine neuere Android-Version. Bitte suche nach Updates oder prüfe die Lineage-OS-Unterstützung.", "experimentalVideoCalls": "Experimentelle Videoanrufe", "reactedWith": "{sender} reagierte mit {reaction}", @@ -2171,31 +1961,6 @@ "openChat": "Chat öffnen", "confirmEventUnpin": "Möchtest du das Ereignis wirklich dauerhaft lösen?", "dismiss": "Verwerfen", - "switchToAccount": "Zu Konto {number} wechseln", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Nächstes Konto", - "widgetJitsi": "Jitsi Meet", - "widgetCustom": "Angepasst", - "widgetEtherpad": "Textnotiz", - "addWidget": "Widget hinzufügen", - "widgetVideo": "Video", - "widgetName": "Name", - "widgetUrlError": "Das ist keine gültige URL.", - "errorAddingWidget": "Fehler beim Hinzufügen des Widgets.", - "previousAccount": "Vorheriges Konto", - "separateChatTypes": "Separate Direktchats und Gruppen", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "widgetNameError": "Bitte gib einen Anzeigenamen an.", "youKicked": "👞 Du hast {user} rausgeworfen", "@youKicked": { "placeholders": { @@ -2263,16 +2028,10 @@ "storeSecurlyOnThisDevice": "Auf diesem Gerät sicher speichern", "dehydrate": "Sitzung exportieren und Gerät löschen", "dehydrateWarning": "Diese Aktion kann nicht rückgängig gemacht werden. Stelle sicher, dass du die Sicherungsdatei sicher aufbewahrst.", - "dehydrateTor": "TOR-Benutzer: Sitzung exportieren", - "dehydrateTorLong": "Für TOR-Benutzer wird empfohlen, die Sitzung zu exportieren, bevor das Fenster geschlossen wird.", - "hydrateTor": "TOR-Benutzer: Session-Export importieren", "hydrate": "Aus Sicherungsdatei wiederherstellen", - "indexedDbErrorTitle": "Probleme im Privatmodus", "unlockOldMessages": "Entsperre alte Nachrichten", "pleaseEnterRecoveryKeyDescription": "Um deine alten Nachrichten zu entsperren, gib bitte den Wiederherstellungsschlüssel ein, der in einer früheren Sitzung generiert wurde. Dein Wiederherstellungsschlüssel ist NICHT dein Passwort.", "saveKeyManuallyDescription": "Speicher diesen Schlüssel manuell, indem du den Systemfreigabedialog oder die Zwischenablage auslöst.", - "hydrateTorLong": "Hast du deine Sitzung das letzte Mal auf TOR exportiert? Importiere sie schnell und chatte weiter.", - "pleaseEnterRecoveryKey": "Bitte gib deinen Wiederherstellungsschlüssel ein:", "countFiles": "{count} Dateien", "@countFiles": { "placeholders": { @@ -2284,7 +2043,6 @@ "users": "Benutzer", "storeInSecureStorageDescription": "Speicher den Wiederherstellungsschlüssel im sicheren Speicher dieses Geräts.", "storeInAppleKeyChain": "Im Apple KeyChain speichern", - "indexedDbErrorLong": "Die Nachrichtenspeicherung ist im privaten Modus standardmäßig leider nicht aktiviert.\nBitte besuche\n- about:config\n- Setze dom.indexedDB.privateBrowsing.enabled auf true\nAndernfalls ist es nicht möglich, FluffyChat auszuführen.", "confirmMatrixId": "Bitte bestätigen deine Matrix-ID, um dein Konto zu löschen.", "supposedMxid": "das sollte sein {mxid}", "@supposedMxid": { @@ -2297,33 +2055,15 @@ }, "commandHint_markasdm": "Als Direktnachrichtenraum für die angegebene Matrix-ID markieren", "commandHint_markasgroup": "Als Gruppe markieren", - "hideUnimportantStateEvents": "Blende unwichtige Zustandsereignisse aus", "doNotShowAgain": "Nicht mehr anzeigen", - "appearOnTopDetails": "Ermöglicht, dass die App oben angezeigt wird (nicht erforderlich, wenn du Fluffychat bereits als Anrufkonto eingerichtet haben)", "noKeyForThisMessage": "Dies kann passieren, wenn die Nachricht gesendet wurde, bevor du dich auf diesem Gerät bei deinem Konto angemeldet hast.\n\nEs ist auch möglich, dass der Absender dein Gerät blockiert hat oder etwas mit der Internetverbindung schief gelaufen ist.\n\nKannst du die Nachricht in einer anderen Sitzung lesen? Dann kannst du die Nachricht davon übertragen! Gehe zu den Einstellungen > Geräte und vergewissere dich, dass sich deine Geräte gegenseitig verifiziert haben. Wenn du den Raum das nächste Mal öffnest und beide Sitzungen im Vordergrund sind, werden die Schlüssel automatisch übertragen.\n\nDu möchtest die Schlüssel beim Abmelden oder Gerätewechsel nicht verlieren? Stelle sicher, dass du das Chat-Backup in den Einstellungen aktiviert hast.", "foregroundServiceRunning": "Diese Benachrichtigung wird angezeigt, wenn der Vordergrunddienst ausgeführt wird.", "screenSharingTitle": "Bildschirm teilen", - "callingPermissions": "Anrufberechtigungen", - "callingAccount": "Anrufkonto", - "callingAccountDetails": "Ermöglicht FluffyChat, die native Android-Dialer-App zu verwenden.", - "appearOnTop": "Oben erscheinen", - "otherCallingPermissions": "Mikrofon, Kamera und andere FluffyChat-Berechtigungen", "whyIsThisMessageEncrypted": "Warum ist diese Nachricht nicht lesbar?", "newGroup": "Neue Gruppe", "newSpace": "Neuer Space", - "enterSpace": "Raum betreten", - "enterRoom": "Raum betreten", "allSpaces": "Alle Spaces", "screenSharingDetail": "Du teilst deinen Bildschirm in FuffyChat", - "numChats": "{number} Chats", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "newSpaceDescription": "Mit Spaces kannst du deine Chats zusammenfassen und private oder öffentliche Communities aufbauen.", "wasDirectChatDisplayName": "Leerer Chat (war {oldDisplayName})", "@wasDirectChatDisplayName": { @@ -2344,7 +2084,6 @@ } } }, - "startFirstChat": "Starte deinen ersten Chat", "deviceKeys": "Geräteschlüssel:", "commandHint_cuddle": "Umarmung senden", "commandHint_hug": "Umarmung senden", @@ -2372,11 +2111,6 @@ "reopenChat": "Chat wieder eröffnen", "noBackupWarning": "Achtung! Ohne Aktivierung des Chat-Backups verlierst du den Zugriff auf deine verschlüsselten Nachrichten. Vor dem Ausloggen wird dringend empfohlen, das Chat-Backup zu aktivieren.", "noOtherDevicesFound": "Keine anderen Geräte anwesend", - "allRooms": "Alle Gruppenchats", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "fileHasBeenSavedAt": "Datei wurde gespeichert unter {path}", "@fileHasBeenSavedAt": { "type": "String", @@ -2388,13 +2122,10 @@ }, "jumpToLastReadMessage": "Zur letzten ungelesenen Nachricht", "readUpToHere": "Bis hier gelesen", - "pleaseTryAgainLaterOrChooseDifferentServer": "Bitte versuche es später noch einmal oder wähle einen anderen Server.", "jump": "Springen", "openLinkInBrowser": "Link im Browser öffnen", "reportErrorDescription": "😭 Oh nein. Etwas ist schief gelaufen. Wenn du möchtest, kannst du den Bug bei den Entwicklern melden.", "report": "Melden", - "signInWithPassword": "Anmelden mit Passwort", - "signInWithLabel": "Anmelden mit:", "importNow": "Jetzt importieren", "importEmojis": "Emojis importieren", "importFromZipFile": "Aus ZIP-Datei importieren", @@ -2402,10 +2133,8 @@ "notAnImage": "Keine Bilddatei.", "replace": "Ersetzen", "sendTypingNotifications": "Tippbenachrichtigungen senden", - "profileNotFound": "Der Benutzer konnte auf dem Server nicht gefunden werden. Vielleicht gibt es ein Verbindungsproblem oder der Benutzer existiert nicht.", "createGroup": "Gruppe erstellen", "shareInviteLink": "Einladungslink teilen", - "inviteContactToGroupQuestion": "Willst du {contact} zum Chat {groupName} einladen?", "tryAgain": "Neuer Versuch", "redactMessageDescription": "Die Nachricht wird für alle Teilnehmer dieses Gesprächs gelöscht. Dies kann nicht rückgängig gemacht werden.", "redactedBy": "Gelöscht von {username}", @@ -2429,7 +2158,6 @@ } } }, - "setTheme": "Design festlegen:", "setColorTheme": "Farbdesign einstellen:", "invite": "Einladen", "optionalRedactReason": "(Optional) Grund für die Löschung dieser Nachricht...", @@ -2440,10 +2168,8 @@ "noChatDescriptionYet": "Noch keine Chatbeschreibung vorhanden.", "invalidServerName": "Ungültiger Servername", "directChat": "Privater Chat", - "addChatDescription": "Chatbeschreibung hinzufügen ...", "setChatDescription": "Chatbeschreibung festlegen", "inviteGroupChat": "📨 Einladungen zum Gruppenchat", - "invitePrivateChat": "📨 Einladungen zum privaten Chat", "invalidInput": "Ungültige Eingabe!", "hasKnocked": "🚪 {user} hat angeklopft", "@hasKnocked": { @@ -2479,7 +2205,6 @@ "kickUserDescription": "Der Benutzer wird aus dem Chat geworfen, aber nicht gebannt. In öffentlichen Chats kann der Benutzer jederzeit wieder beitreten.", "blockListDescription": "Du kannst Benutzer blockieren, die dich stören. Von Benutzern auf deiner persönlichen Blocklierliste kannst du keine Nachrichten oder Raumeinladungen mehr erhalten.", "createGroupAndInviteUsers": "Gruppe erstellen und Nutzer einladen", - "startConversation": "Unterhaltung starten", "blockedUsers": "Blockierte Benutzer", "groupCanBeFoundViaSearch": "Gruppe kann über die Suche gefunden werden", "noUsersFoundWithQuery": "Leider konnte mit \"{query}\" kein Benutzer gefunden werden. Bitte schau nach, ob dir ein Tippfehler unterlaufen ist.", @@ -2504,12 +2229,9 @@ "publicSpaces": "Öffentliche Spaces", "passwordIsWrong": "Dein eingegebenes Passwort ist falsch", "pleaseEnterYourCurrentPassword": "Bitte dein aktuelles Passwort eingeben", - "publicLink": "Öffentlicher Link", "nothingFound": "Nichts gefunden ...", - "decline": "Ablehnen", "newPassword": "Neues Passwort", "passwordsDoNotMatch": "Passwörter stimmen nicht überein", - "subspace": "Sub-Space", "select": "Auswählen", "pleaseChooseAStrongPassword": "Bitte wähle ein starkes Passwort", "addChatOrSubSpace": "Chat oder Sub-Space hinzufügen", @@ -2517,18 +2239,6 @@ "joinSpace": "Space beitreten", "searchForUsers": "Suche nach @benutzer ...", "initAppError": "Beim Starten der App ist ein Fehler aufgetreten", - "databaseBuildErrorBody": "Die SQlite-Datenbank kann nicht erstellt werden. Die App versucht vorerst, die Legacy-Datenbank zu verwenden. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "Die App versucht nun, deine Sitzung aus der Sicherung wiederherzustellen. Bitte melde diesen Fehler an die Entwickler unter {url}. Die Fehlermeldung lautet: {error}", "@sessionLostBody": { "type": "String", @@ -2553,25 +2263,8 @@ } } }, - "youInvitedToBy": "📩 Du wurdest per Link eingeladen zu:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "sendReadReceipts": "Lesebestätigungen senden", "formattedMessages": "Formatierte Nachrichten", - "forwardMessageTo": "Nachricht weiterleiten an {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendTypingNotificationsDescription": "Andere Teilnehmer in einem Chat können sehen, wenn du eine neue Nachricht tippst.", "formattedMessagesDescription": "Formatierte Nachrichteninhalte wie fettgedruckten Text mit Markdown anzeigen.", "verifyOtherUser": "🔐 Anderen Benutzer verifizieren", @@ -2634,11 +2327,6 @@ } }, "verifyOtherDeviceDescription": "Wenn du ein anderes Gerät verifizierst, können diese Geräte Schlüssel austauschen, was die Sicherheit insgesamt erhöht. 💪Sobald du eine Verifizierung startest, erscheint ein Pop-up in der App auf beiden Geräten. Dort siehst du dann eine Reihe von Emojis oder Zahlen, die du miteinander vergleichen musst. Am besten hältst du beide Geräte bereit, bevor du die Verifizierung startest. 🤳", - "presenceStyle": "Statusmeldungen:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Status-Nachrichten anderer Benutzer anzeigen", "@presencesToggle": { "type": "String", @@ -2666,18 +2354,7 @@ "customEmojisAndStickersBody": "Eigene Emojis oder Sticker zur Nutzung im Chat hinzufügen oder teilen.", "globalChatId": "Globale Chat-ID", "accessAndVisibility": "Zugang und Sichtbarkeit", - "hideMemberChangesInPublicChats": "Mitglieder-Änderungen in öffentlichen Chats ausblenden", "accessAndVisibilityDescription": "Wer darf dem Chat beitreten und wie kann der Chat gefunden werden.", - "hideMemberChangesInPublicChatsBody": "Zeige keine Beitritt- oder Verlassen-Ereignisse von Mitgliedern in der Timeline an, um die Lesbarkeit in öffentlichen Chats zu verbessern.", - "userWouldLikeToChangeTheChat": "{user} würde dem Chat gerne beitreten.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Es wurde noch kein öffentlicher Link erstellt", "chatCanBeDiscoveredViaSearchOnServer": "Chat kann über die Suche auf {server} gefunden werden", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2694,7 +2371,6 @@ "hideRedactedMessagesBody": "Wenn jemand eine Nachricht schwärzt/löscht, dann wird diese Nachricht im Chat nicht mehr sichtbar sein.", "hideInvalidOrUnknownMessageFormats": "Ungültige und unbekannte Nachrichten-Formate ausblenden", "overview": "Übersicht", - "notifyMeFor": "Benachrichtige mich für", "passwordRecoverySettings": "Passwort-Wiederherstellungs-Einstellungen", "knock": "Anklopfen", "knocking": "Klopft", @@ -2706,16 +2382,6 @@ "usersMustKnock": "Benutzer müssen anklopfen", "noOneCanJoin": "Niemand kann beitreten", "createNewAddress": "Neue Adresse erstellen", - "userRole": "Benutzerrolle", - "minimumPowerLevel": "{level} is das minimale Power-Level.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "publicChatAddresses": "Öffentliche Chat-Adressen", "gallery": "Galerie", "files": "Dateien", @@ -2733,7 +2399,6 @@ "searchMore": "Weiter suchen ...", "unread": "Ungelesen", "noMoreChatsFound": "Keine weiteren Chats gefunden ...", - "joinedChats": "Beigetretene Chats", "space": "Space", "spaces": "Spaces", "goToSpace": "Geh zum Space: {space}", @@ -2743,18 +2408,6 @@ }, "markAsUnread": "Als ungelesen markieren", "swipeRightToLeftToReply": "Wische von rechts nach links zum Antworten", - "countChatsAndCountParticipants": "{chats} Chats und {participants} Teilnehmer", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "changeGeneralChatSettings": "Allgemeine Chat-Einstellungen ändern", "userLevel": "{level} - Benutzer", "@userLevel": { @@ -2810,11 +2463,8 @@ "changelog": "Änderungsprotokoll", "sendCanceled": "Senden abgebrochen", "noChatsFoundHere": "Hier wurden noch keine Chats gefunden. Starte einen neuen Chat mit jemandem, indem du die Schaltfläche unten verwenden. ⤵️", - "whatIsAHomeserver": "Was ist ein Homeserver?", "doesNotSeemToBeAValidHomeserver": "Scheint kein kompatibler Homeserver zu sein. Falsche URL?", "loginWithMatrixId": "Mit Matrix-ID anmelden", - "discoverHomeservers": "Homeserver suchen", - "homeserverDescription": "Alle deine Daten werden auf einem Homeserver gespeichert, so wie bei einem E-Mail Anbieter. Du kannst aussuchen, welchen Homeserver du benutzen willst und kannst trotzdem mit allen kommunizieren. Erfahre mehr auf https://matrix.org.", "sendingAttachment": "Anhang wird gesendet ...", "generatingVideoThumbnail": "Generiere Video-Vorschaubild ...", "serverLimitReached": "Server-Limit erreicht! Warte {seconds} Sekunden ...", @@ -2892,7 +2542,6 @@ "compress": "Komprimieren", "supportPage": "Support-Seite", "serverInformation": "Server-Informationen:", - "appIntroduction": "Mit FluffyChat kannst du über verschiedene Messenger hinweg mit deinen Freunden chatten. Erfahre mehr dazu auf https://matrix.org oder tippe einfach auf *Fortfahren*.", "newChatRequest": "📩 Neue Chat-Anfrage", "synchronizingPleaseWaitCounter": " Synchronisierung… ({percentage}%)", "@synchronizingPleaseWaitCounter": { @@ -3007,9 +2656,6 @@ } } }, - "normalUser": "Normaler Benutzer", - "setCustomPermissionLevel": "Benutzerdefinierte Berechtigungsstufe festlegen", - "setPermissionsLevelDescription": "Bitte wählen Sie unten eine vordefinierte Rolle aus oder geben Sie eine benutzerdefinierte Berechtigungsstufe zwischen 0 und 100 ein.", "approve": "Genehmigen", "youHaveKnocked": "Du hast geklopft", "pleaseWaitUntilInvited": "Bitte warte nun, bis dich jemand aus dem Raum auffordert.", @@ -3023,10 +2669,6 @@ "noMessagesYet": "Noch keine Nachrichten", "longPressToRecordVoiceMessage": "Lange drücken, um eine Sprachnachricht aufzunehmen.", "pause": "Pause", - "newSubSpace": "Neuer Sub-Space", - "moveToDifferentSpace": "In einen anderen space wechseln", - "moveUp": "Nach oben", - "moveDown": "Nach unten", "removeFromSpaceDescription": "Der Chat wird aus dem Space entfernt, erscheint aber weiterhin in Ihrer Chatliste.", "countChats": "{chats} Chats", "@countChats": { @@ -3070,7 +2712,6 @@ "startPoll": "Umfrage starten", "endPoll": "Umfrage beenden", "answersVisible": "Antworten sichtbar", - "answersHidden": "Antworten sind verborgen", "pollQuestion": "Frage", "answerOption": "Antwortmöglichkeit", "addAnswerOption": "Antwortoption hinzufügen", @@ -3147,4 +2788,4 @@ "join": "Beitreten", "searchOrEnterHomeserverAddress": "Homeserver-Adresse suchen oder eingeben", "matrixId": "Matrix ID" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_el.arb b/lib/l10n/intl_el.arb index 24b1e2ea..cf2c35e4 100644 --- a/lib/l10n/intl_el.arb +++ b/lib/l10n/intl_el.arb @@ -136,18 +136,6 @@ "type": "String", "placeholders": {} }, - "badServerVersionsException": "Ο οικιακός διακομιστής υποστηρίζει τις εκδόσεις Spec:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "addToSpace": "Προσθήκη στο χώρο", "@addToSpace": {}, "about": "Σχετικά", @@ -173,8 +161,6 @@ } } }, - "addChatDescription": "Πρόσθεσε μια περιγραφή συνομιλίας...", - "@addChatDescription": {}, "cancel": "Ακύρωση", "@cancel": { "type": "String", @@ -249,11 +235,6 @@ }, "commandHint_googly": "Στείλε αστεία μάτια", "@commandHint_googly": {}, - "botMessages": "Μηνύματα bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "importNow": "Εισαγωγή τώρα", "@importNow": {}, "anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει", @@ -265,14 +246,8 @@ "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, - "setCustomPermissionLevel": "Όρισε προσαρμοσμένο επίπεδο άδειας", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Επέλεξε έναν προκαθορισμένο ρόλο παρακάτω ή εισήγαγε ένα προσαρμοσμένο επίπεδο άδειας μεταξύ 0 και 100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Αγνόηση χρήστη", "@ignoreUser": {}, - "normalUser": "Κανονικός χρήστης", - "@normalUser": {}, "aboutHomeserver": "Σχετικά με {homeserver}", "@aboutHomeserver": { "type": "String", @@ -288,18 +263,6 @@ "@appLockDescription": {}, "swipeRightToLeftToReply": "Σύρσιμο δεξιά προς αριστερά για απάντηση", "@swipeRightToLeftToReply": {}, - "countChatsAndCountParticipants": "{chats} συνομιλίες και {participants} συμμετέχοντες", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Δεν βρέθηκαν άλλες συνομιλίες...", "@noMoreChatsFound": {}, "noChatsFoundHere": "Δεν υπάρχουν συνομιλίες ακόμα. Ξεκίνα μια νέα συνομιλία με κάποιον χρησιμοποιώντας το κουμπί παρακάτω. ⤵️", @@ -456,8 +419,6 @@ "type": "String", "placeholders": {} }, - "joinedChats": "Συνδεδεμένες συνομιλίες", - "@joinedChats": {}, "chatBackup": "Αντίγραφο ασφαλείας συνομιλίας", "@chatBackup": { "type": "String", @@ -468,8 +429,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Η συνομιλία προστέθηκε στο δωμάτιο", - "@chatHasBeenAddedToThisSpace": {}, "chats": "Συνομιλίες", "@chats": { "type": "String", @@ -500,4 +459,4 @@ "type": "String", "description": "Usage hint for the command /invite" } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index da89e973..18bf66dd 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -7,10 +7,7 @@ }, "repeatPassword": "Repeat password", "notAnImage": "Not an image file.", - "setCustomPermissionLevel": "Set custom permission level", - "setPermissionsLevelDescription": "Please choose a predefined role below or enter a custom permission level between 0 and 100.", "ignoreUser": "Ignore user", - "normalUser": "Normal user", "remove": "Remove", "@remove": { "type": "String", @@ -74,7 +71,6 @@ } } }, - "addChatDescription": "Add a chat description...", "addToSpace": "Add to space", "admin": "Admin", "@admin": { @@ -201,33 +197,8 @@ "sendTypingNotifications": "Send typing notifications", "swipeRightToLeftToReply": "Swipe right to left to reply", "sendOnEnter": "Send on enter", - "badServerVersionsException": "The homeserver supports the Spec versions:\n{serverVersions}\nBut this app supports only {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "countChatsAndCountParticipants": "{chats} chats and {participants} participants", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "No more chats found...", "noChatsFoundHere": "No chats found here yet. Start a new chat with someone by using the button below. ⤵️", - "joinedChats": "Joined chats", "unread": "Unread", "space": "Space", "spaces": "Spaces", @@ -263,11 +234,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Bot messages", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Cancel", "@cancel": { "type": "String", @@ -484,7 +450,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Chat has been added to this space", "chats": "Chats", "@chats": { "type": "String", @@ -622,31 +587,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Confirm", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Connect", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Contact has been invited to the group", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Contains display name", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Contains username", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "The content has been reported to the server admins", "@contentHasBeenReported": { "type": "String", @@ -737,33 +682,6 @@ } } }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "This will deactivate your user account. This can not be undone! Are you sure?", "@deactivateAccountWarning": { "type": "String", @@ -809,11 +727,6 @@ "type": "String", "placeholders": {} }, - "allRooms": "All Group Chats", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "displaynameHasBeenChanged": "Displayname has been changed", "@displaynameHasBeenChanged": { "type": "String", @@ -886,11 +799,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "You need to pick an emote shortcode and an image!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Empty chat", "@emptyChat": { "type": "String", @@ -941,11 +849,6 @@ "placeholders": {} }, "homeserver": "Homeserver", - "enterYourHomeserver": "Enter your homeserver", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Error obtaining location: {error}", "@errorObtainingLocation": { "type": "String", @@ -995,11 +898,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Go to the new room", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Group", "@group": { "type": "String", @@ -1071,11 +969,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identity", - "@identity": { - "type": "String", - "placeholders": {} - }, "block": "Block", "blockedUsers": "Blocked users", "blockListDescription": "You can block users who are disturbing you. You won't be able to receive any messages or room invites from the users on your personal block list.", @@ -1100,7 +993,6 @@ "type": "String", "placeholders": {} }, - "inviteContactToGroupQuestion": "Do you want to invite {contact} to the chat \"{groupName}\"?", "inviteContactToGroup": "Invite contact to {groupName}", "@inviteContactToGroup": { "type": "String", @@ -1137,11 +1029,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Invite for me", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} invited you to FluffyChat.\n1. Visit fluffychat.im and install the app \n2. Sign up or sign in \n3. Open the invite link: \n {link}", "@inviteText": { "type": "String", @@ -1221,11 +1108,6 @@ "type": "String", "placeholders": {} }, - "license": "License", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Light", "@lightTheme": { "type": "String", @@ -1242,10 +1124,6 @@ }, "dehydrate": "Export session and wipe device", "dehydrateWarning": "This action cannot be undone. Ensure you safely store the backup file.", - "dehydrateTor": "TOR Users: Export session", - "dehydrateTorLong": "For TOR users, it is recommended to export the session before closing the window.", - "hydrateTor": "TOR Users: Import session export", - "hydrateTorLong": "Did you export your session last time on TOR? Quickly import it and continue chatting.", "hydrate": "Restore from backup file", "loadingPleaseWait": "Loading… Please wait.", "@loadingPleaseWait": { @@ -1286,11 +1164,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Member changes", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Mention", "@mention": { "type": "String", @@ -1401,11 +1274,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notifications enabled for this account", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} users are typing…", "@numUsersTyping": { "type": "String", @@ -1465,11 +1333,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "Open camera for a video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "oneClientLoggedOut": "One of your clients has been logged out", "addAccount": "Add account", "editBundlesForAccount": "Edit bundles for this account", @@ -1514,21 +1377,13 @@ "type": "String", "placeholders": {} }, - "hideMemberChangesInPublicChats": "Hide member changes in public chats", - "hideMemberChangesInPublicChatsBody": "Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.", "overview": "Overview", - "notifyMeFor": "Notify me for", "passwordRecoverySettings": "Password recovery settings", "passwordRecovery": "Password recovery", "@passwordRecovery": { "type": "String", "placeholders": {} }, - "people": "People", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Pick an image", "@pickImage": { "type": "String", @@ -1548,11 +1403,6 @@ } } }, - "pleaseChoose": "Please choose", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Please choose a pass code", "@pleaseChooseAPasscode": { "type": "String", @@ -1568,7 +1418,6 @@ "type": "String", "placeholders": {} }, - "pleaseEnterRecoveryKey": "Please enter your recovery key:", "pleaseEnterYourPassword": "Please enter your password", "@pleaseEnterYourPassword": { "type": "String", @@ -1669,11 +1518,6 @@ } } }, - "rejoin": "Rejoin", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "removeAllOtherDevices": "Remove all other devices", "@removeAllOtherDevices": { "type": "String", @@ -1688,11 +1532,6 @@ } } }, - "removeDevice": "Remove device", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Unban from chat", "@unbanFromChat": { "type": "String", @@ -1750,15 +1589,6 @@ }, "recoveryKey": "Recovery key", "recoveryKeyLost": "Recovery key lost?", - "seenByUser": "Seen by {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Send", "@send": { "type": "String", @@ -1802,16 +1632,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Send original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Send sticker", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Send video", "@sendVideo": { "type": "String", @@ -1871,32 +1691,12 @@ } } }, - "separateChatTypes": "Separate Direct Chats and Groups", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Set as main alias", "@setAsCanonicalAlias": { "type": "String", "placeholders": {} }, - "setCustomEmotes": "Set custom emotes", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "setChatDescription": "Set chat description", - "setInvitationLink": "Set invitation link", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Set permissions level", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Set status", "@setStatus": { "type": "String", @@ -1931,21 +1731,11 @@ "type": "String", "placeholders": {} }, - "presenceStyle": "Presence:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Show status messages from other users", "@presencesToggle": { "type": "String", "placeholders": {} }, - "singlesignon": "Single Sign on", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Skip", "@skip": { "type": "String", @@ -1975,7 +1765,6 @@ } } }, - "startFirstChat": "Start your first chat", "status": "Status", "@status": { "type": "String", @@ -2026,21 +1815,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Toggle Favorite", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Toggle Muted", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Mark Read/Unread", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Too many requests. Please try again later!", "@tooManyRequestsWarning": { "type": "String", @@ -2107,15 +1881,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} and {count} others are typing…", "@userAndOthersAreTyping": { "type": "String", @@ -2241,11 +2006,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Wallpaper:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Warning!", "@warning": { "type": "String", @@ -2317,19 +2077,8 @@ "sender": "Sender", "openGallery": "Open gallery", "removeFromSpace": "Remove from space", - "addToSpaceDescription": "Select a space to add this chat to it.", "start": "Start", "pleaseEnterRecoveryKeyDescription": "To unlock your old messages, please enter your recovery key that has been generated in a previous session. Your recovery key is NOT your password.", - "publish": "Publish", - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "openChat": "Open Chat", "markAsRead": "Mark as read", "reportUser": "Report user", @@ -2355,29 +2104,6 @@ "unsupportedAndroidVersionLong": "This feature requires a newer Android version. Please check for updates or Lineage OS support.", "videoCallsBetaWarning": "Please note that video calls are currently in beta. They might not work as expected or work at all on all platforms.", "experimentalVideoCalls": "Experimental video calls", - "emailOrUsername": "Email or username", - "indexedDbErrorTitle": "Private mode issues", - "indexedDbErrorLong": "The message storage is unfortunately not enabled in private mode by default.\nPlease visit\n - about:config\n - set dom.indexedDB.privateBrowsing.enabled to true\nOtherwise, it is not possible to run FluffyChat.", - "switchToAccount": "Switch to account {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Next account", - "previousAccount": "Previous account", - "addWidget": "Add widget", - "widgetVideo": "Video", - "widgetEtherpad": "Text note", - "widgetJitsi": "Jitsi Meet", - "widgetCustom": "Custom", - "widgetName": "Name", - "widgetUrlError": "This is not a valid URL.", - "widgetNameError": "Please provide a display name.", - "errorAddingWidget": "Error adding the widget.", "youRejectedTheInvitation": "You rejected the invitation", "youJoinedTheChat": "You joined the chat", "youAcceptedTheInvitation": "👍 You accepted the invitation", @@ -2397,14 +2123,6 @@ } } }, - "youInvitedToBy": "📩 You have been invited via link to:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "youInvitedBy": "📩 You have been invited by {user}", "@youInvitedBy": { "placeholders": { @@ -2463,15 +2181,6 @@ }, "usersMustKnock": "Users must knock", "noOneCanJoin": "No one can join", - "userWouldLikeToChangeTheChat": "{user} would like to join the chat.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "No public link has been created yet", "knock": "Knock", "users": "Users", "unlockOldMessages": "Unlock old messages", @@ -2493,29 +2202,11 @@ "foregroundServiceRunning": "This notification appears when the foreground service is running.", "screenSharingTitle": "screen sharing", "screenSharingDetail": "You are sharing your screen in FuffyChat", - "callingPermissions": "Calling permissions", - "callingAccount": "Calling account", - "callingAccountDetails": "Allows FluffyChat to use the native android dialer app.", - "appearOnTop": "Appear on top", - "appearOnTopDetails": "Allows the app to appear on top (not needed if you already have Fluffychat setup as a calling account)", - "otherCallingPermissions": "Microphone, camera and other FluffyChat permissions", "whyIsThisMessageEncrypted": "Why is this message unreadable?", "noKeyForThisMessage": "This can happen if the message was sent before you have signed in to your account at this device.\n\nIt is also possible that the sender has blocked your device or something went wrong with the internet connection.\n\nAre you able to read the message on another session? Then you can transfer the message from it! Go to Settings > Devices and make sure that your devices have verified each other. When you open the room the next time and both sessions are in the foreground, the keys will be transmitted automatically.\n\nDo you not want to lose the keys when logging out or switching devices? Make sure that you have enabled the chat backup in the settings.", "newGroup": "New group", "newSpace": "New space", - "enterSpace": "Enter space", - "enterRoom": "Enter room", "allSpaces": "All spaces", - "numChats": "{number} chats", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Hide unimportant state events", "hidePresences": "Hide Status List?", "doNotShowAgain": "Do not show again", "wasDirectChatDisplayName": "Empty chat (was {oldDisplayName})", @@ -2559,14 +2250,9 @@ "openLinkInBrowser": "Open link in browser", "reportErrorDescription": "😭 Oh no. Something went wrong. If you want, you can report this bug to the developers.", "report": "report", - "signInWithPassword": "Sign in with password", - "pleaseTryAgainLaterOrChooseDifferentServer": "Please try again later or choose a different server.", - "profileNotFound": "The user could not be found on the server. Maybe there is a connection problem or the user doesn't exist.", - "setTheme": "Set theme:", "setColorTheme": "Set color theme:", "invite": "Invite", "inviteGroupChat": "📨 Group chat invite", - "invitePrivateChat": "📨 Private chat invite", "invalidInput": "Invalid input!", "wrongPinEntered": "Wrong pin entered! Try again in {seconds} seconds...", "@wrongPinEntered": { @@ -2613,7 +2299,6 @@ "createGroupAndInviteUsers": "Create a group and invite users", "groupCanBeFoundViaSearch": "Group can be found via search", "wrongRecoveryKey": "Sorry... this does not seem to be the correct recovery key.", - "startConversation": "Start conversation", "commandHint_sendraw": "Send raw json", "databaseMigrationTitle": "Database is optimized", "databaseMigrationBody": "Please wait. This may take a moment.", @@ -2625,26 +2310,13 @@ "pleaseChooseAStrongPassword": "Please choose a strong password", "passwordsDoNotMatch": "Passwords do not match", "passwordIsWrong": "Your entered password is wrong", - "publicLink": "Public link", "publicChatAddresses": "Public chat addresses", "createNewAddress": "Create new address", "joinSpace": "Join space", "publicSpaces": "Public spaces", "addChatOrSubSpace": "Add chat or sub space", - "subspace": "Subspace", - "decline": "Decline", "thisDevice": "This device:", "initAppError": "An error occured while init the app", - "userRole": "User role", - "minimumPowerLevel": "{level} is the minimum power level.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchIn": "Search in chat \"{chat}\"...", "@searchIn": { "type": "String", @@ -2657,18 +2329,6 @@ "searchMore": "Search more...", "gallery": "Gallery", "files": "Files", - "databaseBuildErrorBody": "Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at {url}. The error message is: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "Your session is lost. Please report this error to the developers at {url}. The error message is: {error}", "@sessionLostBody": { "type": "String", @@ -2693,15 +2353,6 @@ } } }, - "forwardMessageTo": "Forward message to {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "Send read receipts", "sendTypingNotificationsDescription": "Other participants in a chat can see when you are typing a new message.", "sendReadReceiptsDescription": "Other participants in a chat can see when you have read a message.", @@ -2844,9 +2495,6 @@ "changelog": "Changelog", "sendCanceled": "Sending canceled", "loginWithMatrixId": "Login with Matrix-ID", - "discoverHomeservers": "Discover homeservers", - "whatIsAHomeserver": "What is a homeserver?", - "homeserverDescription": "All your data is stored on the homeserver, just like an email provider. You can choose which homeserver you want to use, while you can still communicate with everyone. Learn more at at https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "Doesn't seem to be a compatible homeserver. Wrong URL?", "calculatingFileSize": "Calculating file size...", "prepareSendingAttachment": "Prepare sending attachment...", @@ -2912,7 +2560,6 @@ "appWantsToUseForLoginDescription": "You hereby allow the app and website to share information about you.", "open": "Open", "waitingForServer": "Waiting for server...", - "appIntroduction": "FluffyChat lets you chat with your friends across different messengers. Learn more at https://matrix.org or just tap *Continue*.", "newChatRequest": "📩 New chat request", "contentNotificationSettings": "Content notification settings", "generalNotificationSettings": "General notification settings", @@ -3006,10 +2653,6 @@ "longPressToRecordVoiceMessage": "Long press to record voice message.", "pause": "Pause", "resume": "Resume", - "newSubSpace": "New sub space", - "moveToDifferentSpace": "Move to different space", - "moveUp": "Move up", - "moveDown": "Move down", "removeFromSpaceDescription": "The chat will be removed from the space but still appear in your chat list.", "countChats": "{chats} chats", "@countChats": { @@ -3052,7 +2695,6 @@ "startPoll": "Start poll", "endPoll": "End poll", "answersVisible": "Answers visible", - "answersHidden": "Answers hidden", "pollQuestion": "Poll question", "answerOption": "Answer option", "addAnswerOption": "Add answer option", @@ -3135,4 +2777,4 @@ "powerLevel": "Power level", "setPowerLevelDescription": "Power levels define what a member is allowed to do in this room and usually range between 0 and 100.", "owner": "Owner" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_eo.arb b/lib/l10n/intl_eo.arb index 44b04049..ab05c171 100644 --- a/lib/l10n/intl_eo.arb +++ b/lib/l10n/intl_eo.arb @@ -123,18 +123,6 @@ } } }, - "badServerVersionsException": "La hejmservilo subtenas la jenajn version de la specifaĵo:\n{serverVersions}\nSed ĉi tiu aplikaĵo subtenas nur {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Forbari de babilo", "@banFromChat": { "type": "String", @@ -167,11 +155,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Mesaĝoj de robotoj", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Nuligi", "@cancel": { "type": "String", @@ -496,31 +479,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Konfirmi", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Konektiĝi", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakto invitiĝis al la grupo", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Enhavas prezentan nomon", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Enhavas uzantonomon", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "La enhavo raportiĝis al la administrantoj de la servilo", "@contentHasBeenReported": { "type": "String", @@ -600,33 +563,6 @@ } } }, - "dateWithoutYear": "{day}a de la {month}a", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}a de la {month}a de {year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Ĉi tio malaktivigos vian konton de uzanto. Ne eblas tion malfari! Ĉu certe vi certas?", "@deactivateAccountWarning": { "type": "String", @@ -732,11 +668,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Vi devas elekti mallongigon de mieneto kaj bildon!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Malplena babilo", "@emptyChat": { "type": "String", @@ -786,11 +717,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Enigu vian hejmservilon", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Eraris akirado de loko: {error}", "@errorObtainingLocation": { "type": "String", @@ -840,11 +766,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Iri al la nova ĉambro", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grupo", "@group": { "type": "String", @@ -916,11 +837,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identeco", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Malatenti", "@ignore": { "type": "String", @@ -982,11 +898,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Invito por mi", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} invitis vin al FluffyChat. \n1. Instalu la aplikaĵon FluffyChat: https://fluffychat.im \n2. Registriĝu aŭ salutu \n3. Malfermu la invitan ligilon: {link}", "@inviteText": { "type": "String", @@ -1066,11 +977,6 @@ "type": "String", "placeholders": {} }, - "license": "Permesilo", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Hela", "@lightTheme": { "type": "String", @@ -1114,11 +1020,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Ŝanĝoj de anoj", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Mencii", "@mention": { "type": "String", @@ -1214,11 +1115,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Sciigoj ŝaltiĝis por ĉi tiu konto", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} uzantoj tajpas…", "@numUsersTyping": { "type": "String", @@ -1313,11 +1209,6 @@ "type": "String", "placeholders": {} }, - "people": "Personoj", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Elekti bildon", "@pickImage": { "type": "String", @@ -1337,11 +1228,6 @@ } } }, - "pleaseChoose": "Bonvolu elekti", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Bonvolu elekti paskodon", "@pleaseChooseAPasscode": { "type": "String", @@ -1435,11 +1321,6 @@ } } }, - "rejoin": "Ree aliĝi", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Forigi", "@remove": { "type": "String", @@ -1459,11 +1340,6 @@ } } }, - "removeDevice": "Forigi aparaton", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Malforbari", "@unbanFromChat": { "type": "String", @@ -1519,15 +1395,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Vidita de {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Sendi", "@send": { "type": "String", @@ -1558,16 +1425,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Sendi originalon", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Sendi glumarkon", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Sendi filmon", "@sendVideo": { "type": "String", @@ -1632,21 +1489,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Agordi proprajn mienetojn", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Agordi invitan ligilon", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Agordi nivelon de permesoj", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Agordi staton", "@setStatus": { "type": "String", @@ -1681,11 +1523,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Ununura saluto", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Preterpasi", "@skip": { "type": "String", @@ -1756,21 +1593,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Baskuli elstarigon", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Basklui silentigon", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Baskuli legitecon", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Tro multaj petoj. Bonvolu reprovi poste!", "@tooManyRequestsWarning": { "type": "String", @@ -1837,15 +1659,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 nelegita babilo} other{{unreadCount} nelegitaj babiloj}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} kaj {count} aliaj tajpas…", "@userAndOthersAreTyping": { "type": "String", @@ -1970,11 +1783,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Fonbildo", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Averto!", "@warning": { "type": "String", @@ -2061,8 +1869,6 @@ "type": "String", "description": "Usage hint for the command /send" }, - "chatHasBeenAddedToThisSpace": "Babilo aldoniĝis al ĉi tiu aro", - "@chatHasBeenAddedToThisSpace": {}, "autoplayImages": "Memage ludi movbildajn glumarkojn kaj mienetojn", "@autoplayImages": { "type": "String", @@ -2074,4 +1880,4 @@ "@homeserver": {}, "sendOnEnter": "Sendi per eniga klavo", "@sendOnEnter": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index 0275ef30..b580147b 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -109,18 +109,6 @@ } } }, - "badServerVersionsException": "El servidor soporta las siguientes versiones de la especificación:\n{serverVersions}\npero esta aplicación sólo soporta las versiones {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Vetar del chat", "@banFromChat": { "type": "String", @@ -378,16 +366,6 @@ "type": "String", "placeholders": {} }, - "confirm": "Confirmar", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Conectar", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "El contacto ha sido invitado al grupo", "@contactHasBeenInvitedToTheGroup": { "type": "String", @@ -462,33 +440,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Se desactivará su cuenta de usuario. ¡La operación no se puede cancelar! ¿Está seguro?", "@deactivateAccountWarning": { "type": "String", @@ -564,11 +515,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "¡Debes elegir un atajo de emote y una imagen!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Chat vacío", "@emptyChat": { "type": "String", @@ -608,11 +554,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Ingrese su servidor", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "¡Todo listo!", "@everythingReady": { "type": "String", @@ -704,11 +645,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identidad", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignoredUsers": "Usuarios ignorados", "@ignoredUsers": { "type": "String", @@ -834,11 +770,6 @@ "type": "String", "placeholders": {} }, - "license": "Licencia", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Claro", "@lightTheme": { "type": "String", @@ -1002,11 +933,6 @@ "type": "String", "placeholders": {} }, - "people": "Personas", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Elegir imagen", "@pickImage": { "type": "String", @@ -1084,11 +1010,6 @@ } } }, - "rejoin": "Volver a unirse", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Eliminar", "@remove": { "type": "String", @@ -1108,11 +1029,6 @@ } } }, - "removeDevice": "Eliminar dispositivo", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Eliminar la expulsión", "@unbanFromChat": { "type": "String", @@ -1138,15 +1054,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Visto por {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Enviar", "@send": { "type": "String", @@ -1172,11 +1079,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Enviar el original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Enviar video", "@sendVideo": { "type": "String", @@ -1241,11 +1143,6 @@ "type": "String", "placeholders": {} }, - "setInvitationLink": "Establecer enlace de invitación", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "setStatus": "Establecer estado", "@setStatus": { "type": "String", @@ -1386,15 +1283,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 chat no leído} other{{unreadCount} chats no leídos}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} y {count} más están escribiendo…", "@userAndOthersAreTyping": { "type": "String", @@ -1519,11 +1407,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Fondo de pantalla:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "¡Advertencia!", "@warning": { "type": "String", @@ -1594,11 +1477,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Mensajes de bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "oneClientLoggedOut": "Se ha cerrado en la sesión de uno de sus clientes", "addAccount": "Añadir cuenta", "editBundlesForAccount": "Editar paquetes para esta cuenta", @@ -1609,26 +1487,11 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Enviar stickers", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Establecer nivel de permisos", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "shareLocation": "Compartir ubicación", "@shareLocation": { "type": "String", "placeholders": {} }, - "singlesignon": "Inicio de sesión único", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "status": "Estado", "@status": { "type": "String", @@ -1663,11 +1526,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Invitar por mí", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "noPasswordRecoveryDescription": "Aún no ha agregado una forma de recuperar su contraseña.", "@noPasswordRecoveryDescription": { "type": "String", @@ -1692,7 +1550,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "El chat se ha agregado a este espacio", "commandInvalid": "Comando inválido", "@commandInvalid": { "type": "String" @@ -1747,11 +1604,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Cambios de miembros", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "createNewSpace": "Nuevo espacio", "@createNewSpace": { "type": "String", @@ -1762,11 +1614,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Establecer emoticonos personalizados", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorar", "@ignore": { "type": "String", @@ -1777,22 +1624,12 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notificaciones habilitadas para esta cuenta", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "offensive": "Ofensiva", "@offensive": { "type": "String", "placeholders": {} }, "serverRequiresEmail": "Este servidor necesita validar su dirección de correo electrónico para registrarse.", - "pleaseChoose": "Por favor elija", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "replaceRoomWithNewerVersion": "Reemplazar habitación con una versión más nueva", "@replaceRoomWithNewerVersion": { "type": "String", @@ -1852,11 +1689,6 @@ "@sendAsText": { "type": "String" }, - "toggleMuted": "Alternar silenciado", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Demasiadas solicitudes. ¡Por favor inténtelo más tarde!", "@tooManyRequestsWarning": { "type": "String", @@ -1877,11 +1709,6 @@ "type": "String", "placeholders": {} }, - "containsUserName": "Contiene nombre de usuario", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "oopsPushError": "¡UPS¡ Desafortunadamente, se produjo un error al configurar las notificaciones push.", "@oopsPushError": { "type": "String", @@ -1995,11 +1822,6 @@ "type": "String", "description": "Usage hint for the command /react" }, - "containsDisplayName": "Contiene nombre para mostrar", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "editRoomAvatar": "Editar avatar de sala", "@editRoomAvatar": { "type": "String", @@ -2015,11 +1837,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Ir a la nueva sala", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "noMatrixServer": "{server1} no es un servidor matrix, usar {server2} en su lugar?", "@noMatrixServer": { "type": "String", @@ -2070,16 +1887,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Alternar favorito", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Marcar como: leído / no leído", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "whoCanPerformWhichAction": "Quién puede realizar qué acción", "@whoCanPerformWhichAction": { "type": "String", @@ -2104,14 +1911,8 @@ }, "messageInfo": "Información del mensaje", "time": "Tiempo", - "openVideoCamera": "Abrir la cámara para un video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "repeatPassword": "Repite la contraseña", "removeFromSpace": "Eliminar del espacio", - "addToSpaceDescription": "Elige un espacio para añadirle este chat.", "openGallery": "Abrir galería", "start": "Iniciar", "commandHint_discardsession": "Descartar sesión", @@ -2120,25 +1921,11 @@ "description": "Usage hint for the command /discardsession" }, "messageType": "Tipo de Mensaje", - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "publish": "Publicar", "newSpace": "Nuevo espacio", "allSpaces": "Todos los espacios", - "widgetUrlError": "Esta no es una URL válida.", "commandHint_markasgroup": "Marcar como grupo", - "nextAccount": "Siguiente cuenta", "youRejectedTheInvitation": "Rechazaste la invitación", "newGroup": "Nuevo grupo", - "widgetJitsi": "Jitsi Meet", - "previousAccount": "Cuenta anterior", "users": "Usuarios", "youInvitedBy": "📩 Has sido invitado por {user}", "@youInvitedBy": { @@ -2149,7 +1936,6 @@ } }, "youAcceptedTheInvitation": "👍 Aceptaste la invitación", - "widgetEtherpad": "Nota de texto", "commandHint_cuddle": "Enviar un abrazo", "supposedMxid": "Esto debería ser {mxid}", "@supposedMxid": { @@ -2162,7 +1948,6 @@ }, "importFromZipFile": "Importar de un archivo .zip", "exportEmotePack": "Exportar paquete de emotes a .zip", - "addChatDescription": "Añadir una descripción del chat...", "sendTypingNotifications": "Enviar notificaciones \"está escribiendo\"", "importEmojis": "Importar emojis", "confirmMatrixId": "Por favor confirma tu Matrix ID para borrar tu cuenta.", @@ -2178,8 +1963,6 @@ } } }, - "otherCallingPermissions": "Micrófono, cámara y otros permisos de FluffyChat", - "emailOrUsername": "Correo electrónico o nombre de usuario", "countFiles": "{count} archivos", "@countFiles": { "placeholders": { @@ -2203,33 +1986,19 @@ } }, "markAsRead": "Marcar como leído", - "widgetName": "Nombre", "replace": "Reemplazar", "unsupportedAndroidVersionLong": "Esta característica requiere una versión más reciente de Android. Por favor, compruebe las actualizaciones o la compatibilidad de LineageOS.", "storeSecurlyOnThisDevice": "Almacenar de forma segura en este dispositivo", "openChat": "Abrir chat", "screenSharingDetail": "Usted está compartiendo su pantalla en FluffyChat", - "allRooms": "Todos los chats grupales", - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "widgetVideo": "Vídeo", "dismiss": "Descartar", "unsupportedAndroidVersion": "Versión de Android no compatible", - "indexedDbErrorLong": "El almacenamiento de mensajes, por desgracia, no está habilitado en el modo privado por defecto.\nPor favor, visite\n - about:config\n - Establezca dom.indexedDB.privateBrowsing.enabled a true\nDe otra forma, no es posible usar FluffyChat.", - "startFirstChat": "Comience su primer chat", "commandHint_create": "Crear un chat grupal vacío\nUse --no-encryption para deshabilitar el cifrado", "@commandHint_create": { "type": "String", "description": "Usage hint for the command /create" }, "user": "Usuario", - "separateChatTypes": "Separar chats directos de grupos", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "tryAgain": "Inténtelo de nuevo", "youKickedAndBanned": "🙅 Usted expulsó y prohibió el acceso a {user}", "@youKickedAndBanned": { @@ -2241,12 +2010,6 @@ }, "messagesStyle": "Mensajes:", "chatDescription": "Descripción del chat", - "callingAccountDetails": "Permite a FluffyChat utilizar la aplicación de llamadas nativa de Android.", - "enterSpace": "Unirse al espacio", - "pleaseEnterRecoveryKey": "Por favor, introduzca su clave de recuperación:", - "widgetNameError": "Por favor, proporciona un nombre para mostrar.", - "addWidget": "Añadir widget", - "hydrateTor": "TOR: Importar sesión exportada", "storeInAppleKeyChain": "Almacenar en la KeyChain de Apple", "hydrate": "Restaurar desde fichero de copia de seguridad", "invalidServerName": "Nombre del servidor no válido", @@ -2267,31 +2030,11 @@ } }, "videoCallsBetaWarning": "Tenga en cuenta que las videollamadas están actualmente en fase beta. Es posible que no funcionen como se espera o que no funcionen de ninguna manera en algunas plataformas.", - "callingPermissions": "Permisos de llamadas", "unlockOldMessages": "Desbloquear mensajes viejos", - "numChats": "{number} chats", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "optionalRedactReason": "(Opcional) Motivo para censurar este mensaje...", "dehydrate": "Exportar sesión y limpiar dispositivo", - "switchToAccount": "Cambiar a la cuenta {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "experimentalVideoCalls": "Videollamadas experimentales", "pleaseEnterRecoveryKeyDescription": "Para desbloquear sus viejos mensajes, introduzca su clave de recuperación que se generó en una sesión anterior. Su clave de recuperación NO es su contraseña.", - "inviteContactToGroupQuestion": "¿Quieres invitar a {contact} al chat {groupName}?", "redactedByBecause": "Censurado por {username} porque: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2312,7 +2055,6 @@ } } }, - "enterRoom": "Unirse a la sala", "confirmEventUnpin": "¿Seguro que quiere desfijar permanentemente el evento?", "youInvitedUser": "📩 Usted invitó a {user}", "@youInvitedUser": { @@ -2324,11 +2066,8 @@ }, "redactMessageDescription": "El mensaje será censurado para todas las personas participantes en la conversación. Esto no se puede deshacer.", "recoveryKey": "Clave de recuperación", - "dehydrateTorLong": "Si está usando TOR, es recomendable exportar la sesión antes de cerrar la ventana.", "doNotShowAgain": "No mostrar de nuevo", - "hideUnimportantStateEvents": "Ocultar eventos de estado no importantes", "screenSharingTitle": "Compartir la pantalla", - "widgetCustom": "Personalizado", "youBannedUser": "Usted prohibió el acceso a {user}", "@youBannedUser": { "placeholders": { @@ -2338,7 +2077,6 @@ } }, "directChat": "Chat directo", - "appearOnTop": "Aparecer en la cima", "foregroundServiceRunning": "Esta notificación aparece cuando el servicio en segundo plano se está ejecutando.", "wasDirectChatDisplayName": "Chat vacío (era {oldDisplayName})", "@wasDirectChatDisplayName": { @@ -2351,7 +2089,6 @@ }, "noChatDescriptionYet": "No se ha creado una descripción del chat aún.", "chatDescriptionHasBeenChanged": "Se ha cambiado la descripción del chat", - "dehydrateTor": "TOR: Exportar sesión", "youKicked": "👞 Usted expulsó a {user}", "@youKicked": { "placeholders": { @@ -2369,7 +2106,6 @@ "placeholders": {} }, "youJoinedTheChat": "Usted se ha unido al chat", - "errorAddingWidget": "Fallo al añadir el widget.", "commandHint_dm": "Iniciar un chat directo\nUse --no-encryption para deshabilitar el cifrado", "@commandHint_dm": { "type": "String", @@ -2385,11 +2121,9 @@ }, "emojis": "Emojis", "createGroup": "Crear grupo", - "hydrateTorLong": "¿Exportó su sesión la última vez que estuvo en TOR? Impórtela rápidamente y continúe chateando.", "custom": "Personalizado", "storeInSecureStorageDescription": "Almacenar la clave de recuperación en el almacenamiento seguro de este dispositivo.", "pinMessage": "Anclar a la sala", - "indexedDbErrorTitle": "Problemas con el modo privado", "googlyEyesContent": "{senderName} te manda ojos saltones", "@googlyEyesContent": { "type": "String", @@ -2410,7 +2144,6 @@ }, "commandHint_googly": "Enviar unos ojos saltones", "noChatsFoundHere": "No se han encontrado chats. Inicia un nuevo chat usando el botón de abajo. ⤵️", - "joinedChats": "Chats Unidos", "space": "Espacio", "spaces": "Espacios", "block": "Bloquear", @@ -2443,27 +2176,12 @@ "blockedUsers": "Usuarios bloqueados", "blockUsername": "Ignorar nombre de usuario", "noMoreChatsFound": "No se encontraron más chats...", - "countChatsAndCountParticipants": "{chats} chats y {participants} participantes", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, - "notifyMeFor": "Notificarme", "presencesToggle": "Mostrar mensajes de estado de otros usuarios", "@presencesToggle": { "type": "String", "placeholders": {} }, "placeCall": "Llamar", - "callingAccount": "Llamando a cuenta", - "appearOnTopDetails": "Permite que la app aparezca delante (no hace falta si ya tienes Fluffychat configurado como cuenta llamante)", "disableEncryptionWarning": "Por motivos de seguridad no es posible deshabilitar el cifrado en un chat si ha sido habilitado previamente.", "setColorTheme": "Poner tema de color:", "inviteGroupChat": "📨 Invitar a grupo", @@ -2477,17 +2195,7 @@ } } }, - "decline": "Declinar", "thisDevice": "Este dispositivo:", - "minimumPowerLevel": "{level} es el nivel mínimo.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "verifyOtherDevice": "🔐 Verificar otro dispositivo", "chatPermissionsDescription": "Definir el nivel necesario para ciertas acciones en este chat. Los niveles 0, 50 y 100 habitualmente representan usuarios, moderadores y administradores, pero se puede establecer cualquier escala.", "updateInstalled": "¡🎉 Actualización {version} instalada!", @@ -2522,36 +2230,11 @@ }, "appWantsToUseForLoginDescription": "Por la presente permites a la app y web compartir información sobre ti.", "encryptThisChat": "Cifrar este chat", - "publicLink": "Enlace público", "transparent": "Transparente", "select": "Elegir", "newPassword": "Nueva clave", "nothingFound": "No se encontró nada...", - "subspace": "Sub espacio", "openLinkInBrowser": "Abrir enlace en navegador", - "presenceStyle": "Presencia:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, - "youInvitedToBy": "📩 Te han invitado con un enlace a:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "signInWith": "Entrar con {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "setTheme": "Poner tema:", "learnMore": "Aprender más", "incomingMessages": "Mensajes entrantes", "noOtherDevicesFound": "No se han encontrado otros dispositivos", @@ -2658,7 +2341,6 @@ "jumpToLastReadMessage": "Saltar al último mensaje leído", "report": "informe", "readUpToHere": "Leer hasta aquí", - "signInWithPassword": "Entrar con clave", "formattedMessages": "Mensajes con formato", "publicSpaces": "Espacios públicos", "formattedMessagesDescription": "Mostrar contenido de mensaje enriquecido, como texto en negrita, usando markdown.", @@ -2702,7 +2384,6 @@ "createGroupAndInviteUsers": "Crear un grupo e invitar usuarios", "databaseMigrationTitle": "La base de datos está optimizada", "searchForUsers": "Buscar @usuarios...", - "startConversation": "Iniciar conversación", "gallery": "Galería", "files": "Archivos", "initAppError": "Hubo un error al arrancar la app", @@ -2776,8 +2457,6 @@ "website": "Web", "name": "Nombre", "knockRestricted": "Aviso restringido", - "hideMemberChangesInPublicChats": "Ocultar cambios de miembros en salas públicas", - "hideMemberChangesInPublicChatsBody": "No mostrar en el chat que alguien entra o sale de una sala pública para mejorar la inteligibilidad.", "passwordRecoverySettings": "Ajustes de recuperación de clave", "acceptedKeyVerification": "{sender} aceptó la verificación de clave", "@acceptedKeyVerification": { @@ -2804,18 +2483,6 @@ "joinSpace": "Unirse al espacio", "wrongRecoveryKey": "Lo siento... esta no parece ser la clave de recuperación correcta.", "leaveEmptyToClearStatus": "Deja vacío para limpiar tu estado.", - "databaseBuildErrorBody": "No pude crear la base de datos SQlite. La app intenta usar la base de datos heredada por ahora. Por favor, informa de este error a los desarrolladores en {url}. El mensaje de error es: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "restoreSessionBody": "La app ahora trata de recuperar tu sesión de la copia de seguridad. Por favor, informa de este error a los desarrolladores en {url}. El mensaje de error es: {error}", "@restoreSessionBody": { "type": "String", @@ -2877,15 +2544,12 @@ "sorryThatsNotPossible": "Lo siento... eso no es posible", "publicChatAddresses": "Dirección de chat pública", "createNewAddress": "Crear nueva dirección", - "userRole": "Rol de usuario", "boldText": "Texto en negrita", "italicText": "Texto en cursiva", "strikeThrough": "Tachado", "searchMore": "Buscar más...", - "noPublicLinkHasBeenCreatedYet": "No se ha creado un enlace público aún", "knock": "Aviso", "newSpaceDescription": "Los espacios permiten consolidar los chats y montar comunidades privadas o públicas.", - "pleaseTryAgainLaterOrChooseDifferentServer": "Por favor, intente luego o elija un servidor distinto.", "pleaseEnterANumber": "Por favor pon un número mayor que 0", "archiveRoomDescription": "El chat se moverá al archivo. Otros usuarios podrán ver que has abandonado el chat.", "pushNotificationsNotAvailable": "No están disponibles las notificaciones emergentes", @@ -2916,8 +2580,6 @@ "addLink": "Añadir enlace", "unableToJoinChat": "No se puede entrar al chat. Puede que la otra parte ya haya cerrado la conversación.", "waitingForServer": "Esperando al servidor...", - "discoverHomeservers": "Descubrir homeservers", - "profileNotFound": "El usuario no se encontró en el servidor. Puede que haya un problema de conexión o el usuario no exista.", "synchronizingPleaseWaitCounter": " Sincronizando… ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -2937,17 +2599,8 @@ } }, "noBackupWarning": "¡Cuidado! Si no se habilita la copia de seguridad del chat, perderás acceso a tus mensajes cifrados. Se recomienda encarecidamente habilitar la copia de seguridad del chat antes de salir.", - "userWouldLikeToChangeTheChat": "{user} quiere unirse al chat.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "yourGlobalUserIdIs": "Tu id de usuario global es: ", "noKeyForThisMessage": "Esto puede ocurrir si el mensaje se envió antes de que entraras en tu cuenta en este dispositivo.\n\nTambién puede que el remitente haya bloqueado tu dispositivo o haya fallado algo en la conexión a Internet.\n\n¿Puedes leer el mensaje en otra sesión? Entonces, ¡puedes transferir el mensaje desde allí! Ve a Ajustes > Dispositivos y asegúrate de que tus dispositivos se han verificado mutuamente. Cuando abras la sala la próxima vez y ambas sesiones estén en primer plano, las claves se transmitirán automáticamente.\n\n¿No quieres perder las claves al salir o al cambiar de dispositivo? Asegúrate de que has habilitado la copia de seguridad del chat en los ajustes.", - "invitePrivateChat": "📨 Invitar a grupo privado", "banUserDescription": "Se expulsará al usuario del chat y no podrá volver a entrar hasta que se le permita.", "loginWithMatrixId": "Entrar con un ID de Matrix", "changeTheCanonicalRoomAlias": "Cambiar la dirección pública principal de chat", @@ -2972,19 +2625,7 @@ } } }, - "homeserverDescription": "Todos tus datos se guardan en el homeserver, como en un proveedor de correo electrónico. Puedes elegir el homeserver que quieres usar, a la par que te puedes comunicar con todos. Más en https://matrix.org.", - "whatIsAHomeserver": "¿Qué es un homeserver?", "open": "Abrir", - "appIntroduction": "FluffyChat te permite chatear con tus amigos con diferentes mensajerías. Aprende más en https://matrix.org o simplemente pincha *Continuar*.", - "forwardMessageTo": "¿Reenviar mensaje a {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "previous": "Anterior", "otherPartyNotLoggedIn": "La otra parte ahora mismo no está conectada y por tanto ¡no puede recibir mensajes!", "takeAPhoto": "Tomar foto", @@ -3016,10 +2657,7 @@ } } }, - "setCustomPermissionLevel": "Agregar nivel personalizado de permiso", - "setPermissionsLevelDescription": "Por favor elige un rol predeterminado o un nivel de permiso personalizado entre 0 a 100.", "ignoreUser": "Ignorar usuario", - "normalUser": "Usuario normal", "commandHint_logout": "Salir del dispositivo actual", "commandHint_logoutall": "Salir de todos los dispositivos activos", "displayNavigationRail": "Mostrar carril de navegación en móvil", @@ -3034,10 +2672,6 @@ "longPressToRecordVoiceMessage": "Deja presionado para grabar un mensaje.", "pause": "Pausa", "resume": "Continuar", - "newSubSpace": "Nuevo sub espacio", - "moveToDifferentSpace": "Mover a otro espacio", - "moveUp": "Mover arriba", - "moveDown": "Mover abajo", "removeFromSpaceDescription": "El chat sera removido del espacio pero continuara apareciendo en tu lista de chats.", "countChats": "{chats} chats", "@countChats": { @@ -3080,7 +2714,6 @@ } }, "donate": "Donar", - "answersHidden": "Respuestas ocultas", "pollQuestion": "Pregunta de encuesta", "answerOption": "Respuesta", "addAnswerOption": "Añadir respuesta", @@ -3155,4 +2788,4 @@ "join": "Unirse", "searchOrEnterHomeserverAddress": "Buscar o pon la dirección de tu servidor local", "matrixId": "Matrix ID" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index 50dfc145..bf778a31 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -129,18 +129,6 @@ } } }, - "badServerVersionsException": "See koduserver toetab Matrixi spetsifikatsioonist järgmisi versioone:\n{serverVersions}\nAga see rakendus toetab vaid järgmisi versioone: {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Keela ligipääs vestlusele", "@banFromChat": { "type": "String", @@ -173,11 +161,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Robotite sõnumid", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Katkesta", "@cancel": { "type": "String", @@ -506,31 +489,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Kinnita", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Ühenda", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Sinu kontakt on kutsutud liituma vestlusrühma", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Sisaldab kuvatavat nime", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Sisaldab kasutajanime", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Saatsime selle sisu kohta teate koduserveri haldajate", "@contentHasBeenReported": { "type": "String", @@ -610,33 +573,6 @@ } } }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}.{month}.{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Järgnevaga eemaldatakse sinu konto kasutusest. Seda tegevust ei saa tagasi pöörata! Kas sa ikka oled kindel?", "@deactivateAccountWarning": { "type": "String", @@ -742,11 +678,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Sa pead valima emotsioonitegevuse lühikoodi ja pildi!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Vestlust pole olnud", "@emptyChat": { "type": "String", @@ -796,11 +727,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Sisesta oma koduserveri aadress", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Viga asukoha tuvastamisel: {error}", "@errorObtainingLocation": { "type": "String", @@ -850,11 +776,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Hakka kasutama uut jututuba", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Vestlusrühm", "@group": { "type": "String", @@ -926,11 +847,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identiteet", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Eira", "@ignore": { "type": "String", @@ -992,11 +908,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Kutse minu jaoks", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} kutsus sind kasutama Matrix'i-põhist suhtlusrakendust FluffyChat. \n1. Ava fluffychat.im ja paigalda FluffyChat'i rakendus \n2. Liitu kasutajaks või logi sisse olemasoleva Matrix'i kasutajakontoga\n3. Ava kutse link: \n {link}", "@inviteText": { "type": "String", @@ -1076,11 +987,6 @@ "type": "String", "placeholders": {} }, - "license": "Litsents", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Hele", "@lightTheme": { "type": "String", @@ -1134,11 +1040,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Muudatused liikmeskonnas", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Märgi ära", "@mention": { "type": "String", @@ -1246,11 +1147,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Teavitused on sellel kontol kasutusel", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} kasutajat kirjutavad…", "@numUsersTyping": { "type": "String", @@ -1350,11 +1246,6 @@ "type": "String", "placeholders": {} }, - "people": "Inimesed", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Vali pilt", "@pickImage": { "type": "String", @@ -1374,11 +1265,6 @@ } } }, - "pleaseChoose": "Palun vali", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Palun vali rakenduse PIN-kood", "@pleaseChooseAPasscode": { "type": "String", @@ -1472,11 +1358,6 @@ } } }, - "rejoin": "Liitu uuesti", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Eemalda", "@remove": { "type": "String", @@ -1496,11 +1377,6 @@ } } }, - "removeDevice": "Eemalda seade", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Eemalda suhtluskeeld", "@unbanFromChat": { "type": "String", @@ -1556,15 +1432,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Sõnumit nägi {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Saada", "@send": { "type": "String", @@ -1599,16 +1466,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Saada fail muutmata kujul", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Saada kleeps", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Saada videofail", "@sendVideo": { "type": "String", @@ -1673,21 +1530,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Kohanda emotsioonitegevusi", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Tee kutselink", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Seadista õigusi", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Määra olek", "@setStatus": { "type": "String", @@ -1722,11 +1564,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Ühekordne sisselogimine", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Jäta vahele", "@skip": { "type": "String", @@ -1797,21 +1634,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Muuda olekut lemmikuna", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Lülita summutamine sisse või välja", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Märgi loetuks / lugemata", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Liiga palju päringuid. Palun proovi hiljem uuesti!", "@tooManyRequestsWarning": { "type": "String", @@ -1878,15 +1700,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 lugemata vestlus} other{{unreadCount} lugemata vestlust}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} ja {count} muud kirjutavad…", "@userAndOthersAreTyping": { "type": "String", @@ -2011,11 +1824,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Taustapilt:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Hoiatus!", "@warning": { "type": "String", @@ -2081,7 +1889,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Lisasime vestluse kogukonda", "addToSpace": "Lisa kogukonda", "scanQrCode": "Skaneeri QR-koodi", "sendOnEnter": "Saada sõnum sisestusklahvi vajutusel", @@ -2103,7 +1910,6 @@ "messageType": "Sõnumi tüüp", "sender": "Saatja", "openGallery": "Ava galerii", - "addToSpaceDescription": "Vali kogukond, kuhu soovid seda vestlust lisada.", "removeFromSpace": "Eemalda kogukonnast", "start": "Alusta", "commandHint_discardsession": "Loobu sessioonist", @@ -2126,11 +1932,6 @@ "type": "String", "description": "Usage hint for the command /create" }, - "openVideoCamera": "Tee video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "markAsRead": "Märgi loetuks", "reportUser": "Teata kasutajast", "openChat": "Ava vestlus", @@ -2154,34 +1955,8 @@ "confirmEventUnpin": "Kas sa oled kindel, et tahad esiletõstetud sündmuse jäädavalt eemaldada?", "pinMessage": "Tõsta sõnum jututoas esile", "videoCallsBetaWarning": "Palun arvesta, et videokõned on veel beetajärgus. Nad ei pruugi veel toimida kõikidel platvormidel korrektselt.", - "emailOrUsername": "E-posti aadress või kasutajanimi", "experimentalVideoCalls": "Katselised videokõned", "unsupportedAndroidVersionLong": "See funktsionaalsus eeldab uuemat Androidi versiooni. Palun kontrolli, kas sinu nutiseadmele leidub süsteemiuuendusi või saaks seal Lineage OSi kasutada.", - "nextAccount": "Järgmine kasutajakonto", - "separateChatTypes": "Eraldi vestlused ja jututoad", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "errorAddingWidget": "Vidina lisamisel tekkis viga.", - "widgetNameError": "Palun sisesta kuvatav nimi.", - "addWidget": "Lisa vidin", - "previousAccount": "Eelmine kasutajakonto", - "widgetUrlError": "See pole korrektne URL.", - "widgetName": "Nimi", - "widgetCustom": "Kohandatud", - "widgetJitsi": "Jitsi Meet", - "widgetEtherpad": "Märkmed ja tekstid", - "widgetVideo": "Video", - "switchToAccount": "Pruugi kasutajakontot # {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "youAcceptedTheInvitation": "👍 Sa võtsid kutse vastu", "youUnbannedUser": "Sa eemaldasid suhtluskeelu kasutajalt {user}", "@youUnbannedUser": { @@ -2216,15 +1991,6 @@ } } }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "youRejectedTheInvitation": "Sa lükkasid kutse tagasi", "youKicked": "👞 Sa müksasid kasutaja {user} välja", "@youKicked": { @@ -2250,8 +2016,6 @@ } } }, - "publish": "Avalda", - "pleaseEnterRecoveryKey": "Palun sisesta oma taastevõti:", "recoveryKey": "Taastevõti", "users": "Kasutajad", "storeInSecureStorageDescription": "Salvesta taastevõti selle seadme turvahoidlas.", @@ -2271,13 +2035,7 @@ } }, "dehydrate": "Ekspordi sessiooni teave ja kustuta nutiseadmest rakenduse andmed", - "dehydrateTor": "TOR'i kasutajad: Ekspordi sessioon", - "hydrateTor": "TOR'i kasutajatele: impordi viimati eksporditud sessiooni andmed", - "hydrateTorLong": "Kui viimati TOR'i võrku kasutasid, siis kas sa eksportisid oma sessiooni andmed? Kui jah, siis impordi nad mugavasti ja jätka suhtlemist.", - "indexedDbErrorTitle": "Brauseri privaatse akna kasutamisega seotud asjaolud", "dehydrateWarning": "Seda tegevust ei saa tagasi pöörata. Palun kontrolli, et sa oled varukoopia turvaliselt salvestanud.", - "dehydrateTorLong": "Kui oled TOR'i võrgu kasutaja, siis enne akna sulgemist palun ekspordi viimase sessiooni andmed.", - "indexedDbErrorLong": "Privaatse akna puhul andmete salvestamine vaikimisi pole kasutusel.\nPalun toimi alljärgnevalt:\n- ava about:config\n- määra dom.indexedDB.privateBrowsing.enabled väärtuseks true\nVastasel juhul sa ei saa FluffyChat'i kasutada.", "hydrate": "Taasta varundatud failist", "user": "Kasutaja", "custom": "Kohandatud", @@ -2295,30 +2053,12 @@ "commandHint_markasdm": "Märgi otsevestusluseks antud Matrixi ID jaoks", "whyIsThisMessageEncrypted": "Miks see sõnum pole loetav?", "noKeyForThisMessage": "See võib juhtuda, kui sõnum oli saadetud enne, kui siin seadmes oma kontoga sisse logisid.\n\nSamuti võib juhtuda siis, kui saatja on lugemises selles seadmes blokeerinud või on tekkinud tõrkeid veebiühenduses.\n\nAga mõnes teises seadmes saad seda sõnumit lugeda? Siis sa võid sõnumi sealt üle tõsta. Ava Seadistused -> Seadmed ning kontrolli, et kõik sinu seadmed on omavahel verifitseeritud. Kui avad selle vestluse või jututoa ning mõlemad sessioonid on avatud, siis vajalikud krüptovõtmed saadetakse automaatset.\n\nKas sa soovid vältida krüptovõtmete kadumist väljalogimisel ja seadmete vahetusel? Siis palun kontrolli, et seadistuses on krüptovõtmete varundus sisse lülitatud.", - "callingPermissions": "Helistamise õigused", - "callingAccountDetails": "Võimaldab FluffyChat'il kasutada Androidi helistamisrakendust.", - "appearOnTop": "Luba pealmise rakendusena", - "otherCallingPermissions": "Mikrofoni, kaamera ja muud FluffyChat'i õigused", "newGroup": "Uus jututuba", "newSpace": "Uus kogukond", - "enterSpace": "Sisene kogukonda", - "enterRoom": "Ava jututuba", - "appearOnTopDetails": "Sellega lubad rakendust avada kõige pealmisena (pole vajalik, kui Fluffychat on juba seadistatud toimima helistamiskontoga)", - "callingAccount": "Helistamiskonto", "screenSharingTitle": "ekraani jagamine", "foregroundServiceRunning": "See teavitus toimib siis, kui esiplaaniteenus töötab.", "allSpaces": "Kõik kogukonnad", "screenSharingDetail": "Sa jagad oma ekraani FuffyChati vahendusel", - "numChats": "{number} vestlust", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Peida väheolulised olekuteated", "doNotShowAgain": "Ära näita uuesti", "commandHint_cuddle": "Saada üks kaisutus", "commandHint_hug": "Saada üks kallistus", @@ -2359,7 +2099,6 @@ } } }, - "startFirstChat": "Alusta oma esimest vestlust", "encryptThisChat": "Krüpti see vestlus", "disableEncryptionWarning": "Kui vestluses on krüptimine kasutusele võetud, siis turvalisuse huvides ei saa seda hiljem välja lülitada.", "sorryThatsNotPossible": "Vabandust... see ei ole võimalik", @@ -2383,23 +2122,7 @@ "jump": "Hüppa", "openLinkInBrowser": "Ava link veebibrauseris", "report": "teata", - "allRooms": "Kõik vestlusrühmad", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "reportErrorDescription": "😭 Oh appike! Midagi läks valesti. Kui soovid, võid sellest veast arendajatele teatada.", - "signInWithPassword": "Logi sisse salasõnaga", - "pleaseTryAgainLaterOrChooseDifferentServer": "Palun proovi hiljem uuesti või muuda serveri nime.", - "signInWith": "Logi sisse kasutades teenusepakkujat:", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "importFromZipFile": "Impordi zip-failist", "exportEmotePack": "Ekspordi emotikonide pakk zip-failina", "replace": "Asenda", @@ -2408,8 +2131,6 @@ "importEmojis": "Impordi emojid", "sendTypingNotifications": "Saada kirjutamise teavitusi", "createGroup": "Loo vestlusrühm", - "setTheme": "Vali teema:", - "inviteContactToGroupQuestion": "Kas sa soovid kutsuda kasutajat {contact} „{groupName}“ jututuppa?", "tryAgain": "Proovi uuesti", "chatPermissions": "Vestluse õigused", "chatDescription": "Vestluse kirjeldus", @@ -2419,11 +2140,9 @@ "shareInviteLink": "Jaga kutse linki", "directChat": "Otsevestlus", "setChatDescription": "Lisa vestluse kirjeldus", - "profileNotFound": "Sellist kasutajat serveris ei leidu. Tegemist võib olla kas võrguühenduse probleemiga või sellist kasutajat tõesti pole olemas.", "setColorTheme": "Vali värviteema:", "invite": "Kutsu", "invalidServerName": "Vigane serveri nimi", - "addChatDescription": "Lisa vestluse kirjeldus...", "chatDescriptionHasBeenChanged": "Vestluse kirjeldus on muutunud", "redactMessageDescription": "Sõnumi muudatus kehtib kõikidele vestluses osalejatele. Seda muudatust ei saa tagasi pöörata.", "redactedBy": "Muutja: {username}", @@ -2448,7 +2167,6 @@ } }, "inviteGroupChat": "📨 Kutse vestlusrühma", - "invitePrivateChat": "📨 Kutsu omavahelisele vestlusele", "emoteKeyboardNoRecents": "Hiljuti kasutatud emotikonid kuvame siin...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2484,7 +2202,6 @@ "kickUserDescription": "See kasutaja on nüüd jutuoast välja müksatud, kuid talle pole seatud suhtluskeeldu. Avaliku jututoa puhul saab ta alati uuesti liituda.", "blockListDescription": "Sul on võimalik blokeerida neid kasutajaid, kes sind segavad. Oma isiklikku blokerimisloendisse lisatud kasutajad ei saa sulle saata sõnumeid ega kutseid.", "createGroupAndInviteUsers": "Lisavestlusrühm ja kutsu sinna kasutajaid", - "startConversation": "Alusta vestlust", "blockedUsers": "Blokeeritud kasutajad", "groupCanBeFoundViaSearch": "Vestlusrühm on leitav otsinguga", "noUsersFoundWithQuery": "Päringuga „{query}“ ei leidunud kahkus ühtegi kasutajat. Palun kontrolli, et päringus poleks vigu.", @@ -2509,30 +2226,15 @@ "publicSpaces": "Avalikud kogukonnad", "passwordIsWrong": "Sinu sisestatud salasõna on vale", "pleaseEnterYourCurrentPassword": "Palun sisesta oma praegune salasõna", - "publicLink": "Avalik link", "nothingFound": "Ei leidnud mitte midagi...", - "decline": "Keeldu", "newPassword": "Uus salasõna", "passwordsDoNotMatch": "Salasõnad ei klapi omavahel", - "subspace": "Jututuba või alamkogukond", "select": "Vali", "pleaseChooseAStrongPassword": "Palun sisesta korralik salasõna", "addChatOrSubSpace": "Lisa vestlus või jututuba", "leaveEmptyToClearStatus": "Senise oleku eemaldamiseks jäta väärtus tühjaks.", "joinSpace": "Liitu kogukonnaga", "searchForUsers": "Otsi kasutajat @kasutajanimi ...", - "databaseBuildErrorBody": "SQlite andmebaasi loomine ei õnnestu. Seetõttu üritab rakendus kasutada senist andmehoidlat. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "initAppError": "Rakenduse käivitamisel tekkis viga", "sessionLostBody": "Sinu sessioon on kadunud. Palun teata sellest veast arendajatele siin: {url} märkides veateate: {error}", "@sessionLostBody": { @@ -2559,25 +2261,8 @@ } }, "transparent": "Läbipaistev", - "youInvitedToBy": "📩 Sa oled lingiga saanud kutse jututuppa:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "sendReadReceipts": "Saada lugemisteatisi", "verifyOtherUserDescription": "Kui sa oled vestluse teise osapoole verifitseerinud, siis saad kindel olla, et tead, kellega suhtled. 💪\n\nKui alustad verifitseerimist, siis sinul ja teisel osapoolel tekib rakenduses hüpikaken. Seal kuvatakse emotikonide või numbrite jada, mida peate omavahel võrdlema.\n\nKõige lihtsam on seda teha kas omavahelise kohtumise ajal või videokõne kestel. 👭", - "forwardMessageTo": "Kas edastame sõnumi jututuppa {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendTypingNotificationsDescription": "Muud vestluses osalejad saavad näha, kui sa oled uut sõnumit kirjutamas.", "sendReadReceiptsDescription": "Muud vestluses osalejad näevad, kas oled sõnumit lugenud.", "formattedMessages": "Vormindatud sõnumid", @@ -2639,11 +2324,6 @@ } } }, - "presenceStyle": "Olekuteated:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Näita teiste kasutajate olekuteateid", "@presencesToggle": { "type": "String", @@ -2670,16 +2350,6 @@ "globalChatId": "Üldine vestluse tunnus", "accessAndVisibilityDescription": "Kes võib selle vestlusega liituda ja kuidas on võimalik seda vestlust leida.", "hideRedactedMessagesBody": "Kui keegi muudab sõnumit, siis teda enam ei kuvataks vestluses.", - "userWouldLikeToChangeTheChat": "{user} soovib liituda vestlusega.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "hideMemberChangesInPublicChats": "Peida avalike vestluste liikmelisuse muutused", - "notifyMeFor": "Teavita mind kui", "usersMustKnock": "Kasutajad peavad uksele koputama", "noOneCanJoin": "Mitte keegi ei saa liituda", "knocking": "Koputus uksele", @@ -2693,17 +2363,7 @@ } }, "publicChatAddresses": "Vestluse avalik aadress", - "minimumPowerLevel": "{level} on väikseim võimalik õiguste tase.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "noDatabaseEncryption": "Andmebaasi krüptimine pole sellel platvormil toetatud", - "noPublicLinkHasBeenCreatedYet": "Avalikult kasutatavat linki pole veel olemas", "knock": "Koputa uksele", "appLockDescription": "Kui sa rakendust parasjagu ei kasuta, siis lukusta ta PIN-koodiga", "accessAndVisibility": "Ligipääsetavus ja nähtavus", @@ -2712,11 +2372,9 @@ "customEmojisAndStickersBody": "Lisa või jaga kohandatud emotikone või kleepsupakke, mida võiks kasutada igas vestluses.", "hideRedactedMessages": "Peida muudetud sõnumid", "hideInvalidOrUnknownMessageFormats": "Peida vigase või tundmatu vorminguga sõnumid", - "hideMemberChangesInPublicChatsBody": "Parema loetavuse nimel ära näita vestluse ajajoonel avaliku jututoaga liitumisi ja sealt lahkumisi.", "overview": "Ülevaade", "passwordRecoverySettings": "Salasõna taastamise seadistused", "createNewAddress": "Loo uus aadress", - "userRole": "Kasutaja roll", "thereAreCountUsersBlocked": "Hetkel on {count} blokeeritud kasutajat.", "@thereAreCountUsersBlocked": { "type": "String", @@ -2742,7 +2400,6 @@ "description": "Set to true to always display time of day in 24 hour format." }, "noMoreChatsFound": "Rohkem vestlusi ei leidu...", - "joinedChats": "Vestlusi, millega oled liitunud", "unread": "Lugemata", "space": "Kogukond", "spaces": "Kogukonnad", @@ -2752,18 +2409,6 @@ "space": {} }, "markAsUnread": "Märgi mitteloetuks", - "countChatsAndCountParticipants": "{chats} vestlust ja {participants} osalejat", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "userLevel": "{level} - kasutaja", "@userLevel": { "type": "String", @@ -2820,9 +2465,6 @@ "sendCanceled": "Saatmine on katkestatud", "noChatsFoundHere": "Siin ei leidu veel ühtegi vestlust. Alusta uut vestlust klõpsides allpool asuvat nuppu. ⤵️", "loginWithMatrixId": "Logi sisse Matrix-ID alusel", - "discoverHomeservers": "Leia koduservereid", - "whatIsAHomeserver": "Mis on koduserver?", - "homeserverDescription": "Sarnaselt e-postiteenuse pakkujale on kõik sinu sõnumid salvestatud koduserveris. Sa võid valida sellise koduserveri, nagu sulle meeldib ja nad kõik suudavad teiste koduserveritega suhelda. Lisateavet leiad veebisaidist https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "Ei tundu olema ühilduv koduserver. Kas võrguaadress on ikka õige?", "prepareSendingAttachment": "Valmistume manuse saatmiseks...", "generatingVideoThumbnail": "Loome video pisipilti...", @@ -2906,7 +2548,6 @@ } }, "waitingForServer": "Ootame serveri vastust...", - "appIntroduction": "FluffyChat võimaldab sul suhelda sõprade ja tuttavatega, kes kasutavad erinevaid sõnumikliente. Lisateavet leiad https://matrix.org saidist või lihtsalt klõpsi „Jätka“.", "synchronizingPleaseWaitCounter": " Sünkroniseerime… ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -2985,10 +2626,7 @@ "notSupportedOnThisDevice": "See pole antud seadmes toetatud", "enterNewChat": "Liitu uue vestlusega", "commandHint_roomupgrade": "Uuenda see jututuba antud jututoa versioonini", - "setCustomPermissionLevel": "Seadista kohandatud õiguste tase", - "setPermissionsLevelDescription": "Palun vali eelseadistatud rollide seast või lisa õiguste tase vahemikus 0 kuni 100.", "ignoreUser": "Eira kasutajat", - "normalUser": "Tavakasutaja", "approve": "Kiida heaks", "pleaseWaitUntilInvited": "Palun oota seni, kuni keegi jututoast saadab sulle kutse.", "youHaveKnocked": "Sa oled koputanud", @@ -3024,10 +2662,6 @@ "longPressToRecordVoiceMessage": "Pika vajutusega saad salvestada häälsõnumi.", "pause": "Peata", "resume": "Jätka", - "newSubSpace": "Uus alamkogukond", - "moveToDifferentSpace": "Tõsta teise kogukonda", - "moveUp": "Liiguta ülespoole", - "moveDown": "Liiguta allapoole", "removeFromSpaceDescription": "See vestlus eemaldatakse nüüd kogukonnast, kuid on jätkuvalt nähtav sinu vestluste loendis.", "countChats": "{chats} vestlust", "@countChats": { @@ -3070,7 +2704,6 @@ "startPoll": "Koosta küsitlus", "endPoll": "Lõpeta küsitlus", "answersVisible": "Vastused on näha", - "answersHidden": "Vastused on peidetud", "pollQuestion": "Küsitluse küsimus", "answerOption": "Valikvastus", "addAnswerOption": "Lisa valikvastus", @@ -3138,7 +2771,6 @@ "logs": "Logid", "advancedConfigs": "Täiendav seadistus", "advancedConfigurations": "Täiendavad seadistused", - "signInWithLabel": "Logi sisse kasutades:", "signIn": "Logi sisse", "createNewAccount": "Loo uus kasutajakonto", "signUpGreeting": "FluffyChat kasutab hajutatud võrku! Vali server, kuhu tahad oma kasutajakonto lisada ning alustame!", @@ -3156,4 +2788,4 @@ "powerLevel": "Õiguste tase", "setPowerLevelDescription": "Õiguste tase on üks võimalusi kirjeldamaks seda, mida kasutaja saab jututoas teha ning see tavaliselt väljendub numbriga vahemikust 0 kuni 100.", "owner": "Omanik" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_eu.arb b/lib/l10n/intl_eu.arb index fc913cb7..e0a585a5 100644 --- a/lib/l10n/intl_eu.arb +++ b/lib/l10n/intl_eu.arb @@ -313,16 +313,6 @@ "type": "String", "placeholders": {} }, - "confirm": "Baieztatu", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Konektatu", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontaktua taldera gonbidatu da", "@contactHasBeenInvitedToTheGroup": { "type": "String", @@ -392,33 +382,6 @@ } } }, - "dateWithoutYear": "{month}/{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}/{month}/{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "delete": "Ezabatu", "@delete": { "type": "String", @@ -474,11 +437,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Emote-laburdura eta irudi bat aukeratu behar dituzu!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Txata hutsik dago", "@emptyChat": { "type": "String", @@ -508,11 +466,6 @@ } } }, - "enterYourHomeserver": "Sartu zure zerbitzaria", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "fileName": "Fitxategiaren izena", "@fileName": { "type": "String", @@ -589,11 +542,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identitatea", - "@identity": { - "type": "String", - "placeholders": {} - }, "incorrectPassphraseOrKey": "Pasaesaldi edo berreskuratze-gakoa ez da zuzena", "@incorrectPassphraseOrKey": { "type": "String", @@ -714,11 +662,6 @@ "type": "String", "placeholders": {} }, - "license": "Lizentzia", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Argia", "@lightTheme": { "type": "String", @@ -914,11 +857,6 @@ } } }, - "rejoin": "Batu berriro", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Kendu", "@remove": { "type": "String", @@ -938,11 +876,6 @@ } } }, - "removeDevice": "Kendu gailua", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Kendu txatean duen debekua", "@unbanFromChat": { "type": "String", @@ -963,15 +896,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "{username}(e)k ikusi du", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Bidali", "@send": { "type": "String", @@ -997,11 +921,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Bidali jatorrizkoa", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Bidali bideoa", "@sendVideo": { "type": "String", @@ -1061,11 +980,6 @@ } } }, - "setInvitationLink": "Gonbidapen-esteka ezarri", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "setStatus": "Ezarri egoera", "@setStatus": { "type": "String", @@ -1310,11 +1224,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Horma-irudia:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "whoIsAllowedToJoinThisGroup": "Nor batu daiteke talde honetara", "@whoIsAllowedToJoinThisGroup": { "type": "String", @@ -1440,11 +1349,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Joan gela berrira", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "groups": "Taldeak", "@groups": { "type": "String", @@ -1460,16 +1364,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Niretzako gonbidapenak", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, - "notificationsEnabledForThisAccount": "Gaitu kontu honentzako jakinarazpenak", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} erabiltzaile idazten ari dira…", "@numUsersTyping": { "type": "String", @@ -1492,36 +1386,12 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Aukeratu", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "saveFile": "Gorde fitxategia", "@saveFile": { "type": "String", "placeholders": {} }, - "singlesignon": "Single Sign on", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "unreadChats": "{unreadCount, plural, =1{irakurri gabeko txat 1} other {irakurri gabeko {unreadCount} txat}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "videoCallsBetaWarning": "Kontuan izan bideo-deiak beta fasean daudela. Litekeena da behar bezala erabili ezin izatea —erabili ahal badira—.", - "toggleMuted": "Ikusi / Ezkutatu mutututakoak", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "all": "Guztia", "@all": { "type": "String", @@ -1533,13 +1403,7 @@ "placeholders": {} }, "experimentalVideoCalls": "Bideo-dei esperimentalak", - "emailOrUsername": "ePosta edo erabiltzaile-izena", "enableMultiAccounts": "(BETA) Gaitu kontu bat baino gehiago gailu honetan", - "openVideoCamera": "Ireki kamera bideorako", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "removeFromBundle": "Kendu sorta honetatik", "serverRequiresEmail": "Zerbitzari honek zure posta elektronikoa egiaztatu behar du izena eman dezazun.", "or": "Edo", @@ -1591,16 +1455,6 @@ "messageType": "Mezu mota", "time": "Ordua", "dismiss": "Baztertu", - "switchToAccount": "Aldatu {number} kontura", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "previousAccount": "Aurreko kontua", "edit": "Editatu", "@edit": { "type": "String", @@ -1643,23 +1497,6 @@ "placeholder": {} }, "sendOnEnter": "Bidali enter sakatuz", - "badServerVersionsException": "Zerbitzariak ondorengo ezaugarriak onartzen ditu:\n{serverVersions}\nBaina aplikazioak hauek onartzen ditu bakarrik: {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "botMessages": "Boten mezuak", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cantOpenUri": "Ezin da {uri} URIa ireki", "@cantOpenUri": { "type": "String", @@ -1694,7 +1531,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Txata gune honetara gehitu da", "configureChat": "Txata konfiguratu", "@configureChat": { "type": "String", @@ -1705,21 +1541,11 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Kideen aldaketak", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Ezarri alias nagusi bezala", "@setAsCanonicalAlias": { "type": "String", "placeholders": {} }, - "setCustomEmotes": "Ezarri zure emoteak", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "appLock": "Aplikazioa blokeatzea", "@appLock": { "type": "String", @@ -1772,16 +1598,6 @@ "type": "String", "placeholders": {} }, - "containsUserName": "Erabiltzaile-izena dauka", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "Ezizena dauka", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "locationDisabledNotice": "Kokapen zerbitzuak ezgaituta daude. Gaitu zure kokapena partekatu ahal izateko.", "@locationDisabledNotice": { "type": "String", @@ -1842,15 +1658,6 @@ "type": "String", "placeholders": {} }, - "videoWithSize": "Bideoa ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "openGallery": "Ireki bilduma", "pinMessage": "Finkatu gelan", "reactedWith": "{sender}(e)k {reaction}(r)ekin erreakzionatu du", @@ -1866,7 +1673,6 @@ } }, "confirmEventUnpin": "Ziur zaude gertaera finaktzeari utzi nahi diozula?", - "nextAccount": "Hurrengo kontua", "markAsRead": "Markatu irakurritzat", "yourChatBackupHasBeenSetUp": "Txaten babeskopiak ezarri dira.", "clearArchive": "Ezabatu artxiboa", @@ -2045,11 +1851,6 @@ "type": "String", "placeholders": {} }, - "people": "Jendea", - "@people": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Aukeratu sartzeko kode bat", "@pleaseChooseAPasscode": { "type": "String", @@ -2084,16 +1885,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Bidali pegatina", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Ezarri baimen-maila", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "shareLocation": "Partekatu kokapena", "@shareLocation": { "type": "String", @@ -2119,16 +1910,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Ikusi / Ezkutatu gogokoak", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Markatu irakurrita / irakurri gabe", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Eskaera gehiegi. Saiatu berriro geroago!", "@tooManyRequestsWarning": { "type": "String", @@ -2173,17 +1954,9 @@ "messageInfo": "Mezuaren xehetasunak", "sender": "Igorlea", "removeFromSpace": "Kendu gunetik", - "addToSpaceDescription": "Hautatu gune bat txat hau bertara gehitzeko.", "start": "Hasi", - "publish": "Argitaratu", "reportUser": "Salatu erabiltzailea", "openChat": "Ireki txata", - "addWidget": "Gehitu widgeta", - "widgetVideo": "Bideoa", - "widgetEtherpad": "Testu-oharra", - "widgetJitsi": "Jitsi Meet", - "widgetCustom": "Norberak ezarritakoa", - "widgetName": "Izena", "youJoinedTheChat": "Txatera batu zara", "youAcceptedTheInvitation": "👍 Gonbidapena onartu duzu", "youBannedUser": "{user}(r)i debekua ezarri diozu", @@ -2243,15 +2016,6 @@ } }, "youRejectedTheInvitation": "Gonbidapena baztertu duzu", - "separateChatTypes": "Bereizi banakako mezuak eta taldeak", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "widgetUrlError": "Ez da baliozko URLa.", - "widgetNameError": "Zehaztu ezizen bat.", - "errorAddingWidget": "Errorea widgeta gehitzerakoan.", - "pleaseEnterRecoveryKey": "Sartu berreskuratze-gakoa:", "recoveryKey": "Berreskuratze-gakoa", "recoveryKeyLost": "Berreskuratze-gakoa galdu duzu?", "users": "Erabiltzaileak", @@ -2260,7 +2024,6 @@ "dehydrateWarning": "Ekintza hau ezin da desegin. Egiaztatu babeskopia toki seguruan gorde duzula.", "hydrate": "Lehengoratu babeskopia bat erabiliz", "pleaseEnterRecoveryKeyDescription": "Mezu zaharrak ikusi ahal izateko, sartu aurreko saioan sortu zen berreskuratze-gakoa. Berreskuratze-gakoa EZ da zure pasahitza.", - "indexedDbErrorLong": "Mezuen artxibatzea ez dago defektuz gaituta modu pribatua erabiltzean.\nGaitzeko:\n - about:config\n - dom.indexedDB.privateBrowsing.enabled aukerak true erakutsi dezala\nBestela ezin da FluffyChat erabili.", "storeSecurlyOnThisDevice": "Gorde gailu honetan modu seguruan", "countFiles": "{count} fitxategi", "@countFiles": { @@ -2275,37 +2038,14 @@ "storeInSecureStorageDescription": "Gorde berreskuratze-gakoa gailu honetako biltegiratze seguruan.", "storeInAppleKeyChain": "Gorde Apple KeyChain-en", "unlockOldMessages": "Desblokeatu mezu zaharrak", - "dehydrateTorLong": "TOR erabiltzaileentzat gomendioa leihoa itxi baino lehen saioa esportatzea da.", - "hydrateTorLong": "Esportatu al zenuen zure saioa TOR erabili zenuen azken aldian? Inportatu segidan eta jarraitu txateatzen.", - "dehydrateTor": "TOR Erabiltzaileak: Esportatu saioa", - "hydrateTor": "TOR Erabiltzaileak: Inportatu esportatutako saioa", "saveKeyManuallyDescription": "Gorde eskuz gako hau gailuko partekatze-menua edo arbela erabiliz.", - "indexedDbErrorTitle": "Arazoak modu pribatuarekin", "confirmMatrixId": "Baieztatu zure Matrix IDa kontua ezabatu ahal izateko.", "newSpace": "Gune berria", - "enterRoom": "Sartu gelara", "whyIsThisMessageEncrypted": "Zergatik ezin da mezu hau irakurri?", "allSpaces": "Gune guztiak", "newGroup": "Talde berria", - "enterSpace": "Sartu gunera", - "appearOnTopDetails": "Aplikazioa goikaldean agertzea baimentzen du (ez da beharrezkoa FluffyChat deitzeko kontutzat ezarri baduzu)", "screenSharingTitle": "pantaila-partekatzea", "screenSharingDetail": "Pantaila FluffyChaten partekatzen ari zara", - "callingPermissions": "Deitzeko baimenak", - "callingAccount": "Deitzen ari den kontua", - "callingAccountDetails": "Baimendu FluffyChat Android gailuko telefono-markagailua erabiltzea.", - "appearOnTop": "Gainean erakutsi", - "otherCallingPermissions": "Mikrofono, kamera eta FluffyChaten beste baimen batzuk", - "numChats": "{number} txat", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Ezkutatu garrantzirik gabeko gertaerak", "noKeyForThisMessage": "Mezua gailu honetan saioa hasi baino lehen bidali bazen gertatu daiteke.\n\nBeste aukera bat igorleak zure gailua blokeatu izana da, edo zerbaitek huts egin izana interneteko konexioan.\n\nMezua beste saio batean irakur dezakezu? Hala bada, mezua transferitu dezakezu! Zoaz Ezrpenetara > Gailuak eta baieztatu zure gailuek bata bestea egiaztatu dutela. Gela irekiko duzun hurrengo aldian eta bi saioak aurreko planoan irekita daudenean, gakoak automatikoki partekatuko dira.\n\nEz duzu gakorik galdu nahi saioa amaitu edo gailuak aldatzen dituzunean? Baieztatu ezarpenetan txaten babeskopiak gaituta dituzula.", "supposedMxid": "Hau {mxid} izan behar da", "@supposedMxid": { @@ -2333,7 +2073,6 @@ "doNotShowAgain": "Ez erakutsi berriro", "fileIsTooBigForServer": "Ezin da bidali! Zerbitzariak gehienez {max}-ko eranskinak onartzen ditu.", "noOtherDevicesFound": "Ez da beste gailurik aurkitu", - "startFirstChat": "Hasi zure lehen txata", "newSpaceDescription": "Guneek txatak taldekatzea ahalbidetzen dute eta komunitate pribatu edo publikoak osatzea.", "disableEncryptionWarning": "Segurtasun arrazoiak direla-eta, ezin duzu lehendik zifratuta zegoen txat bateko zifratzea ezgaitu.", "encryptThisChat": "Zifratu txata", @@ -2360,11 +2099,6 @@ } } }, - "allRooms": "Talde-txat guztiak", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "jumpToLastReadMessage": "Joan irakurritako azken mezura", "reportErrorDescription": "😭 O ez! Zerbaitek huts egin du. Nahi izanez gero, eman garatzaileei errorearen berri.", "cuddleContent": "{senderName}(e)k samurki besarkatu zaitu", @@ -2389,17 +2123,6 @@ "jump": "Joan", "openLinkInBrowser": "Ireki esteka nabigatzailean", "report": "salatu", - "signInWithPassword": "Hasi saioa pasahitzarekin", - "pleaseTryAgainLaterOrChooseDifferentServer": "Saiatu geroago edo aukeratu beste zerbitzari bat.", - "signInWith": "Hasi saioa {provider}(r)ekin", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "notAnImage": "Ez da irudi-fitxategia.", "importNow": "Inportatu orain", "importEmojis": "Inportatu emojiak", @@ -2424,7 +2147,6 @@ } }, "optionalRedactReason": "(Aukerakoa) Mezua atzera botatzearen arrazoia…", - "inviteContactToGroupQuestion": "{contact} \"{groupName}\" txatera gonbidatu nahi duzu?", "redactedByBecause": "{username}(e)k atzera bota du \"{reason}\" dela-eta", "@redactedByBecause": { "type": "String", @@ -2438,7 +2160,6 @@ } }, "redactMessageDescription": "Mezua elkarrizketa honetako partaide guztientzat botako da atzera. Ezin da desegin.", - "addChatDescription": "Gehitu txataren deskribapena…", "directChat": "Banakako txata", "wrongPinEntered": "PIN okerra! Saiatu berriro {seconds} segundu barru…", "@wrongPinEntered": { @@ -2451,19 +2172,16 @@ }, "noChatDescriptionYet": "Ez da txaterako deskribapenik sortu oraindik.", "chatDescriptionHasBeenChanged": "Txataren deskribapena aldatu da", - "profileNotFound": "Ezin izan da erabiltzailea zerbitzarian aurkitu. Agian arazo bat dago konexioarekin edo erabiltzailea ez da existitzen.", "shareInviteLink": "Partekatu gonbidapen-esteka", "emoteKeyboardNoRecents": "Oraintsu erabilitako emoteak hemen ageriko dira…", "@emoteKeyboardNoRecents": { "type": "String", "placeholders": {} }, - "setTheme": "Ezarri gaia:", "createGroup": "Sortu taldea", "invite": "Gonbidatu", "invalidInput": "Sartu duzunak ez du balio!", "inviteGroupChat": "📨 Taldeko txatera gonbidapena", - "invitePrivateChat": "📨 Txat pribatura gonbidapena", "banUserDescription": "Erabiltzailea txatetik kanporatu eta berriro sartzeko debekua ezarriko zaio; ezingo da berriro sartu debekua kendu arte.", "removeDevicesDescription": "Gailu honetako saioa amaituko da eta ezingo duzu mezurik jaso aurrerantzean.", "unbanUserDescription": "Erabiltzailea txatera berriro sartu ahal izango da berak nahi izanez gero.", @@ -2483,7 +2201,6 @@ "pleaseEnterANumber": "Sartu 0 baino zenbaki handiago bat", "kickUserDescription": "Erabiltzailea txatetik kanporatu da baina ez zaio debekua ezarri. Txat publikoen kasuan, edozein momentutan batu daiteke berriro.", "createGroupAndInviteUsers": "Sortu talde bat eta gonbidatu partaideak", - "startConversation": "Hasi elkarrizketa", "groupCanBeFoundViaSearch": "Bilaketa erabiliz aurkitu daiteke taldea", "noUsersFoundWithQuery": "Zoritxarrez ez da \"{query}\" duen erabiltzailerik aurkitu. Egiaztatu zuzen idatzi duzula.", "@noUsersFoundWithQuery": { @@ -2508,11 +2225,9 @@ "publicSpaces": "Gune publikoak", "passwordIsWrong": "Sartu duzun pasahitza okerra da", "pleaseEnterYourCurrentPassword": "Sartu oraingo pasahitza", - "publicLink": "Esteka publikoa", "nothingFound": "Ez da ezer aurkitu…", "newPassword": "Pasahitz berria", "passwordsDoNotMatch": "Pasahitzak ez datoz bat", - "subspace": "Azpi-gunea", "select": "Hautatu", "pleaseChooseAStrongPassword": "Aukeratu pasahitz sendo bat", "addChatOrSubSpace": "Gehitu txata edo azpi-gunea", @@ -2520,19 +2235,6 @@ "joinSpace": "Batu gunera", "searchForUsers": "Bilatu @erabiltzaileak…", "thisDevice": "Gailu hau:", - "decline": "Baztertu", - "databaseBuildErrorBody": "Ezin da SQlite datu-basea eraiki. Aplikazioa aurreko datu-basea erabiltzen saiatuko da oraingoz. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "initAppError": "Errorea aplikazioa abiaraztean", "sessionLostBody": "Zure saioa galdu da. Jakinarazi errorea garatzaileei {url} helbidean. Errorearen mezua ondorengoa da: {error}", "@sessionLostBody": { @@ -2558,14 +2260,6 @@ } } }, - "youInvitedToBy": "📩 Esteka baten bidez gonbidatu zaituzte:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "transparent": "Gardena", "sendReadReceipts": "Bidali irakurri izanaren agiria", "formattedMessages": "Formatua duten mezuak", @@ -2598,15 +2292,6 @@ } }, "sendReadReceiptsDescription": "Txateko beste partaideek mezu bat irakurri duzula ikus dezakete.", - "forwardMessageTo": "Birbidali mezua {roomName}(e)ra?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "completedKeyVerification": "{sender}(e)k gakoen egiaztapena osatu du", "@completedKeyVerification": { "type": "String", @@ -2644,11 +2329,6 @@ "type": "String", "placeholders": {} }, - "presenceStyle": "Presentzia:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "incomingMessages": "Jasotako mezuak", "hidePresences": "Ezkutatu Egoeren Zerrenda?", "discover": "Arakatu", @@ -2669,14 +2349,6 @@ }, "noDatabaseEncryption": "Plataforma honetan ezin da datu-basea zifratu", "usersMustKnock": "Erabiltzaileek baimena eskatu behar dute", - "userWouldLikeToChangeTheChat": "{user}(e)k txatera batu nahiko luke.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "knock": "Eskatu baimena", "knocking": "Baimena eskatzen", "chatCanBeDiscoveredViaSearchOnServer": "Txata {server}(e)n bilaketa eginez aurkitu daiteke", @@ -2702,24 +2374,10 @@ "hideRedactedMessagesBody": "Norbaitek mezuren bat atzera botaz gero, mezua txatetik kenduko da, abisurik gabe.", "hideInvalidOrUnknownMessageFormats": "Ezkutatu mezuen formatu ezezagun edo baliogabea", "overview": "Ikuspegi orokorra", - "notifyMeFor": "Jakinarazi…", "passwordRecoverySettings": "Pasahitza berreskuratzeko ezarpenak", - "hideMemberChangesInPublicChats": "Ezkutatu kideen egoera aldaketak txat publikoetan", "globalChatId": "Txat ID orokorra", "calls": "Deiak", - "hideMemberChangesInPublicChatsBody": "Ez erakutsi txataren denbora-lerroan norbait txat publikora batu edo txatetik irteten dela, irakurgaitasuna hobetzeko.", "noOneCanJoin": "Ezin da inor batu", - "noPublicLinkHasBeenCreatedYet": "Oraindik ez da esteka publikorik sortu", - "userRole": "Erabiltzailearen rola", - "minimumPowerLevel": "{level} da gutxieneko botere-maila.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "publicChatAddresses": "Txataren helbide publikoak", "createNewAddress": "Sortu helbide berria", "files": "Fitxategiak", @@ -2744,25 +2402,12 @@ "noMoreChatsFound": "Ez da beste txatik aurkitu...", "unread": "Irakurtzeke", "space": "Gunea", - "joinedChats": "Batu zaren txatak", "goToSpace": "Joan {space} gunera", "@goToSpace": { "type": "String", "space": {} }, "markAsUnread": "Markatu irakurri gabetzat", - "countChatsAndCountParticipants": "{chats} txat eta {participants} partaide", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "spaces": "Guneak", "adminLevel": "{level} - Administratzailea", "@adminLevel": { @@ -2819,10 +2464,7 @@ "chatPermissionsDescription": "Definitu zer botere-maila behar den txat honetako ekintza jakinetarako. 0, 50 eta 100 botere-mailek erabiltzaileak, moderatzaileak eta administratzaileak ordezkatzen dituzte, baina edozein graduazio posible da.", "sendCanceled": "Bidalketa bertan behera utzi da", "noChatsFoundHere": "Ez da txatik aurkitu. Hasi norbaitekin txateatzen beheko botoia erabiliz. ⤵️", - "homeserverDescription": "Zerbitzariak datuak gordetzen ditu, ePosta hornitzaileek mezuak gordetzen dituzten bezala. Nahi duzun zerbitzaria aukeratu dezakezu eta, hala ere, besteetako edonorekin hitz egin. Ikasi gehiago https://matrix.org webgunean.", "loginWithMatrixId": "Hasi saioa Matrix IDarekin", - "discoverHomeservers": "Arakatu zerbitzariak", - "whatIsAHomeserver": "Zer da zerbitzari bat?", "doesNotSeemToBeAValidHomeserver": "Ez dirudi zerbitzaria bateragarria denik. Zuzena da URLa?", "calculatingFileSize": "Fitxategiaren tamaina kalkulatzen…", "prepareSendingAttachment": "Eranskinaren bidalketa prestatzen…", @@ -2917,7 +2559,6 @@ "roomNotificationSettings": "Gelen jakinarazpenen ezarpenak", "otherNotificationSettings": "Beste jakinarazpenen ezarpenak", "waitingForServer": "Zerbitzariaren zain…", - "appIntroduction": "FluffyChatek mezularitza-programa desberdinak erabiltzen dituzten lagunekin txateatzea ahalbidetzen dizu. Ikasi gehiago https://matrix.org estekan edo sakatu *Jarraitu*.", "synchronizingPleaseWaitCounter": " Sinkronizatzen… (%{percentage})", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -2984,11 +2625,8 @@ "notSupportedOnThisDevice": "Ez da gailu honekin bateragarria", "commandHint_roomupgrade": "Bertsio-berritu gela adierazitako gela-bertsiora", "enterNewChat": "Sartu txat berrira", - "normalUser": "Erabiltzaile arrunta", "notificationRuleRoomServerAclDescription": "Gela-zerbitzarirako sarbide-kontroleko zerrenden (ACL) jakinarazpenak ezkutatzen ditu.", "ignoreUser": "Egin muzin erabiltzaileari", - "setCustomPermissionLevel": "Ezarri baimen-maila propioak", - "setPermissionsLevelDescription": "Aukeratu defektuzko rola edo sartu baimen-maila pertsonalizatu bat 0 eta 100 artean.", "approve": "Onetsi", "youHaveKnocked": "Sartzeko baimena eskatu duzu", "pleaseWaitUntilInvited": "Orain itxaron gelako norbaitek gonbidatzen zaituen arte.", @@ -3024,9 +2662,6 @@ "longPressToRecordVoiceMessage": "Sakatuta mantendu ahots-mezua grabatzeko.", "pause": "Gelditu", "resume": "Jarraitu", - "moveToDifferentSpace": "Beste gune batera mugitu", - "moveUp": "Eraman gora", - "moveDown": "Eraman behera", "removeFromSpaceDescription": "Txata gunetik kenduko da, baina txaten zerrendan mantenduko da.", "countChats": "{chats} txat", "@countChats": { @@ -3038,7 +2673,6 @@ } }, "donate": "Egin dohaintza", - "newSubSpace": "Azpi-gune berria", "spaceMemberOf": "{spaces} guneko kidea", "@spaceMemberOf": { "type": "String", @@ -3070,7 +2704,6 @@ "startPoll": "Hasi bozketa", "endPoll": "Amaitu bozketa", "answersVisible": "Erakutsi emaitzak", - "answersHidden": "Ezkutatu emaitzak", "pollQuestion": "Bozketako galdera", "answerOption": "Erantzun-aukera", "addAnswerOption": "Gehitu erantzun-aukera", @@ -3135,7 +2768,6 @@ "logs": "Erregistroak", "advancedConfigs": "Konfigurazio aurreratua", "advancedConfigurations": "Konfigurazio aurreratua", - "signInWithLabel": "Hasi saioa honakoarekin:", "federationBaseUrl": "Federatzeko URL oinarria", "baseUrl": "URL oinarria", "identityServer": "Identitate-zerbitzaria:", @@ -3148,4 +2780,4 @@ "join": "Batu", "searchOrEnterHomeserverAddress": "Bilatu edo sartu zerbitzariaren helbidea", "matrixId": "Matrix IDa" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_fa.arb b/lib/l10n/intl_fa.arb index 6c2937e0..11ab1f12 100644 --- a/lib/l10n/intl_fa.arb +++ b/lib/l10n/intl_fa.arb @@ -98,11 +98,6 @@ } } }, - "botMessages": "پیام‌های ربات", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "changedTheDisplaynameTo": "{username} نام نمایشی را به '{displayname}' تغییر داد", "@changedTheDisplaynameTo": { "type": "String", @@ -237,18 +232,6 @@ } } }, - "badServerVersionsException": "سرور از این نسخه‌های مشخصات پشتیبانی می‌کند:\n{serverVersions}\nاما برنامه تنها از این‌ها پشتیبانی می‌کند:\n{supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "changedTheChatAvatar": "{username} نماد گپ را تغییر داد", "@changedTheChatAvatar": { "type": "String", @@ -296,11 +279,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "فرستادن نسخه اصلی", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "changedTheRoomAliases": "{username} نام‌های مستعار اتاق را تغییر داد", "@changedTheRoomAliases": { "type": "String", @@ -416,11 +394,6 @@ "type": "String", "description": "Usage hint for the command /dm" }, - "sendSticker": "فرستادن برچسب", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "فرستادن ویدئو", "@sendVideo": { "type": "String", @@ -517,7 +490,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "گپ به این فضا افزوده شد", "chat": "گپ", "@chat": { "type": "String", @@ -538,11 +510,6 @@ "type": "String", "placeholders": {} }, - "separateChatTypes": "جداسازی گپ‌های مستقیم از گروه‌ها", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "sentAPicture": "🖼️ {username} یک تصویر فرستاد", "@sentAPicture": { "type": "String", @@ -633,16 +600,6 @@ } } }, - "connect": "اتصال", - "@connect": { - "type": "String", - "placeholders": {} - }, - "confirm": "پذیرفتن", - "@confirm": { - "type": "String", - "placeholders": {} - }, "allSpaces": "همه فضاها", "commandHint_ban": "محروم کردن کاربر مشخص‌شده از این اتاق", "@commandHint_ban": { @@ -664,16 +621,6 @@ "type": "String", "description": "Usage hint for the command /unban" }, - "containsDisplayName": "دارای نام نمایشی", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "دارای نام کاربری", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "device": "دستگاه", "@device": { "type": "String", @@ -768,21 +715,6 @@ "type": "String", "placeholders": {} }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deviceId": "شناسه دستگاه", "@deviceId": { "type": "String", @@ -828,11 +760,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "باید یک کد کوتاه شکلک و یک تصویر انتخاب کنید!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emoteInvalid": "کد کوتاه شکلک نامعتبر است!", "@emoteInvalid": { "type": "String", @@ -926,18 +853,6 @@ "type": "String", "placeholders": {} }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "currentlyActive": "اکنون فعال", "@currentlyActive": { "type": "String", @@ -1007,11 +922,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "رفتن به اتاق جدید", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "گروه", "@group": { "type": "String", @@ -1081,11 +991,6 @@ } }, "homeserver": "سرور خانگی", - "enterYourHomeserver": "سرور خانگی خود را وارد کنید", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "خطا در به‌دست آوردن مکان: {error}", "@errorObtainingLocation": { "type": "String", @@ -1164,11 +1069,6 @@ } } }, - "identity": "هویت", - "@identity": { - "type": "String", - "placeholders": {} - }, "hugContent": "{senderName} شما را بغل می‌کند", "@hugContent": { "type": "String", @@ -1221,11 +1121,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "آگاه‌سازها برای این حساب فعال شدند", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "or": "یا", "@or": { "type": "String", @@ -1311,7 +1206,6 @@ "type": "String", "placeholders": {} }, - "pleaseEnterRecoveryKey": "لطفاً کلید بازیابی خود را وارد کنید:", "link": "پیوند", "iHaveClickedOnLink": "روی پیوند کلیک کردم", "@iHaveClickedOnLink": { @@ -1342,11 +1236,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "دعوت برای من", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "isTyping": "در حال نوشتن…", "@isTyping": { "type": "String", @@ -1380,7 +1269,6 @@ "placeholders": {} }, "dehydrate": "صدور نشست و پاک کردن دستگاه", - "hydrateTorLong": "آیا آخرین بار نشست خود را با تور صادر کردید؟ آن را وارد کنید و گپ را ادامه دهید.", "loadingPleaseWait": "در حال بارگذاری… لطفاً صبر کنید.", "@loadingPleaseWait": { "type": "String", @@ -1405,11 +1293,6 @@ } } }, - "memberChanges": "تغییرات اعضا", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "moderator": "ناظر", "@moderator": { "type": "String", @@ -1451,21 +1334,11 @@ "placeholders": {} }, "addAccount": "افزودن حساب", - "people": "افراد", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "انتخاب تصویر", "@pickImage": { "type": "String", "placeholders": {} }, - "pleaseChoose": "لطفاً انتخاب کنید", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "لطفاً یک رمز کوتاه انتخاب کنید", "@pleaseChooseAPasscode": { "type": "String", @@ -1481,11 +1354,6 @@ "type": "String", "placeholders": {} }, - "license": "گواهینامه", - "@license": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} کاربر در حال نوشتن…", "@numUsersTyping": { "type": "String", @@ -1539,7 +1407,6 @@ "type": "String", "placeholders": {} }, - "dehydrateTorLong": "برای کاربران تور، پیشنهاد می‌شود پیش از بستن پنجره، نشست را صادر کنند.", "needPantalaimonWarning": "لطفاً توجه کنید که برای رمزنگاری سرتاسر به Pantalaimon نیاز دارید.", "@needPantalaimonWarning": { "type": "String", @@ -1576,7 +1443,6 @@ "type": "String", "placeholders": {} }, - "hydrateTor": "کاربران تور: وارد کردن نشست صادر شده", "hydrate": "بازیابی از پرونده پشتیبان", "inviteContact": "دعوت از مخاطب", "@inviteContact": { @@ -1595,11 +1461,6 @@ } } }, - "openVideoCamera": "باز کردن دوربین برای فیلم‌برداری", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "oneClientLoggedOut": "یکی از برنامه‌های شما از سیستم خارج شد", "removeFromBundle": "برداشتن از بسته", "bundleName": "نام بسته", @@ -1651,7 +1512,6 @@ "type": "String", "placeholders": {} }, - "dehydrateTor": "کاربران تور: صدور نشست", "login": "ورود", "@login": { "type": "String", @@ -1691,11 +1551,6 @@ } } }, - "rejoin": "پیوستن دوباره", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "لغو محرومیت از گپ", "@unbanFromChat": { "type": "String", @@ -1726,15 +1581,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "دیده‌شده توسط {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "setAsCanonicalAlias": "تنظیم به‌عنوان نام مستعار اصلی", "@setAsCanonicalAlias": { "type": "String", @@ -1778,11 +1624,6 @@ } } }, - "removeDevice": "پاک کردن دستگاه", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "reportMessage": "گزارش پیام", "@reportMessage": { "type": "String", @@ -1794,11 +1635,6 @@ "placeholders": {} }, "recoveryKey": "کلید بازیابی", - "setInvitationLink": "تنظیم پیوند دعوت", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "pushRules": "قوانین آگاه‌ساز", "@pushRules": { "type": "String", @@ -1809,11 +1645,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "تنظیم شکلک‌های سفارشی", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "redactMessage": "ویرایش پیام", "@redactMessage": { "type": "String", @@ -1834,7 +1665,6 @@ } } }, - "enterSpace": "ورود به فضا", "wasDirectChatDisplayName": "گپ خالی (پیش‌تر {oldDisplayName} بود)", "@wasDirectChatDisplayName": { "type": "String", @@ -1850,7 +1680,6 @@ "deviceKeys": "کلیدهای دستگاه:", "fileIsTooBigForServer": "نمیتوان فرستاد! سرور تنها از پیوست های تا {max} پشتیبانی میکند.", "jumpToLastReadMessage": "پرش به آخرین پیام خوانده‌شده", - "hideUnimportantStateEvents": "پنهان کردن رویدادهای غیرمهم وضعیت", "doNotShowAgain": "دوباره نمایش نده", "readUpToHere": "خوانده‌شده تا اینجا", "noBackupWarning": "هشدار! بدون فعال کردن پشتیبان گپ، دسترسی به پیام‌های رمزنگاری‌شده خود را از دست خواهید داد. پیشنهاد می‌شود پیش از خروج، پشتیبان گپ را فعال کنید.", @@ -1863,22 +1692,10 @@ } } }, - "callingAccountDetails": "اجازه به فلافی‌چت برای استفاده از شماره‌گیر بومی اندروید.", "noKeyForThisMessage": "اگر پیام پیش از ورود به حساب در این دستگاه فرستاده شده باشد، این مشکل ممکن است رخ دهد.\n\nهمچنین ممکن است فرستنده دستگاه شما را مسدود کرده باشد یا مشکلی در اتصال اینترنت وجود داشته باشد.\n\nآیا می‌توانید پیام را در نشست دیگری بخوانید؟ در این صورت، می‌توانید آن را منتقل کنید! به تنظیمات > دستگاه‌ها بروید و مطمئن شوید دستگاه‌هایتان یکدیگر را بازبینی کرده‌اند. هنگام باز کردن دوباره اتاق و فعال بودن هر دو نشست، کلیدها به‌صورت خودکار منتقل می‌شوند.\n\nآیا نمی‌خواهید هنگام خروج یا تغییر دستگاه کلیدها را گم کنید؟ مطمئن شوید پشتیبان گپ را در تنظیمات فعال کرده‌اید.", - "numChats": "{number} گپ", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "disableEncryptionWarning": "به دلایل امنیتی نمی‌توانید رمزنگاری را در گپی که فعال شده غیرفعال کنید.", - "enterRoom": "ورود به اتاق", "newGroup": "گروه جدید", "foregroundServiceRunning": "این آگاه‌ساز زمانی ظاهر می‌شود که خدمت پیش‌زمینه فعال است.", - "appearOnTopDetails": "اجازه به برنامه برای نمایش در بالا (اگر فلافی‌چت را به‌عنوان حساب تماس تنظیم کرده‌اید، لازم نیست)", "storeSecurlyOnThisDevice": "ذخیره امن در این دستگاه", "screenSharingDetail": "شما در حال هم‌رسانی صفحه‌نمایش خود در فلافی‌چت هستید", "newSpace": "فضای جدید", @@ -1888,10 +1705,6 @@ "user": "کاربر", "custom": "سفارشی", "screenSharingTitle": "هم‌رسانی صفحه‌نمایش", - "callingPermissions": "دسترسی‌های تماس", - "callingAccount": "حساب تماس", - "appearOnTop": "نمایش در بالا", - "otherCallingPermissions": "میکروفون، دوربین و دیگر دسترسی‌های فلافی‌چت", "whyIsThisMessageEncrypted": "چرا این پیام خوانا نیست؟", "reopenChat": "باز کردن دوباره گپ", "unmuteChat": "فعال کردن صدای گپ", @@ -1899,7 +1712,6 @@ "type": "String", "placeholders": {} }, - "nextAccount": "حساب بعدی", "unlockOldMessages": "گشودن پیام‌های قدیمی", "share": "هم‌رسانی", "@share": { @@ -1921,21 +1733,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "تغییر وضعیت برگزیده", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "تغییر وضعیت بی‌صدا", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "تغییر وضعیت خوانده‌شده/خوانده‌نشده", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "unavailable": "در دسترس نیست", "@unavailable": { "type": "String", @@ -1961,11 +1758,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "کاغذدیواری:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "whoCanPerformWhichAction": "چه کسی می‌تواند چه کاری انجام دهد", "@whoCanPerformWhichAction": { "type": "String", @@ -1976,17 +1768,11 @@ "type": "String", "placeholders": {} }, - "widgetVideo": "ویدئو", "youHaveBeenBannedFromThisChat": "شما از این گپ محروم شده‌اید", "@youHaveBeenBannedFromThisChat": { "type": "String", "placeholders": {} }, - "setPermissionsLevel": "تنظیم سطح دسترسی", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "تنظیم وضعیت", "@setStatus": { "type": "String", @@ -2002,17 +1788,11 @@ "type": "String", "placeholders": {} }, - "singlesignon": "ورود یکپارچه", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "spaceName": "نام فضا", "@spaceName": { "type": "String", "placeholders": {} }, - "startFirstChat": "شروع اولین گپ", "theyMatch": "هم‌خوانی دارند", "@theyMatch": { "type": "String", @@ -2101,17 +1881,7 @@ "messageInfo": "اطلاعات پیام", "time": "زمان", "messageType": "نوع پیام", - "addToSpaceDescription": "فضایی را برای افزودن این گپ انتخاب کنید.", "start": "آغاز", - "videoWithSize": "ویدئو ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "userIsTyping": "{username} در حال نوشتن…", "@userIsTyping": { "type": "String", @@ -2136,7 +1906,6 @@ "type": "String", "placeholders": {} }, - "publish": "انتشار", "shareLocation": "هم‌رسانی مکان", "@shareLocation": { "type": "String", @@ -2182,7 +1951,6 @@ "type": "String", "placeholders": {} }, - "widgetJitsi": "جیتسی‌میت(Jitsi Meet)", "sourceCode": "کد منبع", "@sourceCode": { "type": "String", @@ -2262,8 +2030,6 @@ "removeFromSpace": "حذف از فضا", "pleaseEnterRecoveryKeyDescription": "برای گشودن قفل پیام‌های قدیمیتان، لطفا کلید بازیابی‌ای که در یک نشست پیشین تولید شده را وارد کنید. کلید بازیابی شما، رمز عبور شما نیست.", "confirmEventUnpin": "آیا از برداشتن سنجاق رویداد به صورت دائمی مطمئن هستید؟", - "indexedDbErrorLong": "متاسفانه فضای ذخیره‌سازی پیام‌ها، به صورت پیش‌فرض در حالت خصوصی فعال نیست.\nلطفا آدرس زیر را باز کنید:\nabout:config\nمقدار «dom.indexedDB.privateBrowsing.enabled» را به «true» تغییر دهید\nدر غیر این صورت، امکان اجرای فلافی‌چت وجود ندارد.", - "widgetEtherpad": "یادداشت متنی", "youKickedAndBanned": "🙅 شما {user} را بیرون و محروم کردید", "@youKickedAndBanned": { "placeholders": { @@ -2284,7 +2050,6 @@ }, "youRejectedTheInvitation": "شما دعوت را رد کردید", "youAcceptedTheInvitation": "👍 شما دعوت را پذیرفتید", - "emailOrUsername": "رایانامه(ایمیل) یا نام کاربری", "transferFromAnotherDevice": "انتقال از دستگاهی دیگر", "@transferFromAnotherDevice": { "type": "String", @@ -2303,15 +2068,6 @@ } } }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} گپ خوانده نشده}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "status": "وضعیت", "@status": { "type": "String", @@ -2327,23 +2083,6 @@ "pinMessage": "سنجاق کردن به اتاق", "emojis": "شکلک‌ها", "voiceCall": "تماس صوتی", - "indexedDbErrorTitle": "اشکالات حالت خصوصی", - "switchToAccount": "تغییر به حساب {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "previousAccount": "حساب قبلی", - "addWidget": "افزودن ویجت", - "widgetCustom": "سفارشی", - "widgetName": "نام", - "widgetUrlError": "این آدرس وب معتبر نیست.", - "widgetNameError": "لطفا یک نام نمایشی مشخص کنید.", - "errorAddingWidget": "بروز خطا هنگام افزودن ویجت.", "youJoinedTheChat": "شما به گپ پیوستید", "youBannedUser": "شما {user} را محروم کردید", "@youBannedUser": { @@ -2380,25 +2119,15 @@ "users": "کاربرها", "storeInSecureStorageDescription": "کلید بازیابی را در محل ذخیره‌سازی امن این دستگاه ذخیره کنید.", "jump": "پرش", - "allRooms": "تمام چت‌های گروهی", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "report": "گزارش", "openLinkInBrowser": "بازکردن پیوند در مرورگر", "reportErrorDescription": "اوه نه. اشتباهی رخ داد. اگر تمایل دارید، می‌توانید این اشکال را با توسعه‌دهندگان گزارش دهید.", - "signInWithPassword": "ورود با رمزعبور", - "pleaseTryAgainLaterOrChooseDifferentServer": "لطفا بعدا تلاش کنید یا سرور دیگری انتخاب کنید.", "notAnImage": "یک فایل تصویری نیست.", "alwaysUse24HourFormat": "false", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, - "setCustomPermissionLevel": "تنظیم سطح دسترسی سفارشی", - "setPermissionsLevelDescription": "لطفاً نقش از پیش تعریف‌شده‌ای را انتخاب کنید یا سطح دسترسی سفارشی بین ۰ تا ۱۰۰ وارد کنید.", "ignoreUser": "چشم‌پوشی از کاربر", - "normalUser": "کاربر عادی", "importNow": "اکنون وارد کنید", "importEmojis": "وارد کردن شکلک‌ها", "importFromZipFile": "وارد کردن از پرونده زیپ", @@ -2413,26 +2142,12 @@ } } }, - "addChatDescription": "افزودن توضیح گپ...", "commandHint_roomupgrade": "ارتقای این اتاق به نگارش مشخص‌شده", "appLockDescription": "قفل کردن برنامه با رمز کوتاه هنگام عدم استفاده", "sendTypingNotifications": "فرستادن آگاه‌سازهای نوشتن", "swipeRightToLeftToReply": "کشیدن از راست به چپ برای پاسخ", - "countChatsAndCountParticipants": "{chats} گپ و {participants} شرکت‌کننده", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "گپ دیگری پیدا نشد...", "noChatsFoundHere": "اینجا هنوز گپی پیدا نشد. با استفاده از دکمه زیر گپ جدیدی با کسی شروع کنید. ⤵️", - "joinedChats": "گپ‌های پیوسته", "unread": "خوانده‌نشده", "space": "فضا", "spaces": "فضاها", @@ -2468,7 +2183,6 @@ "blockedUsers": "کاربران مسدود‌شده", "blockListDescription": "میتوانید کاربرانی که مزاحم شما هستند را مسدود کنید. از کاربران موجود در فهرست مسدود شخصی، پیام یا دعوت به اتاق دریافت نخواهید کرد.", "blockUsername": "چشم‌پوشی از نام کاربری", - "inviteContactToGroupQuestion": "آیا میخواهید {contact} را به گپ «{groupName}» دعوت کنید؟", "noChatDescriptionYet": "هنوز توضیح گپی ساخته نشده است.", "tryAgain": "تلاش دوباره", "invalidServerName": "نام سرور نامعتبر", @@ -2476,10 +2190,7 @@ "optionalRedactReason": "(اختیاری) دلیل ویرایش این پیام...", "messagesStyle": "پیام‌ها:", "shareInviteLink": "هم‌رسانی پیوند دعوت", - "hideMemberChangesInPublicChats": "پنهان کردن تغییرات اعضا در گپ‌های عمومی", - "hideMemberChangesInPublicChatsBody": "برای بهبود خوانایی، اینکه کسی به گپ عمومی پیوست یا آن را ترک کرد در خط زمانی گپ نمایش داده نشود.", "overview": "دید کلی", - "notifyMeFor": "برایم آگاه‌ساز بفرست برای", "passwordRecoverySettings": "تنظیمات بازیابی گذرواژه", "redactedBy": "ویرایش‌شده به‌دست {username}", "@redactedBy": { @@ -2513,11 +2224,6 @@ } }, "setChatDescription": "تنظیم توضیح گپ", - "presenceStyle": "حضور:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "نمایش پیام‌های وضعیت از دیگر کاربران", "@presencesToggle": { "type": "String", @@ -2532,14 +2238,6 @@ } } }, - "youInvitedToBy": "📩 شما با پیوند دعوت شده‌اید به:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "invitedBy": "📩 دعوت‌شده توسط {user}", "@invitedBy": { "placeholders": { @@ -2558,32 +2256,11 @@ }, "usersMustKnock": "کاربران باید در بزنند", "noOneCanJoin": "هیچ‌کس نمیتواند بپیوندد", - "userWouldLikeToChangeTheChat": "{user} مایل به پیوستن به گپ است.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "هنوز پیوند عمومی ساخته نشده است", "knock": "در زدن", "hidePresences": "پنهان کردن فهرست وضعیت؟", - "signInWith": "ورود با {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "profileNotFound": "کاربر در سرور پیدا نشد. شاید مشکل اتصال وجود دارد یا کاربر وجود ندارد.", - "setTheme": "تنظیم پوسته:", "setColorTheme": "تنظیم پوسته رنگی:", "invite": "دعوت", "inviteGroupChat": "📨 دعوت به گپ گروهی", - "invitePrivateChat": "📨 دعوت به گپ خصوصی", "invalidInput": "ورودی نامعتبر!", "wrongPinEntered": "رمز کوتاه نادرست وارد شد! {seconds} ثانیه دیگر دوباره تلاش کنید...", "@wrongPinEntered": { @@ -2630,7 +2307,6 @@ "createGroupAndInviteUsers": "ساختن گروه و دعوت کاربران", "groupCanBeFoundViaSearch": "گروه با جستجو قابل یافتن است", "wrongRecoveryKey": "متأسفیم... به نظر میرسد این کلید بازیابی درست نباشد.", - "startConversation": "آغاز گفتگو", "commandHint_sendraw": "فرستادن JSON خام", "databaseMigrationTitle": "پایگاه داده بهینه‌سازی شد", "databaseMigrationBody": "لطفاً صبر کنید. این ممکن است لحظه‌ای طول بکشد.", @@ -2642,25 +2318,12 @@ "pleaseChooseAStrongPassword": "لطفاً یک گذرواژه قوی انتخاب کنید", "passwordsDoNotMatch": "گذرواژه‌ها هم‌خوانی ندارند", "passwordIsWrong": "گذرواژه واردشده نادرست است", - "publicLink": "پیوند عمومی", "publicChatAddresses": "نشانی‌های گپ عمومی", "createNewAddress": "ساختن نشانی جدید", "joinSpace": "پیوستن به فضا", "publicSpaces": "فضاهای عمومی", "addChatOrSubSpace": "افزودن گپ یا زیرفضا", - "subspace": "زیرفضا", - "decline": "نپذیرفتن", "thisDevice": "این دستگاه:", - "userRole": "نقش کاربر", - "minimumPowerLevel": "{level} کمینه سطح دسترسی است.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchIn": "جستجو در گپ «{chat}»...", "@searchIn": { "type": "String", @@ -2673,18 +2336,6 @@ "searchMore": "جستجوی بیشتر...", "gallery": "نگارخانه", "files": "پرونده‌ها", - "databaseBuildErrorBody": "ناتوانی در ساخت پایگاه داده SQLite. برنامه اکنون سعی میکند از پایگاه داده قدیمی استفاده کند. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "نشست شما گم شده است. لطفاً این خطا را به توسعه‌دهندگان در {url} گزارش دهید. پیام خطا: {error}", "@sessionLostBody": { "type": "String", @@ -2709,15 +2360,6 @@ } } }, - "forwardMessageTo": "هدایت پیام به {roomName}؟", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "فرستادن رسیدهای خواندن", "sendTypingNotificationsDescription": "دیگر شرکت‌کنندگان در گپ میتوانند ببینند که شما در حال تایپ پیام جدید هستید.", "sendReadReceiptsDescription": "دیگر شرکت‌کنندگان در گپ میتوانند ببینند که شما پیام را خوانده‌اید.", @@ -2860,9 +2502,6 @@ "changelog": "فهرست تغییرات", "sendCanceled": "فرستادن رد شد", "loginWithMatrixId": "ورود با شناسه ماتریکس", - "discoverHomeservers": "کشف سرورهای خانگی", - "whatIsAHomeserver": "سرور خانگی چیست؟", - "homeserverDescription": "همه داده‌های شما روی سرور خانگی نگه‌داری میشوند، مانند یک فراهم‌کننده رایانامه. میتوانید سرور خانگی مورد نظر خود را انتخاب کنید، در حالی که همچنان میتوانید با هر کسی گفتگو کنید. اطلاعات بیشتر در https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "به نظر نمیرسد سرور خانگی سازگاری داشته باشد. نشانی اشتباه است؟", "calculatingFileSize": "در حال محاسبه اندازه پرونده...", "prepareSendingAttachment": "آماده‌سازی برای فرستادن پیوست...", @@ -2928,7 +2567,6 @@ "appWantsToUseForLoginDescription": "شما بدین‌وسیله به برنامه و وبگاه اجازه میدهید اطلاعات شما را هم‌رسانی کنند.", "open": "باز کردن", "waitingForServer": "در انتظار سرور...", - "appIntroduction": "فلافی‌چت به شما امکان گپ با دوستانتان در پیام‌رسان‌های مختلف را میدهد. اطلاعات بیشتر در https://matrix.org یا فقط روی *ادامه* بزنید.", "newChatRequest": "📩 درخواست گپ جدید", "contentNotificationSettings": "تنظیمات آگاه‌ساز محتوا", "generalNotificationSettings": "تنظیمات آگاه‌ساز عمومی", @@ -3023,4 +2661,4 @@ "declineInvitation": "رد کردن دعوت", "noMessagesYet": "پیامی وجود ندارد", "longPressToRecordVoiceMessage": "برای ضبط پیام صوتی، انگشت خود را نگه دارید." -} +} \ No newline at end of file diff --git a/lib/l10n/intl_fi.arb b/lib/l10n/intl_fi.arb index 9f33e4c5..be92c553 100644 --- a/lib/l10n/intl_fi.arb +++ b/lib/l10n/intl_fi.arb @@ -121,18 +121,6 @@ }, "sendOnEnter": "Lähetä painamalla rivinvaihtonäppäintä", "@sendOnEnter": {}, - "badServerVersionsException": "Kotipalvelin tukee Matrix Spec versio(it)a:\n{serverVersions}, mutta tämä sovellus tukee vain versio(it)a {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "badServerLoginTypesException": "Tämä kotipalvelin tukee sisäänkirjautumistapoja: \n{serverVersions},\nmutta tämä sovellus tukee vain -tapoja: \n{supportedVersions}", "@badServerLoginTypesException": { "type": "String", @@ -177,11 +165,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Bottien lähettämät viestit", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Peruuta", "@cancel": { "type": "String", @@ -372,8 +355,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Keskustelu on lisätty tähän tilaan", - "@chatHasBeenAddedToThisSpace": {}, "chats": "Keskustelut", "@chats": { "type": "String", @@ -458,18 +439,6 @@ "type": "String", "placeholders": {} }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "dateAndTimeOfDay": "{date}, {timeOfDay}", "@dateAndTimeOfDay": { "type": "String", @@ -482,21 +451,6 @@ } } }, - "dateWithYear": "{day}.{month}.{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Tämä poistaa tunnuksesi käytöstä. Tätä ei voi kumota! Oletko varma?", "@deactivateAccountWarning": { "type": "String", @@ -602,11 +556,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Emote-lyhytkoodi ja kuva on valittava!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Tyhjä keskustelu", "@emptyChat": { "type": "String", @@ -638,11 +587,6 @@ }, "homeserver": "Kotipalvelin", "@homeserver": {}, - "enterYourHomeserver": "Syötä kotipalvelimesi", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Virhe paikannuksessa: {error}", "@errorObtainingLocation": { "type": "String", @@ -677,11 +621,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Mene uuteen huoneeseen", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Ryhmä", "@group": { "type": "String", @@ -753,11 +692,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identiteetti", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Jätä huomioitta", "@ignore": { "type": "String", @@ -795,11 +729,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Kutsu minua varten", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} kutsui sinut FluffyChattiin.\n1. Viereaile sivulla: https://fluffychat.im ja asenna sovellus\n2. Rekisteröidy tai kirjaudu sisään\n3. Avaa kutsulinkki:\n{link}", "@inviteText": { "type": "String", @@ -860,11 +789,6 @@ "type": "String", "placeholders": {} }, - "license": "Lisenssi", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Vaalea", "@lightTheme": { "type": "String", @@ -1083,16 +1007,6 @@ "type": "String", "placeholders": {} }, - "confirm": "Vahvista", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Sisältää käyttäjätunnuksen", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "countParticipants": "{count} osallistujaa", "@countParticipants": { "type": "String", @@ -1156,21 +1070,11 @@ "type": "String", "placeholders": {} }, - "connect": "Yhdistä", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Yhteystieto on kutsuttu ryhmään", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Sisältää näyttönimen", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Sisältö on ilmoitettu palvelimen ylläpitäjille", "@contentHasBeenReported": { "type": "String", @@ -1263,21 +1167,11 @@ } } }, - "notificationsEnabledForThisAccount": "Tämän tunnuksen ilmoitukset ovat käytössä", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "joinRoom": "Liity huoneeseen", "@joinRoom": { "type": "String", "placeholders": {} }, - "memberChanges": "Jäsenmuutoksia", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "needPantalaimonWarning": "Tiedäthän tarvitsevasi toistaiseksi Pantalaimonin käyttääksesi päästä-päähän-salausta.", "@needPantalaimonWarning": { "type": "String", @@ -1367,11 +1261,6 @@ "type": "String", "placeholders": {} }, - "people": "Ihmiset", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Valitse kuva", "@pickImage": { "type": "String", @@ -1391,11 +1280,6 @@ } } }, - "pleaseChoose": "Valitse", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Valitse pääsykoodi", "@pleaseChooseAPasscode": { "type": "String", @@ -1469,11 +1353,6 @@ } } }, - "rejoin": "Liity uudelleen", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Poista", "@remove": { "type": "String", @@ -1493,25 +1372,11 @@ } } }, - "removeDevice": "Poista laite", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Poista porttikielto keskusteluun", "@unbanFromChat": { "type": "String", "placeholders": {} }, - "seenByUser": "Nähnyt {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "sendAMessage": "Lähetä viesti", "@sendAMessage": { "type": "String", @@ -1546,31 +1411,11 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Lähetä alkuperäinen", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Aseta pääalias", "@setAsCanonicalAlias": { "type": "String", "placeholders": {} }, - "setCustomEmotes": "Aseta mukautetut emotet", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Aseta kutsulinkki", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Aseta oikeustasot", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Aseta tila", "@setStatus": { "type": "String", @@ -1595,11 +1440,6 @@ } } }, - "singlesignon": "Kertakirjautuminen", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Ohita", "@skip": { "type": "String", @@ -1651,21 +1491,11 @@ "type": "String", "placeholders": {} }, - "toggleMuted": "Mykistetty-kytkin", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Liikaa pyyntöjä. Yritä myöhemmin uudelleen!", "@tooManyRequestsWarning": { "type": "String", "placeholders": {} }, - "toggleUnread": "Merkitse lukemattomaksi/luetuksi", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "transferFromAnotherDevice": "Siirrä toiselta laitteelta", "@transferFromAnotherDevice": { "type": "String", @@ -1823,11 +1653,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Taustakuva:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Varoitus!", "@warning": { "type": "String", @@ -1875,8 +1700,6 @@ }, "removeFromSpace": "Poista tilasta", "@removeFromSpace": {}, - "addToSpaceDescription": "Valitse tila, johon tämä keskustelu lisätään.", - "@addToSpaceDescription": {}, "start": "Aloita", "@start": {}, "serverRequiresEmail": "Tämän palvelimen täytyy tarkistaa sähköposti-osoitteesi rekisteröitymistä varten.", @@ -1980,11 +1803,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Lähetä tarra", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "publicRooms": "Julkiset huoneet", "@publicRooms": { "type": "String", @@ -2052,15 +1870,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 lukematon keskustelu} other{{unreadCount} lukematonta keskustelua}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "videoCall": "Videopuhelu", "@videoCall": { "type": "String", @@ -2082,11 +1891,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Suosikki-kytkin", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "unmuteChat": "Poista keskustelun mykistys", "@unmuteChat": { "type": "String", @@ -2150,22 +1954,6 @@ "type": "String", "description": "Usage hint for the command /discardsession" }, - "openVideoCamera": "Avaa kamera videokuvausta varten", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "publish": "Julkaise", - "@publish": {}, "markAsRead": "Merkitse luetuksi", "@markAsRead": {}, "dismiss": "Hylkää", @@ -2202,41 +1990,8 @@ "@pinMessage": {}, "confirmEventUnpin": "Haluatko varmasti irrottaa tapahtuman pysyvästi?", "@confirmEventUnpin": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Mukautettu", - "@widgetCustom": {}, - "widgetName": "Nimi", - "@widgetName": {}, - "widgetUrlError": "Epäkelvollinen URL.", - "@widgetUrlError": {}, - "errorAddingWidget": "Virhe lisättäessä pienoissovellusta.", - "@errorAddingWidget": {}, - "nextAccount": "Seuraava tili", - "@nextAccount": {}, - "switchToAccount": "Siirry tilille {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "experimentalVideoCalls": "Kokeelliset videopuhelut", "@experimentalVideoCalls": {}, - "emailOrUsername": "Sähköposti-osoite tai käyttäjätunnus", - "@emailOrUsername": {}, - "previousAccount": "Edellinen tili", - "@previousAccount": {}, - "widgetEtherpad": "Tekstimuotoinen muistiinpano", - "@widgetEtherpad": {}, - "widgetNameError": "Syötä näyttönimi.", - "@widgetNameError": {}, - "addWidget": "Lisää pienoissovellus", - "@addWidget": {}, "youRejectedTheInvitation": "Kieltäydyit kutsusta", "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Liityit keskusteluun", @@ -2299,25 +2054,10 @@ } } }, - "separateChatTypes": "Erota yksityiskeskustelut ryhmistä", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "dehydrateTor": "TOR-käyttäjät: vie istunto", - "@dehydrateTor": {}, - "hydrateTor": "TOR-käyttäjät: tuo viety istunto", - "@hydrateTor": {}, - "hydrateTorLong": "Veitkö edellisen istuntosi käyttäessäsi TORia? Tuo se nopeasti ja jatka jutustelua.", - "@hydrateTorLong": {}, - "pleaseEnterRecoveryKey": "Syötä palautusavaimesi:", - "@pleaseEnterRecoveryKey": {}, "recoveryKey": "Palautusavain", "@recoveryKey": {}, "recoveryKeyLost": "Kadonnut palautusavain?", "@recoveryKeyLost": {}, - "dehydrateTorLong": "Tor-käyttäjille suositellaan istunnon vientiä ennen ikkunan sulkemista.", - "@dehydrateTorLong": {}, "hydrate": "Palauta varmuuskopiotiedostosta", "@hydrate": {}, "dehydrate": "Vie istunto ja tyhjennä laite", @@ -2332,8 +2072,6 @@ "@pleaseEnterRecoveryKeyDescription": {}, "unlockOldMessages": "Pura vanhojen viestien salaus", "@unlockOldMessages": {}, - "indexedDbErrorLong": "Viestivarasto ei ole käytössä yksityisselauksessa oletuksena.\nKäythän osoitteessa\n - about:config\n - Aseta dom.indexedDB.privateBrowsing.enabled arvoon true\nMuuten FluffyChatin käyttäminen ei ole mahdollista.", - "@indexedDbErrorLong": {}, "saveKeyManuallyDescription": "Tallenna tämä avain manuaalisesti käyttäen järjestelmän jakodialogia tai leikepöytää.", "@saveKeyManuallyDescription": {}, "storeInAndroidKeystore": "Tallenna Android KeyStoreen", @@ -2350,8 +2088,6 @@ }, "storeInSecureStorageDescription": "Tallenna palautusavain tämän laitteen turvavarastoon.", "@storeInSecureStorageDescription": {}, - "indexedDbErrorTitle": "Yksityisen selauksen ongelmat", - "@indexedDbErrorTitle": {}, "user": "Käyttäjä", "@user": {}, "custom": "Mukautettu", @@ -2377,28 +2113,12 @@ "@commandHint_markasdm": {}, "foregroundServiceRunning": "Tämä ilmoitus näkyy etualapalvelun ollessa käynnissä.", "@foregroundServiceRunning": {}, - "callingPermissions": "Puheluoikeudet", - "@callingPermissions": {}, - "callingAccount": "Soittamistunnus", - "@callingAccount": {}, - "callingAccountDetails": "Sallii FluffyChatin käyttää Androidin omaa Puhelut-sovellusta.", - "@callingAccountDetails": {}, - "appearOnTop": "Näy päällä", - "@appearOnTop": {}, - "appearOnTopDetails": "Sallii sovelluksen näkyä muiden sovellusten päällä (tätä ei tarvita, mikäli olet jo määrittänyt FluffyChatin puhelin-tunnukseksi)", - "@appearOnTopDetails": {}, "newSpace": "Uusi tila", "@newSpace": {}, - "enterSpace": "Siirry tilaan", - "@enterSpace": {}, - "enterRoom": "Siirry huoneeseen", - "@enterRoom": {}, "allSpaces": "Kaikki tilat", "@allSpaces": {}, "screenSharingTitle": "ruudunjako", "@screenSharingTitle": {}, - "otherCallingPermissions": "Mikrofoni, kamera ja muut FluffyChatin oikeudet", - "@otherCallingPermissions": {}, "newGroup": "Uusi ryhmä", "@newGroup": {}, "screenSharingDetail": "Jaat ruutuasi FluffyChatissä", @@ -2432,21 +2152,10 @@ } } }, - "numChats": "{number} keskustelua", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "commandHint_googly": "Lähetä askartelusilmiä", "@commandHint_googly": {}, "commandHint_cuddle": "Lähetä kokovartaluhalaus", "@commandHint_cuddle": {}, - "hideUnimportantStateEvents": "Piilota ei-niin-tärkeät tilatapahtumat", - "@hideUnimportantStateEvents": {}, "doNotShowAgain": "Älä näytä uudelleen", "@doNotShowAgain": {}, "fileHasBeenSavedAt": "Tiedosto on tallennettu sijaintiin {path}", @@ -2460,13 +2169,6 @@ }, "disableEncryptionWarning": "Turvallisuuden vuoksi et voi poistaa salausta käytöstä huoneista, joissa se on aiemmin otettu käyttöön.", "@disableEncryptionWarning": {}, - "allRooms": "Kaikki ryhmäkeskustelut", - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "startFirstChat": "Aloita ensimmäinen keskustelusi", - "@startFirstChat": {}, "newSpaceDescription": "Tilat mahdollistavat keskusteluidesi keräämisen ja yksityisten tai julkisten yhteisöjen rakentamisen.", "@newSpaceDescription": {}, "deviceKeys": "Laite-avaimet:", @@ -2504,10 +2206,6 @@ }, "sorryThatsNotPossible": "Anteeksi... se ei ole mahdollista", "@sorryThatsNotPossible": {}, - "signInWithPassword": "Kirjaudu sisään salasanalla", - "@signInWithPassword": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Yritä myöhemmin uudelleen tai valitse toinen palvelin.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "setColorTheme": "Aseta väriteema:", "@setColorTheme": {}, "tryAgain": "Yritä uudelleen", @@ -2533,23 +2231,12 @@ } } }, - "signInWith": "Kirjaudu sisään palvelulla {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "optionalRedactReason": "(Vapaaehtoinen) Syy tämän viestin poistamiselle...", "@optionalRedactReason": {}, "archiveRoomDescription": "Keskustelu siirretään arkistoon. Muut käyttäjät näkevät sinun poistuneen keskustelusta.", "@archiveRoomDescription": {}, "exportEmotePack": "Vie emotepaketti .zip-tiedostona", "@exportEmotePack": {}, - "inviteContactToGroupQuestion": "Tahdotko kutsua yhteystiedon {contact} keskusteluun \"{groupName}\"?", - "@inviteContactToGroupQuestion": {}, "redactedByBecause": "Poistanut {username} syystä: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2566,8 +2253,6 @@ "@redactMessageDescription": {}, "invalidInput": "Virheellinen syöte!", "@invalidInput": {}, - "addChatDescription": "Lisää keskustelulle kuvaus...", - "@addChatDescription": {}, "hasKnocked": "🚪 {user} on koputtanut", "@hasKnocked": { "placeholders": { @@ -2591,8 +2276,6 @@ "@sendTypingNotifications": {}, "inviteGroupChat": "📨 Kutsu ryhmäkeskusteluun", "@inviteGroupChat": {}, - "invitePrivateChat": "📨 Kutsu yksityiskeskusteluun", - "@invitePrivateChat": {}, "importEmojis": "Tuo emojit", "@importEmojis": {}, "noChatDescriptionYet": "Keskustelun kuvausta ei ole vielä luotu.", @@ -2605,8 +2288,6 @@ "@roomUpgradeDescription": {}, "pleaseEnterANumber": "Syötä suurempi luku kuin 0", "@pleaseEnterANumber": {}, - "profileNotFound": "Käyttäjää ei löydy palvelimelta. Tämä voi olla yhteysongelma tai käyttäjä ei ole olemassa.", - "@profileNotFound": {}, "shareInviteLink": "Jaa kutsulinkki", "@shareInviteLink": {}, "emoteKeyboardNoRecents": "Viimeaikoina käytetyt emotet tulevat näkymään täällä...", @@ -2614,8 +2295,6 @@ "type": "String", "placeholders": {} }, - "setTheme": "Aseta teema:", - "@setTheme": {}, "replace": "Korvaa", "@replace": {}, "createGroup": "Luo ryhmä", @@ -2686,20 +2365,10 @@ "@pause": {}, "resume": "Jatka", "@resume": {}, - "moveUp": "Siirrä ylös", - "@moveUp": {}, - "moveDown": "Siirrä alas", - "@moveDown": {}, "poll": "Kysely", "@poll": {}, - "setCustomPermissionLevel": "Aseta mukautettu lupataso", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Valitse alla oleva ennalta määritetty rooli tai anna mukautettu lupataso väliltä 0–100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Jätä huomiotta", "@ignoreUser": {}, - "normalUser": "Peruskäyttäjä", - "@normalUser": {}, "aboutHomeserver": "Tietoja {homeserver}:sta", "@aboutHomeserver": { "type": "String", @@ -2713,22 +2382,8 @@ "@commandHint_roomupgrade": {}, "appLockDescription": "Lukitse sovellus kun sitä ei käytetä PIN-koodin kanssa", "@appLockDescription": {}, - "countChatsAndCountParticipants": "{chats} pikakeskustelut ja {participants} osallistujat", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noChatsFoundHere": "Täältä ei löytynyt vielä pikakeskusteluja. Aloita uusi pikakeskustelu jonkun kanssa alla olevalla painikkeella. ⤵️", "@noChatsFoundHere": {}, - "joinedChats": "Liittyneet pikakeskustelut", - "@joinedChats": {}, "space": "Tila", "@space": {}, "spaces": "Tilat", @@ -2762,16 +2417,10 @@ "@blockedUsers": {}, "blockListDescription": "Voit estää sinua häiritsevät käyttäjät. Et voi vastaanottaa viestejä tai huonekutsuja henkilökohtaisella estolistallasi olevilta käyttäjiltä.", "@blockListDescription": {}, - "hideMemberChangesInPublicChats": "Piilota jäsenten muutokset julkisissa pikakeskusteluissa", - "@hideMemberChangesInPublicChats": {}, - "hideMemberChangesInPublicChatsBody": "Älä näytä pikakeskustelun aikajanalla, jos joku liittyy julkiseen pikakeskusteluun tai poistuu siitä luettavuuden parantamiseksi.", - "@hideMemberChangesInPublicChatsBody": {}, "blockUsername": "Jätä käyttäjänimi huomiotta", "@blockUsername": {}, "overview": "Yleiskatsaus", "@overview": {}, - "notifyMeFor": "Ilmoita minulle", - "@notifyMeFor": {}, "passwordRecoverySettings": "Salasanan palautusasetukset", "@passwordRecoverySettings": {}, "sendImages": "Lähetä {count} kuva", @@ -2783,11 +2432,6 @@ } } }, - "presenceStyle": "Läsnäolo:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Näytä muiden käyttäjien tilaviestit", "@presencesToggle": { "type": "String", @@ -2802,14 +2446,6 @@ } } }, - "youInvitedToBy": "📩 Sinut on kutsuttu linkin kautta kohteeseen:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "invitedBy": "📩 Kutsujana {user}", "@invitedBy": { "placeholders": { @@ -2822,16 +2458,6 @@ "@usersMustKnock": {}, "noOneCanJoin": "Kukaan ei voi liittyä", "@noOneCanJoin": {}, - "userWouldLikeToChangeTheChat": "{user} haluaa liittyä pikakeskusteluun.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Julkista linkkiä ei ole vielä luotu", - "@noPublicLinkHasBeenCreatedYet": {}, "knock": "Koputa", "@knock": {}, "hidePresences": "Piilotetaanko tilaluettelo?", @@ -2884,8 +2510,6 @@ "@groupCanBeFoundViaSearch": {}, "wrongRecoveryKey": "Pahoittelut... tämä ei vaikuta olevan oikea palautusavain.", "@wrongRecoveryKey": {}, - "startConversation": "Aloita keskustelu", - "@startConversation": {}, "commandHint_sendraw": "Lähetä raaka JSON", "@commandHint_sendraw": {}, "databaseMigrationTitle": "Tietokanta on optimoitu", @@ -2894,8 +2518,6 @@ "@databaseMigrationBody": {}, "leaveEmptyToClearStatus": "Jätä tyhjäksi tyhjentääksesi tilasi.", "@leaveEmptyToClearStatus": {}, - "publicLink": "Julkinen linkki", - "@publicLink": {}, "publicChatAddresses": "Julkiset keskusteluosoitteet", "@publicChatAddresses": {}, "createNewAddress": "Luo uusi osoite", @@ -2906,23 +2528,8 @@ "@publicSpaces": {}, "addChatOrSubSpace": "Lisää pikakeskustelu tai alitila", "@addChatOrSubSpace": {}, - "subspace": "Alitila", - "@subspace": {}, - "decline": "Hylkää", - "@decline": {}, "initAppError": "Sovelluksen alustamisessa tapahtui virhe", "@initAppError": {}, - "userRole": "Käyttäjärooli", - "@userRole": {}, - "minimumPowerLevel": "{level} on pienin tehotaso.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchIn": "Hae keskustelusta \"{chat}\"...", "@searchIn": { "type": "String", @@ -2934,18 +2541,6 @@ }, "searchMore": "Hae lisää...", "@searchMore": {}, - "databaseBuildErrorBody": "SQlite-tietokantaa ei voida rakentaa. Sovellus yrittää toistaiseksi käyttää vanhaa tietokantaa. Ilmoita tästä virheestä kehittäjille osoitteessa {url}. Virheviesti on: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "Istuntosi on menetetty. Ilmoita tästä virheestä kehittäjille osoitteessa {url}. Virheviesti on: {error}", "@sessionLostBody": { "type": "String", @@ -2970,15 +2565,6 @@ } } }, - "forwardMessageTo": "Lähetätkö viestin edelleen kohteeseen {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "Lähetä lukukuittaukset", "@sendReadReceipts": {}, "sendTypingNotificationsDescription": "Muut keskustelun osallistujat näkevät, milloin olet kirjoittamassa uutta viestiä.", @@ -3149,12 +2735,6 @@ "@sendCanceled": {}, "loginWithMatrixId": "Kirjaudu sisään Matrix-tunnuksella", "@loginWithMatrixId": {}, - "discoverHomeservers": "Tutustu kotipalvelimiin", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "Mikä on kotipalvelin?", - "@whatIsAHomeserver": {}, - "homeserverDescription": "Kaikki tietosi tallennetaan kotipalvelimelle, aivan kuten sähköpostipalveluntarjoaja. Voit valita, mitä kotipalvelinta haluat käyttää, ja silti kommunikoida kaikkien kanssa. Lisätietoja osoitteessa https://matrix.org.", - "@homeserverDescription": {}, "doesNotSeemToBeAValidHomeserver": "Ei näytä olevan yhteensopiva kotipalvelin. Väärä URL-osoite?", "@doesNotSeemToBeAValidHomeserver": {}, "calculatingFileSize": "Lasketaan tiedoston kokoa...", @@ -3239,8 +2819,6 @@ "@appWantsToUseForLoginDescription": {}, "waitingForServer": "Odotetaan palvelinta...", "@waitingForServer": {}, - "appIntroduction": "FluffyChatin avulla voit keskustella ystäviesi kanssa eri pikaviestimien kautta. Lue lisää osoitteesta https://matrix.org tai napauta *Jatka*.", - "@appIntroduction": {}, "newChatRequest": "📩 Uusi pikakeskustelupyyntö", "@newChatRequest": {}, "contentNotificationSettings": "Sisältöilmoitusten asetukset", @@ -3396,10 +2974,6 @@ "@noMessagesYet": {}, "longPressToRecordVoiceMessage": "Pitkä painallus ääniviestin tallentamiseksi.", "@longPressToRecordVoiceMessage": {}, - "newSubSpace": "Uusi alitila", - "@newSubSpace": {}, - "moveToDifferentSpace": "Siirry eri tilaan", - "@moveToDifferentSpace": {}, "removeFromSpaceDescription": "Pikakeskustelu poistetaan tilasta, mutta se näkyy edelleen pikakeskusteluluettelossasi.", "@removeFromSpaceDescription": {}, "countChats": "{chats} pikakeskustelua", @@ -3446,8 +3020,6 @@ "@endPoll": {}, "answersVisible": "Vastaukset näkyvissä", "@answersVisible": {}, - "answersHidden": "Vastaukset piilotettu", - "@answersHidden": {}, "pollQuestion": "Kyselykysymys", "@pollQuestion": {}, "answerOption": "Vastausvaihtoehto", @@ -3484,4 +3056,4 @@ "@thread": {}, "backToMainChat": "Takaisin pääpikakeskusteluun", "@backToMainChat": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_fil.arb b/lib/l10n/intl_fil.arb index 414c52d4..4814eb47 100644 --- a/lib/l10n/intl_fil.arb +++ b/lib/l10n/intl_fil.arb @@ -29,8 +29,6 @@ }, "confirmMatrixId": "Paki-kumpirma ang iyong Matrix ID para burahin ang iyong account.", "@confirmMatrixId": {}, - "addChatDescription": "Magdagdag ng deskripsyon ng chat...", - "@addChatDescription": {}, "admin": "Admin", "@admin": { "type": "String", @@ -207,8 +205,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Nadagdag ang chat sa space na ito", - "@chatHasBeenAddedToThisSpace": {}, "chats": "Mga Chat", "@chats": { "type": "String", @@ -317,18 +313,6 @@ }, "sendOnEnter": "Ipadala sa pagpindot ng enter", "@sendOnEnter": {}, - "badServerVersionsException": "Ang homeserver ay sinusuportahan ang mga Spec bersyon:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Pagbawalan sa chat", "@banFromChat": { "type": "String", @@ -339,11 +323,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Mga mensahe ng bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Kanselahin", "@cancel": { "type": "String", @@ -510,11 +489,6 @@ "type": "String", "placeholders": {} }, - "confirm": "Kumpirmahin", - "@confirm": { - "type": "String", - "placeholders": {} - }, "compareNumbersMatch": "Paki-kumpara ang mga numero", "@compareNumbersMatch": { "type": "String", @@ -580,11 +554,6 @@ "type": "String", "placeholders": {} }, - "allRooms": "Lahat ng Mga Group Chat", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "downloadFile": "I-download ang file", "@downloadFile": { "type": "String", @@ -728,16 +697,6 @@ "type": "String", "placeholders": {} }, - "connect": "Kumonekta", - "@connect": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "Naglalaman ng display name", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "create": "Gumawa", "@create": { "type": "String", @@ -755,33 +714,6 @@ } } }, - "dateWithoutYear": "{month}/{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{month}/{day}/{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Ide-deactivate nito ang iyong user account. Hindi na ito maaaring bawiin! Sigurado ka?", "@deactivateAccountWarning": { "type": "String", @@ -833,11 +765,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Kailangan mong pumili ng emote shortcode at isang larawan!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "enableEmotesGlobally": "I-enable ang emote pack globally", "@enableEmotesGlobally": { "type": "String", @@ -859,11 +786,6 @@ }, "homeserver": "Homeserver", "@homeserver": {}, - "enterYourHomeserver": "Ilagay ang iyong homeserver", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "extremeOffensive": "Lubhang nakakasakit", "@extremeOffensive": { "type": "String", @@ -889,11 +811,6 @@ "type": "String", "placeholders": {} }, - "containsUserName": "Naglalaman ng username", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Inulat ang nilalaman sa mga pangangasiwa ng server", "@contentHasBeenReported": { "type": "String", @@ -976,18 +893,6 @@ }, "space": "Espasyo", "@space": {}, - "countChatsAndCountParticipants": "{chats} mga chat at {participants} mga kasali", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "guestsAreForbidden": "Pinagbabawal ang mga bisita", "@guestsAreForbidden": { "type": "String", @@ -1013,11 +918,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Pumunta sa bagong room", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grupo", "@group": { "type": "String", @@ -1027,8 +927,6 @@ "@swipeRightToLeftToReply": {}, "noMoreChatsFound": "Wala nang mga chat na nahanap…", "@noMoreChatsFound": {}, - "joinedChats": "Mga nasaling chat", - "@joinedChats": {}, "unread": "Hindi nabasa", "@unread": {}, "spaces": "Mga Espasyo", @@ -1060,4 +958,4 @@ } } } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 74e993c8..4c6b6042 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -131,18 +131,6 @@ } } }, - "badServerVersionsException": "Le serveur d'accueil prend en charge les versions des spécifications :\n{serverVersions}\nMais cette application ne prend en charge que {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Bannir de la discussion", "@banFromChat": { "type": "String", @@ -175,11 +163,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Messages de bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Annuler", "@cancel": { "type": "String", @@ -393,8 +376,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "La discussion a été ajoutée à cet espace", - "@chatHasBeenAddedToThisSpace": {}, "chats": "Discussions", "@chats": { "type": "String", @@ -511,31 +492,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Confirmer", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Se connecter", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Le contact a été invité au groupe", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Contient un nom d'affichage", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Contient un nom d'utilisateur·ice", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Le contenu a été signalé aux administrateurs du serveur", "@contentHasBeenReported": { "type": "String", @@ -615,33 +576,6 @@ } } }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Cette opération va désactiver votre compte. Une fois cette action effectuée, aucun retour en arrière n'est possible ! Êtes-vous sûr·e ?", "@deactivateAccountWarning": { "type": "String", @@ -747,11 +681,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Vous devez sélectionner un raccourci d'émoticône et une image !", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Discussion vide", "@emptyChat": { "type": "String", @@ -801,11 +730,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Renseignez votre serveur d'accueil", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Erreur lors de l'obtention de la localisation : {error}", "@errorObtainingLocation": { "type": "String", @@ -855,11 +779,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Aller dans le nouveau salon", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Groupe", "@group": { "type": "String", @@ -931,11 +850,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identité", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorer", "@ignore": { "type": "String", @@ -997,11 +911,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Inviter pour moi", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} vous a invité·e sur FluffyChat.\n1. Visiter fluffychat.im et installer l'application\n2. Inscrivez-vous ou connectez-vous\n3. Ouvrez le lien d'invitation :\n{link}", "@inviteText": { "type": "String", @@ -1081,11 +990,6 @@ "type": "String", "placeholders": {} }, - "license": "Licence", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Clair", "@lightTheme": { "type": "String", @@ -1139,11 +1043,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Changements de membres", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Mentionner", "@mention": { "type": "String", @@ -1251,11 +1150,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notifications activées pour ce compte", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} utilisateur·ices écrivent…", "@numUsersTyping": { "type": "String", @@ -1355,11 +1249,6 @@ "type": "String", "placeholders": {} }, - "people": "Personnes", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Choisir une image", "@pickImage": { "type": "String", @@ -1379,11 +1268,6 @@ } } }, - "pleaseChoose": "Veuillez choisir", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Veuillez choisir un code d’accès", "@pleaseChooseAPasscode": { "type": "String", @@ -1477,11 +1361,6 @@ } } }, - "rejoin": "Rejoindre de nouveau", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Supprimer", "@remove": { "type": "String", @@ -1501,11 +1380,6 @@ } } }, - "removeDevice": "Supprimer l'appareil", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Débannissement de la discussion", "@unbanFromChat": { "type": "String", @@ -1561,15 +1435,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Vu par {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Envoyer", "@send": { "type": "String", @@ -1604,16 +1469,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Envoyer le fichier original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Envoyer un autocollant", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Envoyer une vidéo", "@sendVideo": { "type": "String", @@ -1678,21 +1533,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Définir des émoticônes personnalisées", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Créer un lien d'invitation", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Définir le niveau de permissions", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Définir le statut", "@setStatus": { "type": "String", @@ -1727,11 +1567,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Authentification unique", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Ignorer", "@skip": { "type": "String", @@ -1802,21 +1637,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Activer/désactiver en favori", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Activer/désactiver la sourdine", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Marquer comme lu / non lu", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Trop de requêtes. Veuillez réessayer plus tard !", "@tooManyRequestsWarning": { "type": "String", @@ -1883,15 +1703,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 discussion non lue} other{{unreadCount} discussions non lues}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} et {count} autres sont en train d'écrire…", "@userAndOthersAreTyping": { "type": "String", @@ -2016,11 +1827,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Image de fond :", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Attention !", "@warning": { "type": "String", @@ -2128,8 +1934,6 @@ "@messageInfo": {}, "removeFromSpace": "Supprimer de l’espace", "@removeFromSpace": {}, - "addToSpaceDescription": "Sélectionnez un espace pour y ajouter cette discussion.", - "@addToSpaceDescription": {}, "start": "Commencer", "@start": {}, "commandHint_create": "Créer un groupe de discussion vide\nUtilisez --no-encryption pour désactiver le chiffrement", @@ -2152,22 +1956,6 @@ "type": "String", "description": "Usage hint for the command /dm" }, - "openVideoCamera": "Ouvrir la caméra pour une vidéo", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "publish": "Publier", - "@publish": {}, - "videoWithSize": "Vidéo ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "dismiss": "Rejeter", "@dismiss": {}, "markAsRead": "Marquer comme lu", @@ -2206,39 +1994,6 @@ "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Appels vidéo expérimentaux", "@experimentalVideoCalls": {}, - "emailOrUsername": "Courriel ou identifiant", - "@emailOrUsername": {}, - "switchToAccount": "Passer au compte {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Compte suivant", - "@nextAccount": {}, - "previousAccount": "Compte précédent", - "@previousAccount": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Personnalisé", - "@widgetCustom": {}, - "widgetUrlError": "Ceci n'est pas un lien valide.", - "@widgetUrlError": {}, - "widgetNameError": "Veuillez fournir un nom d'affichage.", - "@widgetNameError": {}, - "errorAddingWidget": "Erreur lors de l'ajout du widget.", - "@errorAddingWidget": {}, - "widgetEtherpad": "Note textuelle", - "@widgetEtherpad": {}, - "addWidget": "Ajouter un widget", - "@addWidget": {}, - "widgetName": "Nom", - "@widgetName": {}, - "widgetVideo": "Vidéo", - "@widgetVideo": {}, "youRejectedTheInvitation": "Vous avez rejeté l'invitation", "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Vous avez rejoint la discussion", @@ -2301,11 +2056,6 @@ } } }, - "separateChatTypes": "Séparer les discussions directes et les groupes", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "users": "Utilisateurs/trices", "@users": {}, "storeInAndroidKeystore": "Stocker dans Android KeyStore", @@ -2320,30 +2070,16 @@ "@hydrate": {}, "dehydrateWarning": "Cette action ne peut pas être annulée. Assurez-vous d'enregistrer convenablement le fichier de sauvegarde.", "@dehydrateWarning": {}, - "dehydrateTorLong": "Pour les utilisateurs/trices de TOR, il est recommandé d'exporter la session avant de fermer la fenêtre.", - "@dehydrateTorLong": {}, "recoveryKey": "Clé de récupération", "@recoveryKey": {}, "recoveryKeyLost": "Clé de récupération perdue ?", "@recoveryKeyLost": {}, - "indexedDbErrorLong": "Le stockage des messages n'est malheureusement pas activé par défaut en mode privé.\nVeuillez consulter :\n - about:config\n - Définir dom.indexedDB.privateBrowsing.enabled à « vrai ».\nSinon, il n'est pas possible d'exécuter FluffyChat.", - "@indexedDbErrorLong": {}, "saveKeyManuallyDescription": "Enregistrer cette clé manuellement en déclenchant la boîte de dialogue de partage du système ou le presse-papiers.", "@saveKeyManuallyDescription": {}, "storeInSecureStorageDescription": "Stocker la clé de récupération dans un espace sécurisé de cet appareil.", "@storeInSecureStorageDescription": {}, - "indexedDbErrorTitle": "Problèmes relatifs au mode privé", - "@indexedDbErrorTitle": {}, "dehydrate": "Exporter la session et effacer l'appareil", "@dehydrate": {}, - "dehydrateTor": "Utilisateurs/trices de TOR : Exporter la session", - "@dehydrateTor": {}, - "hydrateTor": "Utilisateurs/trices de TOR : Importer une session exportée", - "@hydrateTor": {}, - "hydrateTorLong": "Vous avez exporté votre session la dernière fois sur TOR ? Importez-la rapidement et continuez à discuter.", - "@hydrateTorLong": {}, - "pleaseEnterRecoveryKey": "Veuillez saisir votre clé de récupération :", - "@pleaseEnterRecoveryKey": {}, "pleaseEnterRecoveryKeyDescription": "Pour déverrouiller vos anciens messages, veuillez entrer votre clé de récupération qui a été générée lors d'une session précédente. Votre clé de récupération n'est PAS votre mot de passe.", "@pleaseEnterRecoveryKeyDescription": {}, "unlockOldMessages": "Déverrouiller les anciens messages", @@ -2360,8 +2096,6 @@ }, "noKeyForThisMessage": "Cela peut se produire si le message a été envoyé avant que vous ne vous soyez connecté à votre compte sur cet appareil.\n\nIl est également possible que l'expéditeur ait bloqué votre appareil ou qu'un problème de connexion Internet se soit produit.\n\nÊtes-vous capable de lire le message sur une autre session ? Vous pouvez alors transférer le message à partir de celle-ci ! Allez dans Paramètres > Appareils et assurez-vous que vos appareils se sont vérifiés mutuellement. Lorsque vous ouvrirez le salon la fois suivante et que les deux sessions seront au premier plan, les clés seront transmises automatiquement.\n\nVous ne voulez pas perdre les clés en vous déconnectant ou en changeant d'appareil ? Assurez-vous que vous avez activé la sauvegarde de la discussion dans les paramètres.", "@noKeyForThisMessage": {}, - "enterRoom": "Entrer dans le salon", - "@enterRoom": {}, "allSpaces": "Tous les espaces", "@allSpaces": {}, "commandHint_markasdm": "Marquer comme salon de messages directs pour l'identifiant Matrix indiqué", @@ -2387,35 +2121,10 @@ "@screenSharingTitle": {}, "screenSharingDetail": "Vous partagez votre écran dans FuffyChat", "@screenSharingDetail": {}, - "callingPermissions": "Permissions d'appel", - "@callingPermissions": {}, - "callingAccount": "Compte d'appel", - "@callingAccount": {}, - "callingAccountDetails": "Permet à FluffyChat d'utiliser l'application de numérotation native d'Android.", - "@callingAccountDetails": {}, - "appearOnTop": "Apparaître en haut", - "@appearOnTop": {}, - "appearOnTopDetails": "Permet à l'application d'apparaître en haut de l'écran (non nécessaire si vous avez déjà configuré Fluffychat comme compte d'appel)", - "@appearOnTopDetails": {}, - "otherCallingPermissions": "Microphone, caméra et autres autorisations de FluffyChat", - "@otherCallingPermissions": {}, "newGroup": "Nouveau groupe", "@newGroup": {}, "newSpace": "Nouvel espace", "@newSpace": {}, - "enterSpace": "Entrer dans l’espace", - "@enterSpace": {}, - "numChats": "{number} discussions", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Masquer les événements d'état sans importance", - "@hideUnimportantStateEvents": {}, "doNotShowAgain": "Ne plus afficher", "@doNotShowAgain": {}, "commandHint_googly": "Envoyer des yeux écarquillés", @@ -2466,8 +2175,6 @@ "@sorryThatsNotPossible": {}, "deviceKeys": "Clés de l’appareil :", "@deviceKeys": {}, - "startFirstChat": "Commencez votre première discussion", - "@startFirstChat": {}, "newSpaceDescription": "Les espaces vous permettent de consolider vos conversations et de construire des communautés privées ou publiques.", "@newSpaceDescription": {}, "disableEncryptionWarning": "Pour des raisons de sécurité, vous ne pouvez pas désactiver le chiffrement dans une discussion s'il a été activé avant.", @@ -2493,17 +2200,10 @@ "@jumpToLastReadMessage": {}, "readUpToHere": "Lisez jusqu’ici", "@readUpToHere": {}, - "allRooms": "Tous les groupes de discussion", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "chatPermissions": "Permissions du salon", "@chatPermissions": {}, "importFromZipFile": "Importer depuis un fichier .zip", "@importFromZipFile": {}, - "inviteContactToGroupQuestion": "Voulez-vous inviter {contact} au salon \"{groupName}\" ?", - "@inviteContactToGroupQuestion": {}, "importEmojis": "Importer des Emojis", "@importEmojis": {}, "notAnImage": "Pas un fichier image.", @@ -2533,8 +2233,6 @@ "@directChat": {}, "optionalRedactReason": "(Facultatif) Raison de la suppression de ce message...", "@optionalRedactReason": {}, - "subspace": "Sous-espace", - "@subspace": {}, "sendTypingNotifications": "Envoyer des notifications de frappe", "@sendTypingNotifications": {}, "replace": "Remplacer", @@ -2550,14 +2248,10 @@ "@chatDescription": {}, "invalidServerName": "Nom de serveur invalide", "@invalidServerName": {}, - "addChatDescription": "Ajouter une description à la discussion...", - "@addChatDescription": {}, "shareInviteLink": "Partager un lien d'invitation", "@shareInviteLink": {}, "openLinkInBrowser": "Ouvrir le lien dans le navigateur", "@openLinkInBrowser": {}, - "setTheme": "Définir le thème :", - "@setTheme": {}, "setColorTheme": "Définir la couleur du thème :", "@setColorTheme": {}, "databaseMigrationBody": "Veuillez patienter. Cela peut prendre un moment.", @@ -2568,8 +2262,6 @@ "@passwordsDoNotMatch": {}, "passwordIsWrong": "Votre mot de passe saisi est erroné", "@passwordIsWrong": {}, - "publicLink": "Lien public", - "@publicLink": {}, "joinSpace": "Rejoindre l'espace", "@joinSpace": {}, "publicSpaces": "Espaces publics", @@ -2584,20 +2276,6 @@ "@sendTypingNotificationsDescription": {}, "verifyOtherDevice": "🔐 Vérifier l'autre appareil", "@verifyOtherDevice": {}, - "databaseBuildErrorBody": "La base de données SQlite ne peut pas être créée. L'application essaie d'utiliser la base de données existante pour le moment. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "startConversation": "Démarrer la conversation", - "@startConversation": {}, "formattedMessagesDescription": "Affichez le contenu formaté des messages comme du texte en gras à l'aide de markdown.", "@formattedMessagesDescription": {}, "incomingMessages": "Messages entrants", @@ -2611,24 +2289,12 @@ } } }, - "pleaseTryAgainLaterOrChooseDifferentServer": "Veuillez réessayer plus tard ou choisir un autre serveur.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "inviteGroupChat": "📨 Inviter à une discussion de groupe", "@inviteGroupChat": {}, - "invitePrivateChat": "📨 Inviter à une discussion privée", - "@invitePrivateChat": {}, "jump": "Sauter", "@jump": {}, - "signInWithPassword": "Se connecter avec mot de passe", - "@signInWithPassword": {}, - "hideMemberChangesInPublicChats": "Masquer les modifications de membres dans les discussions publiques", - "@hideMemberChangesInPublicChats": {}, - "hideMemberChangesInPublicChatsBody": "Ne pas afficher dans la chronologie de la discussion si quelqu'un rejoint ou quitte une discussion publique afin d'améliorer la lisibilité.", - "@hideMemberChangesInPublicChatsBody": {}, "overview": "Aperçu", "@overview": {}, - "notifyMeFor": "Me notifier pour", - "@notifyMeFor": {}, "passwordRecoverySettings": "Paramètres de récupération de mot de passe", "@passwordRecoverySettings": {}, "hasKnocked": "🚪 {user} a frappé", @@ -2736,34 +2402,11 @@ }, "setChatDescription": "Définir la description de la discussion", "@setChatDescription": {}, - "presenceStyle": "Statut :", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Afficher les messages de statut des autres utilisateurs/trices", "@presencesToggle": { "type": "String", "placeholders": {} }, - "youInvitedToBy": "📩 Vous avez été invité par lien à :\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "userWouldLikeToChangeTheChat": "{user} souhaite rejoindre la discussion.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Aucun lien public n'a encore été crée", - "@noPublicLinkHasBeenCreatedYet": {}, "gallery": "Galerie", "@gallery": {}, "files": "Fichiers", @@ -2789,15 +2432,6 @@ } } }, - "forwardMessageTo": "Transférer le message à {roomName} ?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceiptsDescription": "Les autres participants à une discussion peuvent voir si vous avez lu un message.", "@sendReadReceiptsDescription": {}, "formattedMessages": "Messages formatés", @@ -2847,15 +2481,6 @@ "@restricted": {}, "knockRestricted": "Frapper à la porte limité", "@knockRestricted": {}, - "signInWith": "Se connecter avec {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "groupCanBeFoundViaSearch": "Le groupe peut être trouvé via la recherche", "@groupCanBeFoundViaSearch": {}, "groupName": "Nom du groupe", @@ -2866,24 +2491,10 @@ "@block": {}, "removeDevicesDescription": "Vous serez déconnecté de cet appareil et ne pourrez plus recevoir de messages.", "@removeDevicesDescription": {}, - "userRole": "Rôle de l'utilisateur/trice", - "@userRole": {}, "createNewAddress": "Créer une nouvelle adresse", "@createNewAddress": {}, "publicChatAddresses": "Addresses de discussion publiques", "@publicChatAddresses": {}, - "countChatsAndCountParticipants": "{chats} discussions et {participants} participants", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "space": "Espace", "@space": {}, "spaces": "Espaces", @@ -2892,8 +2503,6 @@ "@noMoreChatsFound": {}, "unread": "Non lu", "@unread": {}, - "joinedChats": "Discussions rejointes", - "@joinedChats": {}, "commandHint_sendraw": "Envoyer du JSON brut", "@commandHint_sendraw": {}, "databaseMigrationTitle": "La base de données est optimisée", @@ -2942,8 +2551,6 @@ "@newPassword": {}, "pleaseChooseAStrongPassword": "Veuillez choisir un mot de passe fort", "@pleaseChooseAStrongPassword": {}, - "decline": "Refuser", - "@decline": {}, "initAppError": "Une erreur est survenue pendant l'initialisation de l'application", "@initAppError": {}, "markAsUnread": "Marquer comme non lu", @@ -2971,15 +2578,6 @@ "@roomUpgradeDescription": {}, "learnMore": "En savoir plus", "@learnMore": {}, - "minimumPowerLevel": "{level} est le niveau minimum de droits.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "restoreSessionBody": "L'application tente maintenant de restaurer votre session depuis la sauvegarde. Veuillez signaler cette erreur aux développeurs à {url}. Le message d'erreur est le suivant : {error}", "@restoreSessionBody": { "type": "String", @@ -2992,8 +2590,6 @@ } } }, - "profileNotFound": "Cet utilisateur/trice n'a pu être trouvé sur le serveur. Peut-être est-ce un problème de connexion ou l'utilisateur/trice n'existe pas.", - "@profileNotFound": {}, "archiveRoomDescription": "La discussion sera déplacée dans les archives. Les autres utilisateurs/trices pourront voir que vous avez quitté la discussion.", "@archiveRoomDescription": {}, "noUsersFoundWithQuery": "Malheureusement, aucun utilisateur/trice n'a pu être trouvé avec \"{query}\". Veuillez vérifier si vous n'avez pas fait de faute de frappe.", @@ -3089,14 +2685,8 @@ }, "loginWithMatrixId": "Connexion avec l'identifiant Matrix", "@loginWithMatrixId": {}, - "setCustomPermissionLevel": "Définir un niveau d’autorisation", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Veuillez choisir un rôle prédéfini ci-dessous ou saisir un niveau d’autorisation entre 0 et 100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Ignorer l'utilisateur", "@ignoreUser": {}, - "normalUser": "Utilisateur standard", - "@normalUser": {}, "checkList": "Check-list", "@checkList": {}, "countInvited": "{count} invité(e/s)", @@ -3117,8 +2707,6 @@ } } }, - "homeserverDescription": "Toutes vos données sont stockées sur le serveur de votre fournisseur matrix, comme chez un fournisseur d'e-mails. Vous pouvez choisir le serveur que vous souhaitez utiliser, tout en pouvant communiquer avec tout le monde. Pour en savoir plus, rendez-vous sur https://matrix.org.", - "@homeserverDescription": {}, "calculatingFileSize": "Calcul en cours...", "@calculatingFileSize": {}, "prepareSendingAttachment": "Préparation à l'envoi...", @@ -3164,4 +2752,4 @@ "@addLink": {}, "allowMultipleAnswers": "Autoriser plusieurs réponses", "@allowMultipleAnswers": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index caae5d78..5750ca5d 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -14,11 +14,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Cúlbhrat:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "verify": "Deimhnigh", "@verify": { "type": "String", @@ -110,11 +105,6 @@ "type": "String", "placeholders": {} }, - "rejoin": "Téigh ar ais isteach", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "reject": "Diúltaigh", "@reject": { "type": "String", @@ -145,11 +135,6 @@ "type": "String", "placeholders": {} }, - "people": "Daoine", - "@people": { - "type": "String", - "placeholders": {} - }, "password": "Pasfhocal", "@password": { "type": "String", @@ -269,11 +254,6 @@ "type": "String", "placeholders": {} }, - "license": "Ceadúnas", - "@license": { - "type": "String", - "placeholders": {} - }, "leave": "Fág", "@leave": { "type": "String", @@ -294,11 +274,6 @@ "type": "String", "placeholders": {} }, - "identity": "Aitheantas", - "@identity": { - "type": "String", - "placeholders": {} - }, "id": "ID", "@id": { "type": "String", @@ -360,33 +335,6 @@ "type": "String", "placeholders": {} }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "dateAndTimeOfDay": "{date}, {timeOfDay}", "@dateAndTimeOfDay": { "type": "String", @@ -399,11 +347,6 @@ } } }, - "containsUserName": "Coinníonn sé ainm úsáideora", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "configureChat": "Cumraigh comhrá", "@configureChat": { "type": "String", @@ -462,11 +405,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Teachtaireachtaí bota", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "blocked": "Bactha", "@blocked": { "type": "String", @@ -653,11 +591,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Cuir isteach do fhreastalaí baile", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "emoteInvalid": "Gearrchód emote neamhbhailí!", "@emoteInvalid": { "type": "String", @@ -763,7 +696,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Cuireadh comhrá leis an spás seo", "chatBackupDescription": "Tá do theachtaireachtaí slán le heochair aisghabhála. Déan cinnte nach gcaillfidh tú í.", "@chatBackupDescription": { "type": "String", @@ -917,11 +849,6 @@ "type": "String", "placeholders": {} }, - "containsDisplayName": "Coinníonn sé ainm taispeána", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "commandHint_plain": "Seol téacs neamhfhoirmithe", "@commandHint_plain": { "type": "String", @@ -982,21 +909,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "Marcáil Léite/Neamhléite", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Scoránaigh mar ciúnaithe", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleFavorite": "Scoránaigh mar ceann is fearr leat", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "theyMatch": "Tá siad céanna", "@theyMatch": { "type": "String", @@ -1032,16 +944,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Seol greamán", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "sendOriginal": "Seol an bunchóip", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendMessages": "Seol teachtaireachtaí", "@sendMessages": { "type": "String", @@ -1082,11 +984,6 @@ "type": "String", "placeholders": {} }, - "removeDevice": "Bain gléas", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "redactMessage": "Bain teachtaireacht amach", "@redactMessage": { "type": "String", @@ -1102,11 +999,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Roghnaigh le do thoil", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "play": "Seinn {fileName}", "@play": { "type": "String", @@ -1151,11 +1043,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Athruithe ball", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "loadMore": "Lódáil níos mó…", "@loadMore": { "type": "String", @@ -1256,16 +1143,6 @@ "type": "String", "placeholders": {} }, - "connect": "Ceangail", - "@connect": { - "type": "String", - "placeholders": {} - }, - "confirm": "Dearbhaigh", - "@confirm": { - "type": "String", - "placeholders": {} - }, "close": "Dún", "@close": { "type": "String", @@ -1472,11 +1349,6 @@ } } }, - "goToTheNewRoom": "Téigh go dtí an seomra nua", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Earráid maidir le suíomh a fháil: {error}", "@errorObtainingLocation": { "type": "String", @@ -1515,11 +1387,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Caithfidh tú gearrchód straoiseoige agus íomhá a roghnú!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emotePacks": "Pacáistí straoiseoige don seomra", "@emotePacks": { "type": "String", @@ -1575,18 +1442,6 @@ } } }, - "badServerVersionsException": "Tá na leaganacha sonraíochta seo ar fáil faoin freastalaí baile:\n{serverVersions}\nAch níl ach na ceann seo ar fáil faoin aip seo {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "badServerLoginTypesException": "Tá na cineálacha logála isteach seo ar fáil faoin freastalaí baile:\n{serverVersions}\nAch níl ach na ceann seo ar fáil faoin aip seo:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "String", @@ -1687,15 +1542,6 @@ } } }, - "unreadChats": "{unreadCount, plural, =1{1 comhrá neamhléite} other{{unreadCount} comhráite neamhléite}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "unknownEncryptionAlgorithm": "Algartam criptithe anaithnid", "@unknownEncryptionAlgorithm": { "type": "String", @@ -1742,21 +1588,6 @@ } } }, - "setPermissionsLevel": "Socraigh leibhéal ceadanna", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Socraigh nasc cuiridh", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setCustomEmotes": "Socraigh straoiseoga saincheaptha", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Socraigh mar phríomh-ailias", "@setAsCanonicalAlias": { "type": "String", @@ -1930,11 +1761,6 @@ } } }, - "notificationsEnabledForThisAccount": "Fógraí cumasaithe don chuntas seo", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "noRoomsFound": "Níor aimsíodh aon seomraí…", "@noRoomsFound": { "type": "String", @@ -1945,11 +1771,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Tabhair cuireadh dom", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "weSentYouAnEmail": "Sheolamar ríomhphost chugat", "@weSentYouAnEmail": { "type": "String", @@ -2039,11 +1860,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Sínigh Aonair ar", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "sentAnAudio": "🎤 sheol {username} fuaim", "@sentAnAudio": { "type": "String", @@ -2071,15 +1887,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Le feiceáil ag {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "roomHasBeenUpgraded": "Uasghrádaíodh an seomra", "@roomHasBeenUpgraded": { "type": "String", @@ -2099,14 +1906,8 @@ "description": "Usage hint for the command /clearcache" }, "videoCallsBetaWarning": "Tabhair faoi deara go bhfuil físglaonna i béite. B'fhéidir nach bhfeidhmíonn siad ar gach ardán chomh atá súil aige ná ar bith.", - "emailOrUsername": "Ríomhphost nó ainm úsáideora", "repeatPassword": "Scríobh an pasfhocal arís", "yourChatBackupHasBeenSetUp": "Bunaíodh do chúltaca comhrá.", - "openVideoCamera": "Oscail físcheamara", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "fileHasBeenSavedAt": "Sábháladh an comhad ag {path}", "@fileHasBeenSavedAt": { "type": "String", @@ -2118,12 +1919,9 @@ }, "editBundlesForAccount": "Cuir cuachta in eagar don chuntas seo", "globalChatId": "Aitheantas comhrá domhanda", - "hideMemberChangesInPublicChatsBody": "Ná taispeáin san amlíne comhrá má théann duine isteach i gcomhrá poiblí nó má fhágann sé nó sí é chun inléiteacht a fheabhsú.", - "pleaseEnterRecoveryKey": "Cuir isteach d'eochair athshlánaithe le do thoil:", "sender": "Seoltóir", "noOneCanJoin": "Ní féidir le duine ar bith páirt a ghlacadh", "noOtherDevicesFound": "Níor aimsíodh aon ghléas eile", - "profileNotFound": "Níorbh fhéidir an t-úsáideoir a aimsiú ar an bhfreastalaí. B'fhéidir go bhfuil fadhb nasctha ann nó nach bhfuil an t-úsáideoir ann.", "inviteGroupChat": "📨 Cuireadh chuig comhrá grúpa", "knocking": "Cnagadh", "addChatOrSubSpace": "Cuir comhrá nó fo-spás leis", @@ -2159,9 +1957,7 @@ } } }, - "addToSpaceDescription": "Roghnaigh spás chun an comhrá seo a chur leis.", "markAsRead": "Marcáil mar léite", - "enterRoom": "Iontráil seomra", "deviceKeys": "Eochracha gléis:", "allSpaces": "Gach spás", "searchForUsers": "Cuardaigh @users...", @@ -2192,41 +1988,17 @@ "unbanUserDescription": "Beidh an t-úsáideoir in ann dul isteach sa chomhrá arís má dhéanann siad iarracht.", "pleaseEnterYourCurrentPassword": "Iontráil do phasfhocal reatha le do thoil", "newPassword": "Pasfhocal nua", - "subspace": "Fospás", - "decline": "Meath", - "forwardMessageTo": "Seol teachtaireacht ar aghaidh chuig {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "Seol admhálacha léite", "formattedMessagesDescription": "Taispeáin ábhar saibhir teachtaireachta cosúil le téacs trom ag baint úsáide as marcáil síos.", "verifyOtherUser": "🔐 Fíoraigh úsáideoir eile", - "dehydrateTorLong": "Maidir le húsáideoirí TOR, moltar an seisiún a onnmhairiú roimh dhúnadh an fhuinneog.", - "numChats": "Comhráite {number}", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "hidePresences": "Folaigh Liosta Stádais?", "jump": "Léim", "reportErrorDescription": "😭 Ó, a mhac go deo. Chuaigh rud éigin mícheart. Más mian leat, is féidir leat an fabht seo a thuairisciú do na forbróirí.", - "setTheme": "Socraigh téama:", "invalidInput": "Ionchur neamhbhailí!", "kickUserDescription": "Ciceáiltear an t-úsáideoir as an gcomhrá ach níl cosc air. I gcomhráite poiblí, is féidir leis an úsáideoir teacht ar ais ag am ar bith.", - "startConversation": "Tosaigh comhrá", "commandHint_sendraw": "Seol json amh", "leaveEmptyToClearStatus": "Fág folamh chun do stádas a ghlanadh.", "pleaseChooseAStrongPassword": "Roghnaigh pasfhocal láidir", - "publicLink": "Nasc poiblí", "joinSpace": "Glac páirt sa spás", "initAppError": "Tharla earráid agus an feidhmchlár á thosú", "requestedKeyVerification": "D'iarr {sender} fíorú eochrach", @@ -2241,8 +2013,6 @@ "incomingMessages": "Teachtaireachtaí isteach", "transparent": "Trédhearcach", "voiceCall": "Glao gutha", - "widgetVideo": "Físeán", - "errorAddingWidget": "Earráid agus an ghiuirléid á cur leis.", "emojis": "Emojis", "reportUser": "Déan tuairisc ar úsáideoir", "custom": "Saincheaptha", @@ -2260,7 +2030,6 @@ "newGroup": "Grúpa nua", "newSpace": "Spás nua", "confirmMatrixId": "Deimhnigh d’ID Maitrís chun do chuntas a scriosadh.", - "hideMemberChangesInPublicChats": "Cuir athruithe ball i gcomhráite poiblí i bhfolach", "confirmEventUnpin": "An bhfuil tú cinnte an t-imeacht a dhíphionnáil go buan?", "hugContent": "Tugann {senderName} barróg duit", "@hugContent": { @@ -2273,37 +2042,12 @@ }, "unread": "Neamhléite", "noChatsFoundHere": "Níor aimsíodh aon chomhrá anseo fós. Cuir tús le comhrá nua le duine éigin tríd an gcnaipe thíos a úsáid. ⤵️", - "separateChatTypes": "Comhráite Díreacha agus Grúpaí ar Leith", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "videoWithSize": "Físeán ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "messageInfo": "Eolas teachtaireachta", "messageType": "Cineál Teachtaireachta", "pleaseEnterRecoveryKeyDescription": "Chun do sheanteachtaireachtaí a dhíghlasáil, cuir isteach d'eochair athshlánaithe a gineadh i seisiún eile. NÍ do phasfhocal í d'eochair athshlánaithe.", "openChat": "Oscail Comhrá", "unsupportedAndroidVersionLong": "Éilíonn an ghné seo leagan Android níos nuaí. Seiceáil le haghaidh nuashonruithe nó tacaíocht Lineage OS.", "experimentalVideoCalls": "Glaonna físe turgnamhacha", - "switchToAccount": "Athraigh go cuntas {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "addWidget": "Cuir giuirléid leis", - "widgetUrlError": "Ní URL bailí é seo.", "invitedBy": "📩 Cuireadh ó {user}", "@invitedBy": { "placeholders": { @@ -2328,14 +2072,6 @@ } } }, - "userWouldLikeToChangeTheChat": "Ba mhaith le {user} páirt a ghlacadh sa chomhrá.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "knock": "Cnoc Mhuire", "storeInSecureStorageDescription": "Stóráil an eochair aisghabhála i stóráil slán an ghléis seo.", "countFiles": "Comhaid {count}", @@ -2348,12 +2084,6 @@ }, "foregroundServiceRunning": "Tá an fógra seo le feiceáil nuair atá an tseirbhís tulra ag rith.", "screenSharingDetail": "Tá do scáileán á roinnt agat i FuffyChat", - "callingPermissions": "Ceadanna a ghlaoch", - "callingAccount": "Cuntas ag glaoch", - "callingAccountDetails": "Ceadaíonn FluffyChat an aip dhiailiú android dúchais a úsáid.", - "appearOnTopDetails": "Ceadaíonn sé don aip a bheith ar bharr (ní gá má tá socrú Fluffychat agat cheana féin mar chuntas glao)", - "otherCallingPermissions": "Micreafón, ceamara agus ceadanna FluffyChat eile", - "hideUnimportantStateEvents": "Folaigh imeachtaí stáit gan tábhacht", "disableEncryptionWarning": "Ar chúiseanna slándála ní féidir leat criptiú a dhíchumasú i gcomhrá, áit ar cumasaíodh é roimhe seo.", "sorryThatsNotPossible": "Tá brón orm... nach féidir a dhéanamh", "reopenChat": "Comhrá a athoscailt", @@ -2370,18 +2100,6 @@ "jumpToLastReadMessage": "Léim go dtí an teachtaireacht léite is déanaí", "readUpToHere": "Léigh suas go dtí seo", "openLinkInBrowser": "Oscail nasc sa bhrabhsálaí", - "signInWithPassword": "Sínigh isteach le pasfhocal", - "pleaseTryAgainLaterOrChooseDifferentServer": "Bain triail eile as níos déanaí nó roghnaigh freastalaí eile.", - "signInWith": "Sínigh isteach le:", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "invitePrivateChat": "📨 Cuireadh chuig comhrá príobháideach", "wrongPinEntered": "Tháinig biorán mícheart isteach! Bain triail eile as i {seconds} soicind...", "@wrongPinEntered": { "type": "String", @@ -2425,18 +2143,6 @@ }, "passwordIsWrong": "Tá do phasfhocal iontrála mícheart", "files": "Comhaid", - "databaseBuildErrorBody": "Ní féidir bunachar sonraí SQlite a thógáil. Déanann an aip iarracht an bunachar sonraí oidhreachta a úsáid anois. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "Cailltear do sheisiún. Tuairiscigh an earráid seo do na forbróirí ag {url}. Is í an teachtaireacht earráide: {error}", "@sessionLostBody": { "type": "String", @@ -2515,9 +2221,6 @@ "changelog": "ChangelogName", "sendCanceled": "Cealaíodh seoladh", "loginWithMatrixId": "Logáil isteach le Matrix-ID", - "discoverHomeservers": "Faigh amach faoi fhreastalaithe baile", - "whatIsAHomeserver": "Cad is freastalaí baile ann?", - "homeserverDescription": "Stóráiltear do chuid sonraí go léir ar an bhfreastalaí baile, díreach cosúil le soláthraí ríomhphoist. Is féidir leat an freastalaí baile is mian leat a úsáid a roghnú, agus is féidir leat cumarsáid a dhéanamh le gach duine fós. Foghlaim níos mó ag https://matrix.org.", "calculatingFileSize": "Méid an chomhaid á ríomh...", "sendingAttachment": "Iatán á sheoladh...", "generatingVideoThumbnail": "Mionsamhail físe á cruthú...", @@ -2587,7 +2290,6 @@ "whyIsThisMessageEncrypted": "Cén fáth nach féidir an teachtaireacht seo a léamh?", "pinMessage": "Bioráin chuig an seomra", "dehydrate": "Easpórtáil seisiún agus gléas wipe", - "dehydrateTor": "Úsáideoirí TOR: Seisiún easpórtála", "commandHint_markasdm": "Marcáil mar sheomra teachtaireachta dírí don ID Maitrís tugtha", "googlyEyesContent": "Seolann {senderName} súile googly chugat", "@googlyEyesContent": { @@ -2600,11 +2302,9 @@ }, "commandHint_cuddle": "Seol cuddle", "commandHint_hug": "Seol barróg", - "startFirstChat": "Cuir tús le do chéad chomhrá", "encryptThisChat": "Criptigh an comhrá seo", "importNow": "Iompórtáil anois", "sendTypingNotifications": "Seol fógraí clóscríofa", - "addChatDescription": "Cuir cur síos ar an gcomhrá leis...", "chatPermissions": "Ceadanna comhrá", "emoteKeyboardNoRecents": "Beidh mothúcháin a úsáideadh le déanaí le feiceáil anseo ...", "@emoteKeyboardNoRecents": { @@ -2613,7 +2313,6 @@ }, "chatDescriptionHasBeenChanged": "Athraíodh cur síos ar an gcomhrá", "pushNotificationsNotAvailable": "Níl fógraí brú ar fáil", - "publish": "Foilsigh", "changeGeneralChatSettings": "Athraigh socruithe ginearálta comhrá", "sendRoomNotifications": "Seol fógraí @room", "changeTheDescriptionOfTheGroup": "Athraigh an cur síos ar an gcomhrá", @@ -2635,20 +2334,7 @@ } } }, - "countChatsAndCountParticipants": "{chats} comhrá agus {participants} rannpháirtí", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Níor aimsíodh a thuilleadh comhráite...", - "joinedChats": "Glacadh páirt i gcomhráite", "space": "Spás", "spaces": "Spásanna", "directChat": "Comhrá díreach", @@ -2666,11 +2352,6 @@ }, "recoveryKey": "Eochair athshlánaithe", "setChatDescription": "Socraigh cur síos ar an gcomhrá", - "presenceStyle": "Láithreacht:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Taispeáin teachtaireachtaí stádais ó úsáideoirí eile", "@presencesToggle": { "type": "String", @@ -2680,12 +2361,7 @@ "removeFromSpace": "Bain as spás", "placeCall": "Cuir glaoch", "unsupportedAndroidVersion": "Leagan Android gan tacaíocht", - "previousAccount": "Cuntas roimhe seo", - "widgetJitsi": "Jitsi le chéile", - "widgetCustom": "Saincheaptha", - "widgetName": "Ainm", "usersMustKnock": "Ní mór d'úsáideoirí cnag a chur ar", - "noPublicLinkHasBeenCreatedYet": "Níor cruthaíodh aon nasc poiblí go fóill", "storeSecurlyOnThisDevice": "Stóráil go daingean ar an ngléas seo", "userLevel": "{level} - Úsáideoir", "@userLevel": { @@ -2710,9 +2386,7 @@ "createGroup": "Cruthaigh grúpa", "noChatDescriptionYet": "Níl aon chur síos ar an gcomhrá cruthaithe fós.", "shareInviteLink": "Roinn an nasc cuireadh", - "notifyMeFor": "Cuir in iúl dom le haghaidh", "passwordRecoverySettings": "Socruithe athshlánaithe pasfhocal", - "widgetEtherpad": "Nóta téacs", "youKickedAndBanned": "🙅 Chiceáil tú agus chuir tú cosc ar {user}", "@youKickedAndBanned": { "placeholders": { @@ -2725,7 +2399,6 @@ "createNewAddress": "Cruthaigh seoladh nua", "groupName": "Ainm an ghrúpa", "bundleName": "Ainm an bheartáin", - "enterSpace": "Iontráil spás", "wasDirectChatDisplayName": "Comhrá folamh (bhí {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2738,7 +2411,6 @@ "oneClientLoggedOut": "Tá duine de do chliaint logáilte amach", "overview": "Forbhreathnú", "unverified": "Neamhfhíoraithe", - "widgetNameError": "Tabhair ainm taispeána, le do thoil.", "youRejectedTheInvitation": "Dhiúltaigh tú don chuireadh", "youHaveWithdrawnTheInvitationFor": "Tharraing tú siar an cuireadh do {user}", "@youHaveWithdrawnTheInvitationFor": { @@ -2748,14 +2420,6 @@ } } }, - "youInvitedToBy": "📩 Tugadh cuireadh duit trí nasc chuig:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "youInvitedUser": "📩 Thug tú cuireadh do {user}", "@youInvitedUser": { "placeholders": { @@ -2768,7 +2432,6 @@ "saveKeyManuallyDescription": "Sábháil an eochair seo de láimh trí dialóg nó gearrthaisce comhroinnte an chórais a spreagadh.", "storeInAndroidKeystore": "Stóráil i Android KeyStore", "storeInAppleKeyChain": "Stóráil i Apple KeyChain", - "appearOnTop": "Le feiceáil ar an mbarr", "newSpaceDescription": "Ligeann spásanna duit do chomhráite a chomhdhlúthú agus pobail phríobháideacha nó phoiblí a thógáil.", "chatCanBeDiscoveredViaSearchOnServer": "Is féidir comhrá a aimsiú tríd an gcuardach ar {server}", "@chatCanBeDiscoveredViaSearchOnServer": { @@ -2796,33 +2459,15 @@ "type": "String", "description": "Usage hint for the command /discardsession" }, - "allRooms": "Gach Comhrá Grúpa", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "block": "Bloc", "blockListDescription": "Is féidir leat bac a chur ar úsáideoirí atá ag cur isteach ort. Ní bheidh tú in ann teachtaireachtaí nó cuireadh seomra ar bith a fháil ó na húsáideoirí ar do liosta bloc pearsanta.", "blockUsername": "Déan neamhaird de ainm úsáideora", - "inviteContactToGroupQuestion": "Ar mhaith leat cuireadh a thabhairt do {contact} chuig an gcomhrá \"{groupName}\"?", "tryAgain": "Bain triail eile as", "optionalRedactReason": "(Roghnach) An chúis leis an teachtaireacht seo a chur in eagar...", "dehydrateWarning": "Ní féidir an gníomh seo a chealú. Cinntigh go stórálann tú an comhad cúltaca go sábháilte.", - "hydrateTor": "Úsáideoirí TOR: Iompórtáil easpórtáil seisiún", - "hydrateTorLong": "An ndearna tú do sheisiún a easpórtáil an uair dheireanach ar TOR? Iompórtáil go tapa é agus leanúint ar aghaidh ag comhrá.", "hydrate": "Athchóirigh ó chomhad cúltaca", "commandHint_googly": "Seol roinnt súile googly", "notAnImage": "Ní comhad íomhá é.", - "userRole": "Ról an úsáideora", - "minimumPowerLevel": "Is é {level} an t-íosleibhéal cumhachta.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "isReadyForKeyVerification": "Tá {sender} réidh le haghaidh fíorú eochair", "@isReadyForKeyVerification": { "type": "String", @@ -2863,9 +2508,6 @@ }, "sendReadReceiptsDescription": "Is féidir le rannpháirtithe eile i gcomhrá a fheiceáil nuair a bhíonn teachtaireacht léite agat.", "doesNotSeemToBeAValidHomeserver": "Ní cosúil gur freastalaí baile comhoiriúnach é. URL mícheart?", - "indexedDbErrorTitle": "Saincheisteanna mód príobháideach", - "indexedDbErrorLong": "Ar an drochuair níl an stóráil teachtaireachta cumasaithe sa mhód príobháideach de réir réamhshocraithe.\nTabhair cuairt le do thoil\n - faoi: config\n - socraithe dom.indexedDB.privateBrowsing.enabled go fíor\nSeachas sin, ní féidir FluffyChat a rith.", - "nextAccount": "An chéad chuntas eile", "youJoinedTheChat": "Chuaigh tú isteach sa chomhrá", "youAcceptedTheInvitation": "👍 Ghlac tú leis an gcuireadh", "screenSharingTitle": "comhroinnt scáileáin", @@ -2898,7 +2540,6 @@ } } }, - "appIntroduction": "Ligeann FluffyChat duit comhrá a dhéanamh le do chairde thar theachtairí éagsúla. Foghlaim tuilleadh ag https://matrix.org nó tapáil *Ar aghaidh*.", "appWantsToUseForLoginDescription": "Ligeann tú leis seo don aip agus don suíomh Gréasáin faisnéis a roinnt fút.", "synchronizingPleaseWaitCounter": " Ag sioncronú… ({percentage}%)", "@synchronizingPleaseWaitCounter": { @@ -2991,10 +2632,7 @@ "optionalMessage": "Teachtaireacht (Roghnach)…", "enterNewChat": "Cuir isteach comhrá nua", "commandHint_roomupgrade": "Uasghrádaigh an seomra seo go dtí an leagan seomra a thugtar", - "setCustomPermissionLevel": "Socraigh leibhéal ceadanna saincheaptha", - "setPermissionsLevelDescription": "Roghnaigh ról réamhshainithe thíos nó cuir isteach leibhéal ceadanna saincheaptha idir 0 agus 100.", "ignoreUser": "Déan neamhaird den úsáideoir", - "normalUser": "Gnáthúsáideoir", "approve": "Ceadaigh", "youHaveKnocked": "Bhuail tú", "pleaseWaitUntilInvited": "Fan anois, le do thoil, go dtí go dtabharfaidh duine éigin ón seomra cuireadh duit.", @@ -3030,10 +2668,6 @@ "longPressToRecordVoiceMessage": "Brúigh go fada chun teachtaireacht gutha a thaifeadadh.", "pause": "Sos", "resume": "Atosú", - "newSubSpace": "Fo-spás nua", - "moveToDifferentSpace": "Bog go spás difriúil", - "moveUp": "Bog suas", - "moveDown": "Bog síos", "removeFromSpaceDescription": "Bainfear an comhrá as an spás ach beidh sé fós le feiceáil i do liosta comhrá.", "countChats": "comhráite {chats}", "@countChats": { @@ -3076,7 +2710,6 @@ "startPoll": "Tosaigh pobalbhreith", "endPoll": "Deireadh leis an pobalbhreith", "answersVisible": "Freagraí le feiceáil", - "answersHidden": "Freagraí i bhfolach", "pollQuestion": "Ceist pobalbhreithe", "answerOption": "Rogha freagartha", "addAnswerOption": "Cuir rogha freagra leis", @@ -3144,7 +2777,6 @@ "logs": "Logaí", "advancedConfigs": "Cumraíochtaí Ardleibhéil", "advancedConfigurations": "Cumraíochtaí ardleibhéil", - "signInWithLabel": "Sínigh isteach le:", "signIn": "Sínigh isteach", "createNewAccount": "Cruthaigh cuntas nua", "signUpGreeting": "Tá FluffyChat díláraithe! Roghnaigh freastalaí inar mian leat do chuntas a chruthú agus déanaimis é!", @@ -3162,4 +2794,4 @@ "powerLevel": "Leibhéal cumhachta", "setPowerLevelDescription": "Sainmhíníonn leibhéil chumhachta cad a cheadaítear do bhall a dhéanamh sa seomra seo agus is gnách go mbíonn siad idir 0 agus 100.", "owner": "Úinéir" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index cc61db23..50c54302 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -129,18 +129,6 @@ } } }, - "badServerVersionsException": "O servidor soporta as seguintes características:\n{serverVersions}\nPero esta app só soporta {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Vetar na conversa", "@banFromChat": { "type": "String", @@ -173,11 +161,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Mensaxes de Bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Cancelar", "@cancel": { "type": "String", @@ -506,31 +489,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Confirmar", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Conectar", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "O contacto foi convidado ao grupo", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Contén nome público", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Contén nome de usuaria", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "O contido foi denunciado á administración do servidor", "@contentHasBeenReported": { "type": "String", @@ -610,33 +573,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Esto desactivará a conta. Esto non ten volta atrás. Estás segura?", "@deactivateAccountWarning": { "type": "String", @@ -742,11 +678,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Escribe un atallo e asocialle unha imaxe!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Conversa baleira", "@emptyChat": { "type": "String", @@ -796,11 +727,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Escribe o teu servidor de inicio", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Erro ao obter a localización: {error}", "@errorObtainingLocation": { "type": "String", @@ -850,11 +776,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Ir á nova sala", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grupo", "@group": { "type": "String", @@ -926,11 +847,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identidade", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorar", "@ignore": { "type": "String", @@ -992,11 +908,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Convite para min", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} convidoute a FluffyChat.\n1. Visita fluffychat.im e instala a app\n2. Crea unha conta ou Accede\n3. Abre a ligazón do convite: \n {link}", "@inviteText": { "type": "String", @@ -1076,11 +987,6 @@ "type": "String", "placeholders": {} }, - "license": "Licenza", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Claro", "@lightTheme": { "type": "String", @@ -1134,11 +1040,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Cambios de participantes", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Mención", "@mention": { "type": "String", @@ -1246,11 +1147,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notificacións activadas para a conta", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} usuarias están escribindo…", "@numUsersTyping": { "type": "String", @@ -1350,11 +1246,6 @@ "type": "String", "placeholders": {} }, - "people": "Persoas", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Elixe unha imaxe", "@pickImage": { "type": "String", @@ -1374,11 +1265,6 @@ } } }, - "pleaseChoose": "Por favor elixe", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Escolle un código de acceso", "@pleaseChooseAPasscode": { "type": "String", @@ -1472,11 +1358,6 @@ } } }, - "rejoin": "Volta a unirte", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Quitar", "@remove": { "type": "String", @@ -1496,11 +1377,6 @@ } } }, - "removeDevice": "Quitar dispositivo", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Retirar veto na conversa", "@unbanFromChat": { "type": "String", @@ -1556,15 +1432,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Visto por {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Enviar", "@send": { "type": "String", @@ -1599,16 +1466,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Enviar orixinal", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Enviar adhesivo", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Enviar vídeo", "@sendVideo": { "type": "String", @@ -1673,21 +1530,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Establecer emotes personalizados", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Establecer ligazón do convite", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Establecer nivel de permisos", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Establecer estado", "@setStatus": { "type": "String", @@ -1722,11 +1564,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Conexión Unificada SSO", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Saltar", "@skip": { "type": "String", @@ -1797,21 +1634,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Marcar Favorito", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Cambia Noificacións", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Marcar como Lido/Non lido", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Demasiadas solicitudes. Inténtao máis tarde!", "@tooManyRequestsWarning": { "type": "String", @@ -1878,15 +1700,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 conversa sen ler} other{{unreadCount} conversas sen ler}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} e {count} máis están escribindo…", "@userAndOthersAreTyping": { "type": "String", @@ -2011,11 +1824,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Imaxe de fondo:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Aviso!", "@warning": { "type": "String", @@ -2081,7 +1889,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Engadiuse a conversa a este espazo", "addToSpace": "Engadir ao espazo", "scanQrCode": "Escanear código QR", "sendOnEnter": "Enter para enviar", @@ -2098,7 +1905,6 @@ "time": "Hora", "sender": "Remitente", "openGallery": "Galería pública", - "addToSpaceDescription": "Elixe un espazo ao que engadir esta conversa.", "messageType": "Tipo de mensaxe", "removeFromSpace": "Retirar do espazo", "start": "Comezar", @@ -2122,21 +1928,6 @@ "type": "String", "description": "Usage hint for the command /dm" }, - "openVideoCamera": "Abrir a cámara para un vídeo", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "videoWithSize": "Vídeo ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "publish": "Publicar", "dismiss": "Desbotar", "markAsRead": "Marcar como lido", "reportUser": "Denunciar usuaria", @@ -2162,36 +1953,10 @@ "pinMessage": "Fixar na sala", "confirmEventUnpin": "Tes a certeza de querer desafixar o evento?", "experimentalVideoCalls": "Chamadas de vídeo en probas", - "emailOrUsername": "Email ou nome de usuaria", - "switchToAccount": "Cambiar á conta {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "previousAccount": "Conta anterior", - "nextAccount": "Conta seguinte", "bundleName": "Nome do feixe", - "widgetVideo": "Vídeo", - "widgetJitsi": "Jitsi Meet", - "widgetCustom": "Personalizado", - "widgetName": "Nome", - "widgetUrlError": "Non é un URL válido.", - "widgetNameError": "Escribe un nome público.", - "addWidget": "Engadir widget", - "widgetEtherpad": "Nota de texto", - "errorAddingWidget": "Erro ao engadir o widget.", "editBundlesForAccount": "Editar os feixes desta conta", "addToBundle": "Engadir ao feixe", "removeFromBundle": "Eliminar deste feixe", - "separateChatTypes": "Separar Conversas directas e Grupos", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "youRejectedTheInvitation": "Rexeitaches o convite", "youBannedUser": "Vetaches a {user}", "@youBannedUser": { @@ -2255,7 +2020,6 @@ "storeInAndroidKeystore": "Gardar en Android KeyStore", "storeInAppleKeyChain": "Gardar en Apple KeyChain", "recoveryKeyLost": "Perdeches a chave de recuperación?", - "pleaseEnterRecoveryKey": "Escribe a túa chave de recuperación:", "recoveryKey": "Chave de recuperación", "storeSecurlyOnThisDevice": "Gardar de xeito seguro no dispositivo", "pleaseEnterRecoveryKeyDescription": "Para desbloquear as mensaxes antigas, escribe a chave de recuperación creada nunha sesión existente. A chave de recuperación NON é o teu contrasinal.", @@ -2270,15 +2034,9 @@ } }, "unlockOldMessages": "Desbloquear mensaxes antigas", - "dehydrateTorLong": "Para usuarias de TOR, é recomendable exportar a sesión antes de pechar a xanela.", - "hydrateTor": "Usuarias TOR: Importar a sesión exportada", - "hydrateTorLong": "Exportaches a túa sesión a última vez en TOR? Importaa rápidamente e segue conversando.", "hydrate": "Restablecer desde copia de apoio", "dehydrateWarning": "Esta acción non é reversible. Pon coidado en gardar o ficheiro de apoio.", "dehydrate": "Exportar sesión e eliminar dispositivo", - "dehydrateTor": "Usuarias TOR: Exportar sesión", - "indexedDbErrorTitle": "Problemas no modo privado", - "indexedDbErrorLong": "A almacenaxe de mensaxes non está activada por defecto no modo privado.\nMira en\n- about:config\n- establece dom.indexedDB.privateBrowsing.enabled como true\nSe non, non é posible executar FluffyChat.", "user": "Usuaria", "custom": "Personal", "confirmMatrixId": "Confirma o teu ID Matrix para poder eliminar a conta.", @@ -2295,30 +2053,12 @@ "commandHint_markasgroup": "Marcar como grupo", "whyIsThisMessageEncrypted": "Por que non podo ler esta mensaxe?", "noKeyForThisMessage": "Pode ser que a mensaxe fose enviada antes de que ti accedeses á túa conta neste dispositivo.\n\nTamén é posible que a remitente non validase o teu dispositivo ou tamén que algo fallase na conexión a internet.\n\nPodes ler a mensaxe noutro dispositivo? Entón podes transferila desde el! Vai a Axustes > Dispositivos e comproba que tes tódolos dispositivos verificados. Entón cando abras a sala a próxima vez a sincronización realizarase e as chaves transmitiranse automáticamente.\n\nNon desexas perder as chaves cando pechas sesión ou cambias de dispositivo? Comproba nos axustes que activaches a copia de apoio das conversas.", - "appearOnTop": "Aparecer arriba", - "otherCallingPermissions": "Micrófono, cámara e outros permisos para FluffyChat", "newGroup": "Novo grupo", "newSpace": "Novo espazo", "foregroundServiceRunning": "Esta notificación aparece cando se está a executar o servizo en segundo plano.", "screenSharingTitle": "compartición da pantalla", - "callingPermissions": "Permisos de chamada", - "callingAccount": "Conta que chama", - "callingAccountDetails": "Permítelle a FluffyChat usar a app de telefonía nativa de android.", - "appearOnTopDetails": "Permítelle á app aparecer por enriba (non é preciso se xa configuraches FluffyChat como unha conta para chamadas)", - "enterSpace": "Entrar no espazo", - "enterRoom": "Entrar na sala", "allSpaces": "Todos os espazos", "screenSharingDetail": "Estás a compartir a túa pantalla en FluffyChat", - "numChats": "{number} conversas", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Agochar os eventos de menor relevancia", "doNotShowAgain": "Non mostrar outra vez", "commandHint_googly": "Envía uns ollos desos grandes", "googlyEyesContent": "{senderName} enviouche uns ollos grandes", @@ -2355,7 +2095,6 @@ "sorryThatsNotPossible": "Lamentámolo... iso non é posible", "deviceKeys": "Chaves do dispositivo:", "newSpaceDescription": "Os Espazos permítenche consolidar as túas conversas e construir comunidades públicas ou privadas.", - "startFirstChat": "Abre a túa primeira conversa", "wasDirectChatDisplayName": "Conversa baleira (era {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2383,23 +2122,7 @@ "openLinkInBrowser": "Abrir ligazón no navegador", "jump": "Ir alá", "report": "informar", - "allRooms": "Todas as Conversas en grupo", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "reportErrorDescription": "😭 Vaia! Algo fallou. Se queres, podes informar do problema ás persoas desenvolvedoras.", - "signInWithPassword": "Accede con contrasinal", - "pleaseTryAgainLaterOrChooseDifferentServer": "Inténtao máis tarde ou elixe un servidor diferente.", - "signInWith": "Accede con {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "notAnImage": "Non é un ficheiro de imaxe.", "importNow": "Importar agora", "importEmojis": "Importar Emojis", @@ -2409,11 +2132,8 @@ "sendTypingNotifications": "Permitir ver que estás escribindo", "createGroup": "Crear grupo", "messagesStyle": "Mensaxes:", - "profileNotFound": "Non se atopa a usuaria no servidor. Pode que haxa un problema coa conexión ou que a usuaria non exista.", "shareInviteLink": "Comparte ligazón de convite", "setColorTheme": "Cor do decorado:", - "setTheme": "Establecer decorado:", - "inviteContactToGroupQuestion": "Queres convidar a {contact} para que se una á conversa \"{groupName}\"?", "tryAgain": "Intentar outra vez", "optionalRedactReason": "(Optativo) Razón para editar a mensaxe...", "redactedBy": "Editada por {username}", @@ -2439,7 +2159,6 @@ }, "redactMessageDescription": "A mensaxe vai ser editada para todas as participantes na conversa. Non ten volta atrás.", "invite": "Convidar", - "addChatDescription": "Engadir descrición da conversa...", "chatPermissions": "Permisos da conversa", "chatDescription": "Descrición da conversa", "chatDescriptionHasBeenChanged": "Cambiou a descrición da conversa", @@ -2448,7 +2167,6 @@ "directChat": "Conversa Directa", "setChatDescription": "Escribir descrición da conversa", "inviteGroupChat": "📨 Convidar a conversa en grupo", - "invitePrivateChat": "📨 Convidar a conversa privada", "emoteKeyboardNoRecents": "Os emotes usados recentemente aparecerán aquí...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2496,7 +2214,6 @@ "yourGlobalUserIdIs": "O teu ID-usuaria global é: ", "groupName": "Nome do grupo", "searchChatsRooms": "Buscar #conversas, @usuarias...", - "startConversation": "Iniciar conversa", "commandHint_sendraw": "Enviar json sen editar", "wrongRecoveryKey": "Desculpa... non semella ser o xeito correcto de recuperar a chave.", "blockListDescription": "Podes bloquear usuarias que che molesten. Non recibirás mensaxes nin convites para salas procedentes das usuarias da túa lista persoal de bloqueo.", @@ -2507,12 +2224,9 @@ "publicSpaces": "Espazos públicos", "passwordIsWrong": "O contrasinal escrito non é correcto", "pleaseEnterYourCurrentPassword": "Escribe o contrasinal actual", - "publicLink": "Ligazón pública", "nothingFound": "Non atopamos nada...", - "decline": "Desbotar", "newPassword": "Novo contrasinal", "passwordsDoNotMatch": "Os contrasinais non concordan", - "subspace": "Subespazo", "select": "Escolle", "pleaseChooseAStrongPassword": "Elixe un contrasinal forte", "addChatOrSubSpace": "Engadir charla ou sub espazo", @@ -2521,18 +2235,6 @@ "searchForUsers": "Buscar @persoas...", "databaseMigrationTitle": "Base de datos optimizada", "databaseMigrationBody": "Agarda, podería levarnos un pouco.", - "databaseBuildErrorBody": "Non se puido crear a base de datos SQlite. A app intentará usar a base de datos clásica. Por favor informa deste fallo ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "initAppError": "Houbo un fallo ao iniciar a app", "sessionLostBody": "Estragouse a túa sesión. Por favor informa deste fallo ás desenvolvedoras en {url}. A mensaxe do erro é: {error}", "@sessionLostBody": { @@ -2558,14 +2260,6 @@ } } }, - "youInvitedToBy": "📩 Convidáronte cunha ligazón a:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "transparent": "Transparente", "sendReadReceipts": "Enviar confirmación de lectura", "sendReadReceiptsDescription": "Outras participantes na conversa poden ver cando liches unha mensaxe.", @@ -2591,15 +2285,6 @@ } } }, - "forwardMessageTo": "Reenviar a mensaxe a {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendTypingNotificationsDescription": "As outras participantes da conversa poden ver cando estás a escribir unha mensaxe.", "formattedMessagesDescription": "Mostrar texto enriquecido nas mensaxes como letra grosa usando markdown.", "verifyOtherUserDescription": "Se verificas a outra usuaria, podes ter a certeza de que sabes con quen estás a conversar. 💪\n\nAo iniciar a verificación, ti mais a outra usuaria veredes unha xanela emerxente na app onde aparecerán varios emojis ou números que teredes que comparar entre vós.\n\nO mellor xeito de facelo é en persoa o cunha chamada de vídeo. 👭", @@ -2639,11 +2324,6 @@ } } }, - "presenceStyle": "Presenza:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "hidePresences": "Agochar Lista de estados?", "presencesToggle": "Mostra mensaxes de estado de outras usuarias", "@presencesToggle": { @@ -2675,18 +2355,7 @@ "hideRedactedMessages": "Agochar mensaxes editadas", "hideRedactedMessagesBody": "Se alguén corrixe unha mensaxe entón esta xa non será visible na charla.", "hideInvalidOrUnknownMessageFormats": "Agochar formatos de mensaxe non válidos ou descoñecidos", - "hideMemberChangesInPublicChats": "Agochar cambios dos membros nas charlas públicas", - "notifyMeFor": "Notificarme sobre", - "hideMemberChangesInPublicChatsBody": "Non mostrar na cronoloxía se alguén se une ou deixa unha conversa pública, para mellorar a lexibilidade.", "usersMustKnock": "As usuarias teñen que pedir entrar", - "userWouldLikeToChangeTheChat": "{user} quere unirse á charla.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "knocking": "A solicitar", "chatCanBeDiscoveredViaSearchOnServer": "A charla pode ser atopada ao buscar en {server}", "@chatCanBeDiscoveredViaSearchOnServer": { @@ -2703,7 +2372,6 @@ "customEmojisAndStickersBody": "Engade ou comparte emojis personais e adhesivos que poden usarse nas charlas.", "overview": "Vista xeral", "passwordRecoverySettings": "Axustes de recuperación do contrasinal", - "noPublicLinkHasBeenCreatedYet": "Aínda non se creou unha ligazón pública", "knock": "Solicitar acceso", "noOneCanJoin": "Ninguén pode unirse", "thereAreCountUsersBlocked": "Agora mesmo hai {count} usuarias bloqueadas.", @@ -2712,16 +2380,6 @@ "count": {} }, "publicChatAddresses": "Enderezos públicos da charla", - "userRole": "Rol da usuaria", - "minimumPowerLevel": "{level} é o nivel mínimo de responsabilidade.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchIn": "Buscar na conversa \"{chat}\"...", "@searchIn": { "type": "String", @@ -2742,19 +2400,6 @@ "description": "Set to true to always display time of day in 24 hour format." }, "noMoreChatsFound": "Non se atopan máis charlas…", - "joinedChats": "Charlas nas que participas", - "countChatsAndCountParticipants": "{chats} charlas e {participants} participantes", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "unread": "Sen ler", "space": "Espazo", "spaces": "Espazos", @@ -2819,10 +2464,7 @@ }, "sendCanceled": "Cancelouse o envío", "noChatsFoundHere": "Aínda non hai conversas. Comeza a conversar con alguén premendo no botón de abaixo. ⤵️", - "discoverHomeservers": "Atopar servidores", - "whatIsAHomeserver": "Que é un servidor de inicio?", "loginWithMatrixId": "Acceder co ID-Matrix", - "homeserverDescription": "Todos os teus datos quedan gardados no servidor de inicio, igual que co teu provedor de correo electrónico. Podes elexir o servidor que queres usar e poderás comunicarte con todos os demais. Aprende máis en https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "Non semella ser un servidor de inicio compatible. É o URL correcto?", "calculatingFileSize": "Calculando o tamaño do ficheiro…", "prepareSendingAttachment": "Preparando o envío…", @@ -2966,7 +2608,6 @@ "crossVerifiedDevices": "Dispositivos verificados", "verifiedDevicesOnly": "Só dispositivos verificados", "waitingForServer": "Agardando polo servidor…", - "appIntroduction": "FluffyChat permíteche laretar coas túas amizades entre diferentes mensaxerías. Coñece máis en https://matrix.org ou toca en *Continuar*.", "notificationRuleMasterDescription": "Sobrescribe todas as outras regras e desactiva todas as notificacións.", "appWantsToUseForLoginDescription": "Por tanto permites que a app e o sitio web compartan información sobre ti.", "notificationRuleMemberEventDescription": "Suprime as notificacións dos eventos de participación.", @@ -2985,10 +2626,7 @@ "recordAVideo": "Gravar vídeo", "enterNewChat": "Entrar na nova conversa", "commandHint_roomupgrade": "Actualizar esta sala á versión de sala indicada", - "setCustomPermissionLevel": "Establecer nivel personalizado dos permisos", - "setPermissionsLevelDescription": "Elixe un rol predefinido dos indicados ou escribe un nivel personalizado entre 0 e 100.", "ignoreUser": "Ignorar usuaria", - "normalUser": "Usuaria corrente", "approve": "Aprobar", "pleaseWaitUntilInvited": "Agora agarda a que alguén da sala te convide a entrar.", "youHaveKnocked": "Petaches á porta", @@ -3024,10 +2662,6 @@ "longPressToRecordVoiceMessage": "Pulsación longa para gravar mensaxe de voz.", "pause": "Deter", "resume": "Continuar", - "newSubSpace": "Novo sub espazo", - "moveToDifferentSpace": "Mover a outro espazo", - "moveUp": "Mover arriba", - "moveDown": "Mover abaixo", "removeFromSpaceDescription": "Vaise quitar a conversa do espazo pero seguirá aparecendo na túa lista de conversas.", "countChats": "{chats} conversas", "@countChats": { @@ -3070,7 +2704,6 @@ "startPoll": "Publicar enquisa", "endPoll": "Finalizar enquisa", "answersVisible": "Resultados visibles", - "answersHidden": "Non se ven os resultados", "pollQuestion": "Pregunta da enquisa", "answerOption": "Opción de resposta", "addAnswerOption": "Engadir opción", @@ -3138,7 +2771,6 @@ "logs": "Rexistros", "advancedConfigs": "Axustes avanzados", "advancedConfigurations": "Configuracións avanzadas", - "signInWithLabel": "Acceder con:", "signIn": "Acceder", "createNewAccount": "Crear nova conta", "signUpGreeting": "FluffyChat é descentralizada! Elixe un servidor para crear a conta e xa podes utilizar a app!", @@ -3156,4 +2788,4 @@ "powerLevel": "Nivel responsabilidade", "setPowerLevelDescription": "Os niveis de responsabilidade definen o que pode facer unha usuaria na sala, normalmente varía de 0 a 100.", "owner": "Propietaria" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_he.arb b/lib/l10n/intl_he.arb index 28f27b10..027bf04a 100644 --- a/lib/l10n/intl_he.arb +++ b/lib/l10n/intl_he.arb @@ -194,18 +194,6 @@ "type": "String", "placeholder": {} }, - "badServerVersionsException": "שרת הבית תומך בגרסאות:\n{serverVersions}\nאבל האפליקציה הזו תומכת רק ב-{supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "צאט חסום", "@banFromChat": { "type": "String", @@ -233,11 +221,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "הודעות בוט", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cantOpenUri": "לא ניתן לפתוח את ה-URI {uri}", "@cantOpenUri": { "type": "String", @@ -451,8 +434,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "צ'אט נוסף למרחב הזה", - "@chatHasBeenAddedToThisSpace": {}, "chats": "צ'אטים", "@chats": { "type": "String", @@ -532,18 +513,6 @@ } } }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "defaultPermissionLevel": "רמת הרשאת ברירת מחדל", "@defaultPermissionLevel": { "type": "String", @@ -614,11 +583,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "הזן את שרת הבית שלך", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "הכל מוכן!", "@everythingReady": { "type": "String", @@ -654,11 +618,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "עבור לחדר החדש", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "groupIsPublic": "הקבוצה ציבורית", "@groupIsPublic": { "type": "String", @@ -688,11 +647,6 @@ "type": "String", "placeholders": {} }, - "identity": "זהות", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignoredUsers": "משתמשים שהתעלמו מהם", "@ignoredUsers": { "type": "String", @@ -730,11 +684,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "הזמנה בשבילי", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} הזמין אותך ל-FluffyChat.\n1. התקן את FluffyChat: https://fluffychat.im\n2. הירשם או היכנס\n3. פתח את קישור ההזמנה: {link}", "@inviteText": { "type": "String", @@ -849,11 +798,6 @@ "type": "String", "description": "Usage hint for the command /react" }, - "containsUserName": "מכיל שם משתמש", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "createNewSpace": "חלל חדש", "@createNewSpace": { "type": "String", @@ -873,21 +817,6 @@ } } }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "פעולה זו תשבית את חשבון המשתמש שלך. אי אפשר לבטל את זה! האם אתה בטוח?", "@deactivateAccountWarning": { "type": "String", @@ -1009,11 +938,6 @@ "type": "String", "placeholders": {} }, - "license": "רשיון", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "בהיר", "@lightTheme": { "type": "String", @@ -1034,26 +958,11 @@ "type": "String", "placeholders": {} }, - "confirm": "לאשר", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "התחבר", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "איש הקשר הוזמן לקבוצה", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "מכיל שם תצוגה", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "התוכן דווח למנהלי השרת", "@contentHasBeenReported": { "type": "String", @@ -1259,11 +1168,6 @@ "type": "String", "placeholders": {} }, - "people": "אנשים", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "בחר תמונה", "@pickImage": { "type": "String", @@ -1278,11 +1182,6 @@ } } }, - "pleaseChoose": "אנא בחר", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "אנא בחר קוד גישה", "@pleaseChooseAPasscode": { "type": "String", @@ -1345,11 +1244,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "התראות הופעלו עבור חשבון זה", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "bundleName": "שם החבילה", "@bundleName": {}, "offline": "לא מקוון", @@ -1357,11 +1251,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "פתח את המצלמה לסרטון", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "removeFromBundle": "הסר מחבילה זו", "@removeFromBundle": {}, "enableMultiAccounts": "(בטא) אפשר ריבוי חשבונות במכשיר זה", @@ -1406,11 +1295,6 @@ } } }, - "memberChanges": "שינויים בחבר", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "הזכיר", "@mention": { "type": "String", @@ -1432,4 +1316,4 @@ "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_hi.arb b/lib/l10n/intl_hi.arb index b67c4d96..aaa31e9d 100644 --- a/lib/l10n/intl_hi.arb +++ b/lib/l10n/intl_hi.arb @@ -10,10 +10,7 @@ "importEmojis": "इमोजी आयात करें", "notAnImage": "कोई छवि फ़ाइल नहीं।", "importNow": "अभी आयात करें", - "setCustomPermissionLevel": "अपना अनुमति स्तर निर्धारित करें", - "setPermissionsLevelDescription": "कृपया नीचे दी गई भूमिका चुनें या 0 से 100 के बीच अपनी कस्टम अनुमति स्तर दर्ज करें।", "ignoreUser": "उपयोगकर्ता को नजरअंदाज करें", - "normalUser": "सामान्य उपयोगकर्ता", "replace": "बदलें", "about": "हमारे बारे में", "aboutHomeserver": "{homeserver} की जानकारी", @@ -67,6 +64,5 @@ "type": "String" } } - }, - "addChatDescription": "चैट का विवरण जोड़ें..।" -} + } +} \ No newline at end of file diff --git a/lib/l10n/intl_hr.arb b/lib/l10n/intl_hr.arb index 936e2fa7..e2132063 100644 --- a/lib/l10n/intl_hr.arb +++ b/lib/l10n/intl_hr.arb @@ -119,18 +119,6 @@ } } }, - "badServerVersionsException": "Homeserver podržava verzije specifikacije:\n{serverVersions}\nMeđutim ovaj program podržava samo {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Isključi iz chata", "@banFromChat": { "type": "String", @@ -163,11 +151,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Poruke bota", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Odustani", "@cancel": { "type": "String", @@ -496,31 +479,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Potvrdi", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Spoji", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt je pozvan u grupu", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Sadržava prikazano ime", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Sadrži korisničko ime", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Sadržaj je prijavljen administratorima servera", "@contentHasBeenReported": { "type": "String", @@ -600,33 +563,6 @@ } } }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Ovo će nepovratno deaktivirati tvoj korisnički račun. Stvarno to želiš?", "@deactivateAccountWarning": { "type": "String", @@ -732,11 +668,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Moraš odabrati jednu kraticu emotikona i sliku!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Prazan chat", "@emptyChat": { "type": "String", @@ -786,11 +717,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Upiši svoj homeserver", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "Sve je spremno!", "@everythingReady": { "type": "String", @@ -831,11 +757,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Idi u novu sobu", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grupiraj", "@group": { "type": "String", @@ -907,11 +828,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identitet", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Zanemari", "@ignore": { "type": "String", @@ -973,11 +889,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Poziv za mene", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} te je pozvao/la u FluffyChat. \n1. Posjeti strnicu fluffychat.im i instaliraj aplikaciju \n2. Registriraj ili prijavi se \n3. Otvori poveznicu poziva: \n {link}", "@inviteText": { "type": "String", @@ -1057,11 +968,6 @@ "type": "String", "placeholders": {} }, - "license": "Licenca", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Svijetla", "@lightTheme": { "type": "String", @@ -1105,11 +1011,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Promjene člana", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Spominjanje", "@mention": { "type": "String", @@ -1200,11 +1101,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Obavijesti su aktivirane za ovaj račun", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} korisnika tipkaju …", "@numUsersTyping": { "type": "String", @@ -1294,11 +1190,6 @@ "type": "String", "placeholders": {} }, - "people": "Ljudi", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Odaberi sliku", "@pickImage": { "type": "String", @@ -1318,11 +1209,6 @@ } } }, - "pleaseChoose": "Odaberi", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Odaberi lozinku", "@pleaseChooseAPasscode": { "type": "String", @@ -1416,11 +1302,6 @@ } } }, - "rejoin": "Ponovo se pridruži", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Ukloni", "@remove": { "type": "String", @@ -1440,11 +1321,6 @@ } } }, - "removeDevice": "Ukloni uređaj", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Ponovo uključi u chat", "@unbanFromChat": { "type": "String", @@ -1500,15 +1376,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Viđeno od {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Pošalji", "@send": { "type": "String", @@ -1543,16 +1410,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Pošalji original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Pošalji naljepnicu", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Pošalji video datoteku", "@sendVideo": { "type": "String", @@ -1617,21 +1474,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Postavi prilagođene emotikone", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Pošalji poveznicu poziva", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Postavi razinu dozvola", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Postavi stanje", "@setStatus": { "type": "String", @@ -1661,11 +1503,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Jednokratna prijava", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Preskoči", "@skip": { "type": "String", @@ -1736,21 +1573,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Uklj/Isklj favorite", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Uklj/Isklj isključene", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Označi kao pročitano/nepročitano", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Previše zahtjeva. Pokušaj ponovo kasnije!", "@tooManyRequestsWarning": { "type": "String", @@ -1817,15 +1639,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 nepročitan chat} few{{unreadCount} nepročitana chata} other{{unreadCount} nepročitanih chatova}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} i još {count} korisnika tipkaju …", "@userAndOthersAreTyping": { "type": "String", @@ -1950,11 +1763,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Pozadina:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Upozorenje!", "@warning": { "type": "String", @@ -2076,7 +1884,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Chat je dodan u ovaj prostor", "addToSpace": "Dodaj u prostor", "serverRequiresEmail": "Za registraciju ovaj server mora potvrditi tvoju e-mail adresu.", "scanQrCode": "Snimi QR kod", @@ -2099,7 +1906,6 @@ "openGallery": "Otvori galeriju", "time": "Vrijeme", "removeFromSpace": "Ukloni iz prostora", - "addToSpaceDescription": "Odaberi prostor kojem će se ovaj chat dodati.", "start": "Početak", "commandHint_clearcache": "Isprazni predmemoriju", "@commandHint_clearcache": { @@ -2121,44 +1927,12 @@ "type": "String", "description": "Usage hint for the command /dm" }, - "openVideoCamera": "Otvori kameru za video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "publish": "Objavi", "markAsRead": "Označi kao pročitano", "reportUser": "Prijavi korisnika", "openChat": "Otvori chat", "dismiss": "Odbaci", "unsupportedAndroidVersion": "Nepodržana Android verzija", - "widgetVideo": "Video", - "widgetEtherpad": "Tekstna bilješka", - "widgetCustom": "Prilagođeno", - "widgetName": "Ime", - "widgetUrlError": "Ovo nije valjan URL.", - "switchToAccount": "Prijeđi na račun {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Sljedeći račun", - "emailOrUsername": "E-mail adresa ili korisničko ime", "unsupportedAndroidVersionLong": "Ova funkcija zahtijeva noviju verziju Androida. Provjeri, postoje li nove verzije ili podrška za Lineage OS.", - "previousAccount": "Prethodni račun", "recoveryKey": "Ključ za obnavljanje", "recoveryKeyLost": "Izgubio/la si ključ za obnavljanje?", "youKickedAndBanned": "🙅 Izbacio/la i isključio/la si korisnika {user}", @@ -2170,10 +1944,7 @@ } }, "dehydrateWarning": "Ovo je nepovratna radnja. Spremi datoteku sigurnosne kopije na sigurno mjesto.", - "hydrateTor": "Korisnici TOR-a: Uzvezite izvoz sesije", - "dehydrateTor": "Korisnici TOR-a: izvezite sesiju", "emojis": "Emojiji", - "indexedDbErrorLong": "Spremište poruka nažalost nije standarno uključena u privatnom modusu.\nOtvori stranicu\n - about:config\n - postavi dom.indexedDB.privateBrowsing.enabled na true\nFluffyChat se inače neće moći pokrenuti.", "storeSecurlyOnThisDevice": "Spremi sigurno na ovom uređaju", "countFiles": "Broj datoteka: {count}", "@countFiles": { @@ -2201,11 +1972,7 @@ "placeCall": "Nazovi", "videoCallsBetaWarning": "Napominjemo da se funkcija videopoziva trenutačno nalazi u beta stanju. Možda neće raditi ispravno ili uopće neće raditi na svim platformama.", "experimentalVideoCalls": "Eksperimentalni videopozivi", - "widgetJitsi": "Jitsi Meet", - "addWidget": "Dodaj widget", - "widgetNameError": "Zadaj prikazno ime.", "youRejectedTheInvitation": "Odbio/la si poziv", - "errorAddingWidget": "Greška prilikom dodavanja widgeta.", "youJoinedTheChat": "Pridružio/la si se chatu", "youAcceptedTheInvitation": "👍 Prihvatio/la si poziv", "youHaveWithdrawnTheInvitationFor": "Povukao/la si poziv za korisnika {user}", @@ -2253,18 +2020,9 @@ "storeInSecureStorageDescription": "Ključ za obnavljanje spremi u sigurno spremište na ovom uređaju.", "saveKeyManuallyDescription": "Spremi ovaj ključ ručno pokretanjem dijaloga za dijeljenje sustava ili međuspremnika.", "storeInAndroidKeystore": "Spremi u Android KeyStore", - "separateChatTypes": "Zasebni izravni chatovi i grupe", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "dehydrateTorLong": "Korisnicima TOR-a se preporučuje izvoz sesije prije zatvaranja prozora.", - "hydrateTorLong": "Je li zadnji izvoz sesije bio na TOR-u? Brzo ga uvezi i nastavi razgovarati.", "hydrate": "Obnovi pomoću sigurnosne kopije", - "pleaseEnterRecoveryKey": "Upiši svoj ključ za obnavljanje:", "users": "Korisnici", "pleaseEnterRecoveryKeyDescription": "Za otključavanje starih poruka upiši ključ za obnavljanje koji je generiran u prethodnoj sesiji. Tvoj ključ za obnavljanje NIJE tvoja lozinka.", - "indexedDbErrorTitle": "Problemi u privatnom modusu", "youBannedUser": "Isključio/la si korisnika {user}", "@youBannedUser": { "placeholders": { @@ -2285,20 +2043,10 @@ } } }, - "numChats": "{number} chata", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "fileIsTooBigForServer": "Neuspjelo slanje! Server podržava samo priloge do {max}.", "jumpToLastReadMessage": "Skoči na zadnju pročitanu poruku", "commandHint_markasdm": "Označi kao sobu za izravnu razmjenu poruka za zadani Matrix ID", "commandHint_markasgroup": "Označi kao grupu", - "hideUnimportantStateEvents": "Sakrij nevažna stanja događaja", "doNotShowAgain": "Nemoj više prikazivati", "readUpToHere": "Pročitaj do ovdje", "wasDirectChatDisplayName": "Prazan chat (zvao se {oldDisplayName})", @@ -2314,14 +2062,10 @@ "noOtherDevicesFound": "Nijedan drugi uređaj nije pronađen", "whyIsThisMessageEncrypted": "Zašto nije moguće čitati ovu poruku?", "jump": "Skoči", - "startFirstChat": "Započni svoj prvi chat", "newSpaceDescription": "Prostori omogućuju konsolidiranje tvojih chatova i izgradnju privatne ili javne zajednice.", "encryptThisChat": "Šifiraj ovaj chat", "deviceKeys": "Ključevi uređaja:", "foregroundServiceRunning": "Ova se obavijest pojavljuje kada se pokreće usluga u prvom planu.", - "callingPermissions": "Dozvole za pozivanje", - "callingAccountDetails": "Omogućuje FluffyChatu korištenje izvorne Android aplikacije za pozivanje.", - "callingAccount": "Račun za pozivanje", "commandHint_hug": "Pošalji grljenje", "commandHint_googly": "Pošalji kotrljajuće oči", "commandHint_cuddle": "Pošalji maženje", @@ -2335,15 +2079,10 @@ } } }, - "enterRoom": "Upiši sobu", "screenSharingDetail": "Dijeliš svoj ekran u FuffyChatu", - "appearOnTopDetails": "Omogućuje prikaz aplikacije ispred drugih (nije potrebno ako je FluffyChat već postavljen kao račun za pozivanje)", - "appearOnTop": "Prikaz ispred drugih", "newGroup": "Nova grupa", "allSpaces": "Svi prostori", "screenSharingTitle": "dijeljenje ekrana", - "otherCallingPermissions": "Mikrofon, kamera i druge FluffyChat dozvole", - "enterSpace": "Upiši prostor", "newSpace": "Novi prostor", "sorryThatsNotPossible": "Žao nam je … to nije moguće", "disableEncryptionWarning": "Iz sigurnosnih razloga ne možeš deaktivirati šifriranje u chatu u kojem je prije bilo aktivirano.", @@ -2378,23 +2117,7 @@ "reopenChat": "Ponovo otvori chat", "openLinkInBrowser": "Otvori poveznicu u pregledniku", "report": "prijavi", - "allRooms": "Svi grupni chatovi", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "reportErrorDescription": "😭 Joj! Dogodila se greška. Pokušaj ponovo kasnije. Ako želiš, grešku možeš prijaviti programerima.", - "signInWithPassword": "Prijavi se s lozinkom", - "pleaseTryAgainLaterOrChooseDifferentServer": "Pokušaj ponovo kasnije ili odaberi jedan drugi server.", - "signInWith": "Prijavi se pomoću {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "notAnImage": "Nije slikovna datoteka.", "importNow": "Uvezi sada", "importEmojis": "Uvezi emoji slike", @@ -2419,7 +2142,6 @@ } }, "optionalRedactReason": "(Opcionalno) Razlog za redigiranje ove poruke …", - "inviteContactToGroupQuestion": "Želiš li pozvati {contact} u chat „{groupName}”?", "redactedByBecause": "Preuređeno od {username} zbog: „{reason}”", "@redactedByBecause": { "type": "String", @@ -2433,20 +2155,16 @@ } }, "redactMessageDescription": "Poruka će se redigirati za sve sudionike u ovoj konverzaciji. To je nepovratna radnja.", - "addChatDescription": "Dodaj opis chata …", "directChat": "Izravni chat", "inviteGroupChat": "📨 Pozivnica u grupni chat", - "invitePrivateChat": "📨 Pozivnica u privatni chat", "noChatDescriptionYet": "Opis chata još nije stvoren.", "chatDescriptionHasBeenChanged": "Opis chata je promijenjen", - "profileNotFound": "Korisnik nije pronađen na serveru. Možda postoji problem s vezom ili korisnik ne postoji.", "shareInviteLink": "Dijeli poveznicu za poziv", "emoteKeyboardNoRecents": "Ovdje će se pojaviti nedavno korišteni emotikoni …", "@emoteKeyboardNoRecents": { "type": "String", "placeholders": {} }, - "setTheme": "Postavi temu:", "createGroup": "Stvori grupu", "invite": "Pozovi", "invalidInput": "Neispravan unos!", @@ -2471,7 +2189,6 @@ "pushNotificationsNotAvailable": "Automatsko slanje obavijesti nije dostupno", "learnMore": "Saznaj više", "createGroupAndInviteUsers": "Stvori grupu i pozovi korisnike", - "startConversation": "Pokreni konverzaciju", "blockedUsers": "Blokirani korisnici", "groupCanBeFoundViaSearch": "Grupa se može pronaći putem pretrage", "block": "Blokiraj", @@ -2500,23 +2217,14 @@ "newPassword": "Nova lozinka", "unbanUserDescription": "Korisnik će se ponovo moći pridružiti chatu ako pokuša.", "publicSpaces": "Javni prostori", - "subspace": "Podprostori", - "decline": "Odbij", "thisDevice": "Ovaj uređaj:", - "presenceStyle": "Prisutnost:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Prikaži poruke stanja od drugih korisnika", "@presencesToggle": { "type": "String", "placeholders": {} }, - "noPublicLinkHasBeenCreatedYet": "Još nije stvorena nijedna javna poveznica", "hidePresences": "Sakriti popis stanja?", "pleaseEnterYourCurrentPassword": "Upiši svoju trenutačnu lozinku", - "publicLink": "Javna poveznica", "passwordIsWrong": "Tvoja upisana lozinka je kriva", "initAppError": "Dogodila se greška prilikom inicijaliziranja aplikacije", "hideRedactedMessagesBody": "Ako netko redigira poruku, ta poruka više neće biti vidljiva u chatu.", @@ -2527,27 +2235,9 @@ "hideRedactedMessages": "Sakrij redigirane poruke", "hideInvalidOrUnknownMessageFormats": "Sakrij nevažeće ili nepoznate formate poruka", "overview": "Pregled", - "notifyMeFor": "Obavijesit me za", "passwordRecoverySettings": "Postavke za obnavljanje lozinke", - "hideMemberChangesInPublicChats": "Sakrij promjene članova u javnim chatovima", - "youInvitedToBy": "📩 Pozvan/a si putem poveznice na:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "usersMustKnock": "Korisnici moraju pokucati", "noOneCanJoin": "Nitko se ne može pridružiti", - "userWouldLikeToChangeTheChat": "{user} se želi pridružiti chatu.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "knock": "Pokucaj", "knocking": "Kucanje", "chatCanBeDiscoveredViaSearchOnServer": "Chat se može otkriti pretraživanjem servera {server}", @@ -2564,7 +2254,6 @@ "joinSpace": "Pridruži se prostoru", "publicChatAddresses": "Adrese javnih chatova", "createNewAddress": "Stvori novu adresu", - "userRole": "Korisnička uloga", "verifyOtherUser": "🔐 Potvrdi drugog korisnika", "sendTypingNotificationsDescription": "Drugi sudionici u chatu mogu vidjeti kada tipkaš novu poruku.", "sendReadReceiptsDescription": "Drugi sudionici u raygovoru mogu vidjeti kada pročitaš poruku.", @@ -2668,39 +2357,8 @@ "verifyOtherDeviceDescription": "Kada potvrdiš jedan drugi uređaj, ti uređaji mogu razmjenjivati ključeve, povećavajući tvoju ukupnu sigurnost. 💪 Kada pokreneš provjeru, pojavit će se skočni prozor u aplikaciji na oba uređaja. Tamo ćeš tada vidjeti niz emojija ili brojeve koje moraš međusobno usporediti. Najbolje je imati oba uređaja pri ruci prije nego što započneš provjeru. 🤳", "verifyOtherUserDescription": "Ako potvrdiš jednog drugog korisnika, možeš biti siguran/na da znaš kome zapravo pišeš. 💪\n\nKada pokreneš provjeru, vi i drugi korisnik vidjet ćete skočni prozor u aplikaciji. Tamo ćeš tada vidjeti niz emojija ili brojeve koje morate međusobno usporediti.\n\nNajbolji način za to je da se nađete zajedno ili započnete videopoziv. 👭", "knockRestricted": "Pokucaj na ograničene sobe", - "hideMemberChangesInPublicChatsBody": "Za bolju čitljivosti, na vremenskoj traci chata nemoj prikazivati kad se netko pridruži ili napusti javni chat.", "makeAdminDescription": "Nakon postavljanja ovog korisnika kao administratora, to možda nećeš moći poništiti jer će on tada imati iste dozvole kao i ti.", "leaveEmptyToClearStatus": "Ostavi prazno za brisanje tvog stanja.", - "forwardMessageTo": "Proslijediti poruku u sobu {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, - "minimumPowerLevel": "{level} je najmanja razina prava.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, - "databaseBuildErrorBody": "Nije moguće izgraditi SQlite bazu podataka. Aplikacija za sada pokušava koristiti staru bazu podataka. Prijavi ovu grešku programerima na {url}. Poruka o grešci glasi: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sendReadReceipts": "Šalji potvrde o čitanju", "acceptedKeyVerification": "{sender} je prihvatio/la potvrđivanje ključa", "@acceptedKeyVerification": { @@ -2755,10 +2413,7 @@ } } }, - "setCustomPermissionLevel": "Postavi razinu dozvole", - "setPermissionsLevelDescription": "Odaberi unaprijed definiranu ulogu u nastavku ili upiši prilagođenu razinu dozvole između 0 i 100.", "ignoreUser": "Zanemari korisnika", - "normalUser": "Normalni korisnik", "aboutHomeserver": "Informacije o {homeserver}", "@aboutHomeserver": { "type": "String", @@ -2769,21 +2424,8 @@ } }, "commandHint_roomupgrade": "Nadogradi ovu sobu na zadanu verziju sobe", - "countChatsAndCountParticipants": "{chats} chata i {participants} sudionika", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Nema više chatova …", "noChatsFoundHere": "Ovdje još nisu pronađeni chatovi. Započni novi chat s nekime pomoću donjeg gumba. ⤵️", - "joinedChats": "Pridruženi chatovi", "unread": "Nepročitano", "space": "Prostor", "spaces": "Prostori", @@ -2878,9 +2520,6 @@ "changelog": "Dnevnik promjena", "sendCanceled": "Slanje je prekinuto", "loginWithMatrixId": "Prijava pomoću Matrix-ID-a", - "discoverHomeservers": "Otkrij homeservere", - "whatIsAHomeserver": "Što je homeserver?", - "homeserverDescription": "Svi se tvoji podaci spremaju na homeserver, baš kao kod pružatelja usluge e-pošte. Možeš odabrati koji homeserver želiš koristiti, te istovremeno komunicirati sa svima. Saznaj više na at https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "Čini se da nije kompatibilan homeserver. Pogrešan URL?", "calculatingFileSize": "Izračunavanje veličine datoteke …", "generatingVideoThumbnail": "Generiranje minijatura videa …", @@ -2932,7 +2571,6 @@ "appWantsToUseForLoginDescription": "Ovime dopuštaš aplikaciji i web-stranici da dijele podatke o tebi.", "open": "Otvori", "waitingForServer": "Čekanje na server …", - "appIntroduction": "FluffyChat omogućuje da razgovaraš s prijateljima preko različitih messengera. Saznaj više na https://matrix.org ili jednostavno dodirni *Nastavi*.", "newChatRequest": "📩 Novi zahtjev za chat", "contentNotificationSettings": "Postavke obavijesti o sadržaju", "generalNotificationSettings": "Opće postavke obavijesti", @@ -3026,10 +2664,6 @@ "longPressToRecordVoiceMessage": "Pritisni dugo za snimanje glasovne poruke.", "pause": "Pauza", "resume": "Nastavi", - "newSubSpace": "Novi podprostor", - "moveToDifferentSpace": "Premjesti u jedan drugi prostor", - "moveUp": "Pomakni gore", - "moveDown": "Pomakni dolje", "removeFromSpaceDescription": "Chat će se ukloniti iz prostora, ali će se i dalje pojaviti na tvom popisu chatova.", "countChats": "Broj chatova: {chats}", "@countChats": { @@ -3072,7 +2706,6 @@ "startPoll": "Početak ankete", "endPoll": "Kraj ankete", "answersVisible": "Odgovori vidljivi", - "answersHidden": "Odgovori skriveni", "pollQuestion": "Pitanje u anketi", "answerOption": "Opcija za odgovor", "addAnswerOption": "Dodaj opciju za odgovor", @@ -3137,6 +2770,5 @@ }, "logs": "Zapisi", "advancedConfigs": "Napredne konfiguracije", - "advancedConfigurations": "Napredne konfiguracije", - "signInWithLabel": "Prijavi se sa:" -} + "advancedConfigurations": "Napredne konfiguracije" +} \ No newline at end of file diff --git a/lib/l10n/intl_hu.arb b/lib/l10n/intl_hu.arb index fb94d4e4..afb797b9 100644 --- a/lib/l10n/intl_hu.arb +++ b/lib/l10n/intl_hu.arb @@ -323,16 +323,6 @@ "type": "String", "placeholders": {} }, - "confirm": "Megerősít", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Csatlakozás", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kapcsolat meghívásra került a csoportba", "@contactHasBeenInvitedToTheGroup": { "type": "String", @@ -402,33 +392,6 @@ } } }, - "dateWithoutYear": "{month}. {day}.", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}. {month}. {day}.", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Ez deaktiválja a felhasználói fiókját. Ez nem vonható vissza! Biztos benne?", "@deactivateAccountWarning": { "type": "String", @@ -499,11 +462,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Ki kell választania egy hangulatjel rövidkódot és egy képet!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Üres csevegés", "@emptyChat": { "type": "String", @@ -538,11 +496,6 @@ } } }, - "enterYourHomeserver": "Adja meg a Matrix-kiszolgálóját", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "fileName": "Fájlnév", "@fileName": { "type": "String", @@ -629,11 +582,6 @@ "type": "String", "placeholders": {} }, - "identity": "Azonosító", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignoredUsers": "Figyelmen kívül hagyott felhasználók", "@ignoredUsers": { "type": "String", @@ -759,11 +707,6 @@ "type": "String", "placeholders": {} }, - "license": "Licenc", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Világos", "@lightTheme": { "type": "String", @@ -984,11 +927,6 @@ } } }, - "rejoin": "Újracsatlakozás", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Eltávolítás", "@remove": { "type": "String", @@ -1008,11 +946,6 @@ } } }, - "removeDevice": "Eszköz eltávolítása", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Csevegés kitiltás feloldása", "@unbanFromChat": { "type": "String", @@ -1033,15 +966,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "{username} látta", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Küldés", "@send": { "type": "String", @@ -1067,11 +991,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Eredeti küldése", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Videó küldése", "@sendVideo": { "type": "String", @@ -1131,11 +1050,6 @@ } } }, - "setInvitationLink": "Meghívó hivatkozás beállítása", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "setStatus": "Állapot beállítása", "@setStatus": { "type": "String", @@ -1266,15 +1180,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 olvasatlan csevegés} other{{unreadCount} olvasatlan csevegés}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} és {count} másik résztvevő gépel…", "@userAndOthersAreTyping": { "type": "String", @@ -1394,11 +1299,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Háttér:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Figyelem!", "@warning": { "type": "String", @@ -1454,11 +1354,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Meghívás számomra", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "iHaveClickedOnLink": "Rákattintottam a linkre", "@iHaveClickedOnLink": { "type": "String", @@ -1489,11 +1384,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Bot üzenetek", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "repeatPassword": "Jelszó ismétlése", "@repeatPassword": {}, "addEmail": "E-mail-cím hozzáadása", @@ -1648,11 +1538,6 @@ }, "scanQrCode": "QR kód beolvasása", "@scanQrCode": {}, - "notificationsEnabledForThisAccount": "Értesítések be vannak kapcsolva ebben a fiókban", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "offensive": "Sértő", "@offensive": { "type": "String", @@ -1702,21 +1587,6 @@ "type": "String", "placeholders": {} }, - "containsDisplayName": "Tartalmazza a megjelenített nevet", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Tartalmazza a felhasználónevet", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "goToTheNewRoom": "Ugrás az új szobába", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "noConnectionToTheServer": "Nem elérhető a szerver", "@noConnectionToTheServer": { "type": "String", @@ -1727,8 +1597,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Csevegés hozzáadva a térhez", - "@chatHasBeenAddedToThisSpace": {}, "chats": "Csevegések", "@chats": { "type": "String", @@ -1814,11 +1682,6 @@ } } }, - "memberChanges": "Tagi változások", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "messages": "Üzenetek", "@messages": { "type": "String", @@ -1855,23 +1718,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "Kamera megnyitása videóhoz", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "badServerVersionsException": "A Matrix-kiszolgáló ezeket a specifikált verziókat támogatja:\n{serverVersions}\nAzonban ez az app csak a következőket: {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "commandHint_me": "Írja le magát", "@commandHint_me": { "type": "String", @@ -1901,12 +1747,6 @@ "@dehydrate": {}, "dehydrateWarning": "Ez nem visszavonható. Bizonyosodjon meg róla, hogy biztonságos helyre menti a fájlt.", "@dehydrateWarning": {}, - "dehydrateTor": "TOR felhasználók: Munkamenet exportálása", - "@dehydrateTor": {}, - "dehydrateTorLong": "TOR felhasználóknak ajánlott a munkamenet exportálása az ablak bezárása előtt.", - "@dehydrateTorLong": {}, - "hydrateTor": "TOR felhasználóknak: munkamenet export importálása", - "@hydrateTor": {}, "hydrate": "Visszaállítás mentett fájlból", "@hydrate": {}, "link": "Hivatkozás", @@ -1916,11 +1756,6 @@ "type": "String", "placeholders": {} }, - "people": "Emberek", - "@people": { - "type": "String", - "placeholders": {} - }, "pleaseEnterYourPin": "Kérem, írja be PIN kódját", "@pleaseEnterYourPin": { "type": "String", @@ -1953,11 +1788,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Matrica küldése", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "reportMessage": "Üzenet jelentése", "@reportMessage": { "type": "String", @@ -1985,11 +1815,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Kérem, válasszon", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "commandHint_hug": "Ölelés küldése", "@commandHint_hug": {}, "reason": "Indok", @@ -2049,22 +1874,10 @@ }, "jumpToLastReadMessage": "Az utoljára olvasott üzenethez ugrás", "@jumpToLastReadMessage": {}, - "allRooms": "Minden Csoport Csevegés", - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "widgetVideo": "Videó", - "@widgetVideo": {}, "dismiss": "Elvetés", "@dismiss": {}, "reportErrorDescription": "😭 Sajnos, valami félresiklott. Ha kívánja, jelezheti a bugot a fejlesztőknek.", "@reportErrorDescription": {}, - "setPermissionsLevel": "Engedélyszint beállítása", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "removeYourAvatar": "Profilképének törlése", "@removeYourAvatar": { "type": "String", @@ -2072,32 +1885,12 @@ }, "unsupportedAndroidVersion": "Nem támogatott Android verzió", "@unsupportedAndroidVersion": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "messageType": "Üzenet típus", "@messageType": {}, - "indexedDbErrorLong": "Sajnos az üzenet mentés alapból nincs bekapcsolva privát módban.\nKeresse meg a\n - about:config\n - állítsa a dom.indexedDB.privateBrowsing.enabled \"true\"-ra\nMáskülönben nem lehetséges a FluffyChat futtatása.", - "@indexedDbErrorLong": {}, "oneClientLoggedOut": "Az egyik kliense kijelentkezett", "@oneClientLoggedOut": {}, - "toggleMuted": "Némítottak megjelenítése", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "startFirstChat": "Kezdje meg első csevegését", - "@startFirstChat": {}, - "callingAccount": "Hívási fiók", - "@callingAccount": {}, "setColorTheme": "Szín séma beállítása:", "@setColorTheme": {}, - "nextAccount": "Következő fiók", - "@nextAccount": {}, - "singlesignon": "Egyszeri Bejelentkezés", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "allSpaces": "Minden tér", "@allSpaces": {}, "supposedMxid": "{mxid}-nek kell lennie", @@ -2123,15 +1916,8 @@ }, "banUserDescription": "A felhasználó kitiltásra kerül a csevegésből, és nem fog tudni visszajönni egészen a kitiltás feloldásáig.", "@banUserDescription": {}, - "widgetEtherpad": "Szöveges megjegyzés", - "@widgetEtherpad": {}, "removeDevicesDescription": "Ki fog jelentkezni a készülékről, és többé nem fog tudni fogadni üzeneteket.", "@removeDevicesDescription": {}, - "separateChatTypes": "Csoportok és privát üzenetek elkülönítése", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "tryAgain": "Próbálja újra", "@tryAgain": {}, "youKickedAndBanned": "🙅 Kirúgta és kitiltotta {user}-t", @@ -2151,42 +1937,21 @@ }, "youRejectedTheInvitation": "Visszautasította a meghívást", "@youRejectedTheInvitation": {}, - "otherCallingPermissions": "Mikrofon, kamera, és más egyéb FluffyChat engedélyek", - "@otherCallingPermissions": {}, "messagesStyle": "Üzenetek:", "@messagesStyle": {}, - "widgetUrlError": "Helytelen hivatkozás.", - "@widgetUrlError": {}, - "emailOrUsername": "Email vagy felhasználónév", - "@emailOrUsername": {}, "newSpaceDescription": "A terek lehetővé teszik a csevegések konszolidációját, ezáltal létrehozva publikus vagy privát közösségeket.", "@newSpaceDescription": {}, "chatDescription": "Csevegés leírás", "@chatDescription": {}, - "callingAccountDetails": "Engedélyezés a FluffyChat számára hogy használja a natív android hívás applikációt.", - "@callingAccountDetails": {}, "pleaseFollowInstructionsOnWeb": "Kérem, kövesse az instrukciókat az oldalon, és nyomjon a tovább gombra.", "@pleaseFollowInstructionsOnWeb": { "type": "String", "placeholders": {} }, - "enterSpace": "Belépés a térre", - "@enterSpace": {}, "encryptThisChat": "A csevegés titkosítása", "@encryptThisChat": {}, - "previousAccount": "Előző fiók", - "@previousAccount": {}, "reopenChat": "Csevegés újranyitása", "@reopenChat": {}, - "pleaseEnterRecoveryKey": "Kérem, adja meg a visszaállító kódját:", - "@pleaseEnterRecoveryKey": {}, - "toggleFavorite": "Kedvencek megjelenítése", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "widgetNameError": "Kérem adjon meg egy megjelenítendő nevet.", - "@widgetNameError": {}, "addToBundle": "Hozzáadás fiókcsoporthoz", "@addToBundle": {}, "spaceIsPublic": "A tér publikus", @@ -2194,8 +1959,6 @@ "type": "String", "placeholders": {} }, - "addWidget": "Widget hozzáadása", - "@addWidget": {}, "countFiles": "{count} fájl", "@countFiles": { "placeholders": { @@ -2233,8 +1996,6 @@ "@sender": {}, "storeInAndroidKeystore": "Tárolás az Android KeyStore-ba", "@storeInAndroidKeystore": {}, - "signInWithPassword": "Bejelentkezés jelszóval", - "@signInWithPassword": {}, "makeAdminDescription": "Miután a felhasználót aminisztrátorrá lépteti elő, nem fogja tudni visszavonni döntését, mivel azonos jogosultsági szinttel fognak rendelkezni.", "@makeAdminDescription": {}, "synchronizingPleaseWait": "Szinkronizálás... Kérem, várjon.", @@ -2267,11 +2028,6 @@ }, "importFromZipFile": "Importálás zip fájlból", "@importFromZipFile": {}, - "toggleUnread": "Jelölés Olvasottként/Olvasatlanként", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "noOtherDevicesFound": "Nem található más eszköz", "@noOtherDevicesFound": {}, "redactedBy": "{username} által szerkesztve", @@ -2285,15 +2041,6 @@ }, "videoCallsBetaWarning": "Kérem vegye figyelembe, hogy a videó hívások jelenleg béta fázisban vannak. Nem biztos, hogy megfelelően fognak működni, vagy egyáltalán elindulnak egyes platformokon.", "@videoCallsBetaWarning": {}, - "signInWith": "Bejelentkezés a {provider} kiszolgálóval", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "fileIsTooBigForServer": "Nem küldhető el! A szerver csak {max} határig enged csatolmányokat.", "@fileIsTooBigForServer": {}, "verified": "Hitelesített", @@ -2301,23 +2048,12 @@ "type": "String", "placeholders": {} }, - "callingPermissions": "Hívási engedélyek", - "@callingPermissions": {}, "readUpToHere": "Olvasás idáig", "@readUpToHere": {}, "start": "Kezdés", "@start": {}, "unlockOldMessages": "Régi üzenetek feloldása", "@unlockOldMessages": {}, - "numChats": "{number} csevegés", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "optionalRedactReason": "(Választható) A szerkesztés oka...", "@optionalRedactReason": {}, "sendAsText": "Küldés szövegként", @@ -2328,15 +2064,6 @@ "@archiveRoomDescription": {}, "exportEmotePack": "Emojicsomag exportálása zip-be", "@exportEmotePack": {}, - "switchToAccount": "A {number} számú fiókra váltás", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "setAsCanonicalAlias": "Beállítás alapértelmezett álnévként", "@setAsCanonicalAlias": { "type": "String", @@ -2351,8 +2078,6 @@ "@experimentalVideoCalls": {}, "pleaseEnterRecoveryKeyDescription": "A régi üzenetei feloldásához adja meg a korábban generált visszaállítási jelszavát. A visszaállítási jelszó NEM EGYEZIK MEG a jelszóval.", "@pleaseEnterRecoveryKeyDescription": {}, - "inviteContactToGroupQuestion": "Meg kívánja hívni {contact} ismerősét a \"{groupName}\" csevegő csoportba?", - "@inviteContactToGroupQuestion": {}, "redactedByBecause": "{username} által szerkesztve, mivel: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2373,10 +2098,6 @@ } } }, - "appearOnTopDetails": "Engedélyezi az app számára, hogy mindig legfelül jelenjen meg (nem szükséges, ha a FluffyChat hívó fiókként lett beállítva)", - "@appearOnTopDetails": {}, - "enterRoom": "Belépés a szobába", - "@enterRoom": {}, "pleaseChooseAPasscode": "Kérem, válasszon egy kódot", "@pleaseChooseAPasscode": { "type": "String", @@ -2432,14 +2153,8 @@ "@unverified": {}, "serverRequiresEmail": "Ehhez a szerverhez szükséges az email címének visszaigazolása.", "@serverRequiresEmail": {}, - "hideUnimportantStateEvents": "Jelentéktelen esemény státuszok elrejtése", - "@hideUnimportantStateEvents": {}, "screenSharingTitle": "képernyő megosztás", "@screenSharingTitle": {}, - "widgetCustom": "Egyedi", - "@widgetCustom": {}, - "addToSpaceDescription": "Válassza ki melyik térhez kívánja hozzáadni a csevegést.", - "@addToSpaceDescription": {}, "youBannedUser": "Letitotta {user} felhasználót", "@youBannedUser": { "placeholders": { @@ -2448,8 +2163,6 @@ } } }, - "addChatDescription": "Chat leírás hozzáadása...", - "@addChatDescription": {}, "hasKnocked": "🚪 {user} bekopogott", "@hasKnocked": { "placeholders": { @@ -2458,8 +2171,6 @@ } } }, - "publish": "Közzététel", - "@publish": {}, "openLinkInBrowser": "Hivatkozás megnyitása böngészőben", "@openLinkInBrowser": {}, "messageInfo": "Üzenet információ", @@ -2481,10 +2192,6 @@ "@sendTypingNotifications": {}, "inviteGroupChat": "📨 Meghívó a csoportba", "@inviteGroupChat": {}, - "appearOnTop": "Megjelenés legfelül", - "@appearOnTop": {}, - "invitePrivateChat": "📨 Meghívó privát csevegéshez", - "@invitePrivateChat": {}, "foregroundServiceRunning": "Ez az értesítés akkor jelenik meg ha az előtéri szolgáltatás fut.", "@foregroundServiceRunning": {}, "voiceCall": "Hang hívás", @@ -2535,8 +2242,6 @@ } } }, - "profileNotFound": "A felhasználó nem található a szerveren. Lehetséges, hogy csatlakozási problémák adódtak, vagy nem létezik a felhasználó.", - "@profileNotFound": {}, "jump": "Ugrás", "@jump": {}, "reactedWith": "{sender} a következőképp reagált: {reaction}", @@ -2553,15 +2258,6 @@ }, "sorryThatsNotPossible": "Ez sajnos nem lehetséges", "@sorryThatsNotPossible": {}, - "videoWithSize": "Videó ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "shareInviteLink": "Meghívó link megosztása", "@shareInviteLink": {}, "commandHint_markasdm": "Szoba megjelölése mint közvetlen csevegő szoba az adott Matrix ID-nél", @@ -2575,21 +2271,10 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Egyedi hangulatjelek beállítása", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setTheme": "Téma beállítása:", - "@setTheme": {}, "youJoinedTheChat": "Becsatlakozott a csevegésbe", "@youJoinedTheChat": {}, "markAsRead": "Olvasottként megjelölés", "@markAsRead": {}, - "widgetName": "Név", - "@widgetName": {}, - "errorAddingWidget": "Hiba lépett fel a widget hozzáadásánál.", - "@errorAddingWidget": {}, "replace": "Kicserél", "@replace": {}, "youUnbannedUser": "Levette a letiltást {user}-ről", @@ -2604,12 +2289,8 @@ "@newSpace": {}, "emojis": "Hangulatjelek", "@emojis": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Próbálja meg később, vagy válasszon másik szervert.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "createGroup": "Csoport létrehozása", "@createGroup": {}, - "hydrateTorLong": "Legutóbb TOR segítségével exportálta korábbi munkamenetét? Gyorsan importálja őket vissza, és folytassa a csevegést.", - "@hydrateTorLong": {}, "time": "Idő", "@time": {}, "custom": "Egyedi", @@ -2630,8 +2311,6 @@ "@invite": {}, "enableMultiAccounts": "(BÉTA) Több fiók bekapcsolása az eszközön", "@enableMultiAccounts": {}, - "indexedDbErrorTitle": "Privát mód problémák", - "@indexedDbErrorTitle": {}, "unsupportedAndroidVersionLong": "Ehhez a funkcióhoz egy újabb Android verzió kell. Kérem ellenőrizze be van e frissítve teljesen készüléke, esetlegesen van e LineageOS támogatás hozzá.", "@unsupportedAndroidVersionLong": {}, "storeSecurlyOnThisDevice": "Biztonságos tárolás az eszközön", @@ -2648,26 +2327,11 @@ "@blockListDescription": {}, "blockUsername": "Felhasználónév ignorálása", "@blockUsername": {}, - "presenceStyle": "Állapot:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Más felhasználók állapot üzeneteinek megjelenítése", "@presencesToggle": { "type": "String", "placeholders": {} }, - "youInvitedToBy": "📩 Meghívást kapott linken keresztül a következőhöz:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "decline": "Elutasítás", - "@decline": {}, "yourGlobalUserIdIs": "A globális felhasználó-ID-je: ", "@yourGlobalUserIdIs": {}, "noUsersFoundWithQuery": "\"{query}\"-vel nem található felhasználó. Ellenőrizze nincs e elírás.", @@ -2710,19 +2374,8 @@ "@passwordsDoNotMatch": {}, "passwordIsWrong": "Hibás a beírt jelszava", "@passwordIsWrong": {}, - "subspace": "Al-tér", - "@subspace": {}, "thisDevice": "Ez az eszköz:", "@thisDevice": {}, - "forwardMessageTo": "Üzenet továbbítása a {roomName} szobába?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendTypingNotificationsDescription": "A csevegés többi tagja látja amikor gépel.", "@sendTypingNotificationsDescription": {}, "sendReadReceiptsDescription": "A csevegés többi tagja láthatja, ha olvasta az üzeneteiket.", @@ -2749,18 +2402,6 @@ } } }, - "databaseBuildErrorBody": "Nem lehetséges az SQlite adatbázis létrehozása. Az app megpróbálja a régi típusú adatbázist használni. Kérem jelentse a hibát a fejlesztőknek a {url} hivatkozáson. A hiba szövege a következő: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "restoreSessionBody": "Megpróbálkozunk visszaállítani a munkamenetét egy korábbi mentésből. Kérem jelezze a hibát a fejlesztőknek a {url} címen. A hiba szövege a következő: {error}", "@restoreSessionBody": { "type": "String", @@ -2779,8 +2420,6 @@ "@searchChatsRooms": {}, "wrongRecoveryKey": "Sajnos, úgy tűnik hibásan adta meg a visszaállítási kulcsot.", "@wrongRecoveryKey": {}, - "startConversation": "Társalgás kezdése", - "@startConversation": {}, "commandHint_sendraw": "Tiszta json küldése", "@commandHint_sendraw": {}, "databaseMigrationBody": "Kérem várjon. Ez igénybe vehet valamennyi időt.", @@ -2838,8 +2477,6 @@ "@incomingMessages": {}, "nothingFound": "Nincs találat...", "@nothingFound": {}, - "publicLink": "Nyilvános hivatkozás", - "@publicLink": {}, "select": "Kiválaszt", "@select": {}, "stickers": "Matricák", @@ -2864,24 +2501,10 @@ "@calls": {}, "hideInvalidOrUnknownMessageFormats": "Érvénytelen vagy ismeretlen üzenetformátum elrejtése", "@hideInvalidOrUnknownMessageFormats": {}, - "hideMemberChangesInPublicChatsBody": "Ne mutassa ha valaki be- vagy kilép a csevegésből az olvashatóság javítása érdekében.", - "@hideMemberChangesInPublicChatsBody": {}, - "notifyMeFor": "Értesítsen ha", - "@notifyMeFor": {}, "passwordRecoverySettings": "Jelszó-helyreállítási beállítások", "@passwordRecoverySettings": {}, "noOneCanJoin": "Senki sem csatlakozhat", "@noOneCanJoin": {}, - "userWouldLikeToChangeTheChat": "{user} szeretne csatlakozni a csevegéshez.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Nyilvános link nem került még létrehozásra", - "@noPublicLinkHasBeenCreatedYet": {}, "chatCanBeDiscoveredViaSearchOnServer": "Csevegés felfedezhető a {server} szerveren történő kereséssel", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2901,8 +2524,6 @@ "@overview": {}, "publicChatAddresses": "Nyilvános csevegés címek", "@publicChatAddresses": {}, - "userRole": "Felhasználói szerep", - "@userRole": {}, "createNewAddress": "Új cím létrehozása", "@createNewAddress": {}, "noDatabaseEncryption": "Adatbázis titkosítás nem támogatott ezen a platformon", @@ -2947,23 +2568,12 @@ "@hideRedactedMessages": {}, "hideRedactedMessagesBody": "Ha valaki szerkeszti az üzenetét, ez az üzenet nem jelenik meg a csevegés során.", "@hideRedactedMessagesBody": {}, - "hideMemberChangesInPublicChats": "Tag változások elrejtése a publikus csevegésben", - "@hideMemberChangesInPublicChats": {}, "knocking": "Bekopogás", "@knocking": {}, "usersMustKnock": "A felhasználóknak be kell kopogniuk", "@usersMustKnock": {}, "knock": "Kopogás", "@knock": {}, - "minimumPowerLevel": "{level} a minimum szint.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchMore": "További keresés...", "@searchMore": {}, "gallery": "Galéria", @@ -3021,10 +2631,6 @@ "@changeTheCanonicalRoomAlias": {}, "chatPermissionsDescription": "Adja meg milyen erősségi szint kell egyes csevegési művelethez. A 0, 50 és 100-as szintek általában felhasználókat, moderátorokat és adminisztrátorokat jelölnek de bármilyen szintezés lehetséges.", "@chatPermissionsDescription": {}, - "whatIsAHomeserver": "Mi az a Matrix-kiszolgáló?", - "@whatIsAHomeserver": {}, - "homeserverDescription": "Az összes adata a Mátrix-kiszolgálón tárolódik, pont mint egy e-mail kiszolgálón. Kiválaszthatja melyik Matrix-kiszolgálót akarja használni, miközben tud kommunikálni mindenkivel. Tudjon meg többet a https://matrix.org címen.", - "@homeserverDescription": {}, "userLevel": "{level} - Felhasználó", "@userLevel": { "type": "String", @@ -3061,26 +2667,10 @@ }, "loginWithMatrixId": "Bejelentkezés Matrix-ID-vel", "@loginWithMatrixId": {}, - "discoverHomeservers": "Matrix-kiszolgálók felfedezése", - "@discoverHomeservers": {}, "doesNotSeemToBeAValidHomeserver": "Nem tűnik kompatibilisnek a Mátrix-kiszolgálónak. Hibás a hivatkozás?", "@doesNotSeemToBeAValidHomeserver": {}, - "countChatsAndCountParticipants": "{chats} csevegések és {participants} résztvevők", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Nem található több csevegés...", "@noMoreChatsFound": {}, - "joinedChats": "Csatlakozott csevegések", - "@joinedChats": {}, "checkList": "Tennivalók listája", "@checkList": {}, "countInvited": "{count} meghívott", @@ -3110,16 +2700,10 @@ } } }, - "normalUser": "Normál felhasználó", - "@normalUser": {}, "ignoreUser": "Felhasználó ignorálása", "@ignoreUser": {}, "commandHint_roomupgrade": "Szoba frissítése a megadott szoba verzióra", "@commandHint_roomupgrade": {}, - "setCustomPermissionLevel": "Egyedi engedélyszint beállítása", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Kérem, válasszon egy előre meghatározott szerepkört, vagy adjon meg egy egyedi engedély szintet 0 és 100 között.", - "@setPermissionsLevelDescription": {}, "sendingAttachmentCountOfCount": "{index} csatolmány küldése {length}-ból...", "@sendingAttachmentCountOfCount": { "type": "integer", @@ -3226,8 +2810,6 @@ "@appWantsToUseForLoginDescription": {}, "waitingForServer": "Várakozás a szerverre...", "@waitingForServer": {}, - "appIntroduction": "A FluffyChat segítségével cseveghet barátaival, akár más üzenetküldő alkalmazásokon keresztül is. Tudjon meg erről többet a https://matrix.org oldalon, vagy nyomjon a \"Folytatás\" gombra.", - "@appIntroduction": {}, "open": "Megnyitás", "@open": {}, "notificationRuleSuppressNotices": "Minden automata üzenetet némít", @@ -3374,4 +2956,4 @@ "@youHaveKnocked": {}, "pleaseWaitUntilInvited": "Kérem várjon, amíg valaki a szobából behívja Önt.", "@pleaseWaitUntilInvited": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_ia.arb b/lib/l10n/intl_ia.arb index ec6a01f2..d63df13e 100644 --- a/lib/l10n/intl_ia.arb +++ b/lib/l10n/intl_ia.arb @@ -57,4 +57,4 @@ } }, "@custom": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_id.arb b/lib/l10n/intl_id.arb index d0cddc25..65174f6c 100644 --- a/lib/l10n/intl_id.arb +++ b/lib/l10n/intl_id.arb @@ -10,16 +10,6 @@ "type": "String", "placeholders": {} }, - "people": "Orang-orang", - "@people": { - "type": "String", - "placeholders": {} - }, - "goToTheNewRoom": "Pergi ke ruangan yang baru", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "chats": "Obrolan", "@chats": { "type": "String", @@ -110,11 +100,6 @@ } } }, - "inviteForMe": "Undangan untuk saya", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "invitedUsersOnly": "Pengguna yang diundang saja", "@invitedUsersOnly": { "type": "String", @@ -166,11 +151,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identitas", - "@identity": { - "type": "String", - "placeholders": {} - }, "id": "ID", "@id": { "type": "String", @@ -262,11 +242,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Masukkan homeserver-mu", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "enterAnEmailAddress": "Masukkan alamat email", "@enterAnEmailAddress": { "type": "String", @@ -306,11 +281,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Kamu harus memilih shortcode emote dan gambar!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emoteShortcode": "Shortcode emote", "@emoteShortcode": { "type": "String", @@ -401,33 +371,6 @@ "type": "String", "placeholders": {} }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "dateAndTimeOfDay": "{timeOfDay}, {date}", "@dateAndTimeOfDay": { "type": "String", @@ -690,11 +633,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Pesan bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "blocked": "Diblokir", "@blocked": { "type": "String", @@ -722,18 +660,6 @@ "type": "String", "placeholders": {} }, - "badServerVersionsException": "Homeserver ini mendukung versi Spec ini:\n{serverVersions}\nTetapi aplikasi ini hanya mendukung {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "sendOnEnter": "Kirim dengan enter", "badServerLoginTypesException": "Homeserver ini mendukung tipe masuk ini:\n{serverVersions}\nTetapi aplikasi ini mendukung:\n{supportedVersions}", "@badServerLoginTypesException": { @@ -797,31 +723,11 @@ "type": "String", "placeholders": {} }, - "containsUserName": "Berisi nama pengguna", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "Berisi nama tampilan", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontak telah diundang ke grup", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "connect": "Hubungkan", - "@connect": { - "type": "String", - "placeholders": {} - }, - "confirm": "Konfirmasi", - "@confirm": { - "type": "String", - "placeholders": {} - }, "compareNumbersMatch": "Bandingkan angka", "@compareNumbersMatch": { "type": "String", @@ -876,11 +782,6 @@ } } }, - "license": "Lisensi", - "@license": { - "type": "String", - "placeholders": {} - }, "leftTheChat": "Keluar dari obrolan", "@leftTheChat": { "type": "String", @@ -1018,11 +919,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Perubahan anggota", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "logout": "Keluar", "@logout": { "type": "String", @@ -1096,11 +992,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Mohon pilih", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "oopsPushError": "Ups! Sayangnya, terjadi kesalahan saat mengatur pemberitahuan push.", "@oopsPushError": { "type": "String", @@ -1126,11 +1017,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notifikasi diaktifkan untuk akun ini", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "notifications": "Notifikasi", "@notifications": { "type": "String", @@ -1201,11 +1087,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Latar belakang:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "waitingPartnerNumbers": "Menunggu pengguna untuk menerima angka…", "@waitingPartnerNumbers": { "type": "String", @@ -1316,15 +1197,6 @@ } } }, - "unreadChats": "{unreadCount, plural, =1{1 obrolan belum dibaca} other{{unreadCount} obrolan belum dibaca}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "unpin": "Lepaskan pin", "@unpin": { "type": "String", @@ -1381,21 +1253,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "Tandai Baca/Belum Dibaca", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Beralih Bisuan", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleFavorite": "Beralih Favorit", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1466,11 +1323,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Login Masuk Tunggal", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "shareLocation": "Bagikan lokasi", "@shareLocation": { "type": "String", @@ -1500,21 +1352,6 @@ "type": "String", "placeholders": {} }, - "setPermissionsLevel": "Tetapkan level izin", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Tetapkan tautan undangan", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setCustomEmotes": "Tetapkan emote kustom", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "sentCallInformations": "{senderName} mengirim informasi panggilan", "@sentCallInformations": { "type": "String", @@ -1569,15 +1406,6 @@ } } }, - "seenByUser": "Dilihat oleh {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "security": "Keamanan", "@security": { "type": "String", @@ -1618,11 +1446,6 @@ "type": "String", "placeholders": {} }, - "rejoin": "Gabung kembali", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "rejectedTheInvitation": "{username} menolak undangannya", "@rejectedTheInvitation": { "type": "String", @@ -1964,7 +1787,6 @@ "type": "String", "description": "Usage hint for the command /ban" }, - "chatHasBeenAddedToThisSpace": "Obrolan telah ditambahkan ke space ini", "changeTheme": "Ubah tema", "@changeTheme": { "type": "String", @@ -1980,16 +1802,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Kirim stiker", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "sendOriginal": "Kirim yang asli", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendMessages": "Kirim pesan", "@sendMessages": { "type": "String", @@ -2034,11 +1846,6 @@ "type": "String", "placeholders": {} }, - "removeDevice": "Hapus perangkat", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "removedBy": "Dihapus oleh {username}", "@removedBy": { "type": "String", @@ -2102,7 +1909,6 @@ "messageType": "Tipe Pesan", "sender": "Pengirim", "openGallery": "Buka galeri", - "addToSpaceDescription": "Pilih sebuah space untuk menambahkan obrolan ke spacenya.", "start": "Mulai", "removeFromSpace": "Hilangkan dari space", "commandHint_clearcache": "Bersihkan tembolok", @@ -2125,21 +1931,6 @@ "type": "String", "description": "Usage hint for the command /create" }, - "openVideoCamera": "Buka kamera untuk merekam video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "publish": "Publikasi", - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "dismiss": "Abaikan", "markAsRead": "Tandai sebagai dibaca", "reportUser": "Laporkan pengguna", @@ -2164,33 +1955,7 @@ "placeCall": "Lakukan panggilan", "voiceCall": "Panggilan suara", "videoCallsBetaWarning": "Dicatat bahwa panggilan video sedang dalam beta. Fitur ini mungkin tidak berkerja dengan benar atau tidak berkerja sama sekali pada semua platform.", - "emailOrUsername": "Email atau nama pengguna", "experimentalVideoCalls": "Panggilan video eksperimental", - "previousAccount": "Akun sebelumnya", - "switchToAccount": "Ganti ke akun {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Akun berikutnya", - "widgetEtherpad": "Catatan teks", - "widgetJitsi": "Jitsi Meet", - "widgetCustom": "Kustom", - "errorAddingWidget": "Terjadi kesalahan menambahkan widget.", - "widgetName": "Nama", - "addWidget": "Tambahkan widget", - "widgetVideo": "Video", - "widgetUrlError": "Ini bukan URL yang valid.", - "widgetNameError": "Mohon sediakan sebuah nama tampilan.", - "separateChatTypes": "Pisahkan Pesan Langsung dan Grup", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "youInvitedBy": "📩 Kamu telah diundang oleh {user}", "@youInvitedBy": { "placeholders": { @@ -2256,7 +2021,6 @@ "saveKeyManuallyDescription": "Simpan kunci ini secara manual dengan memicu dialog pembagian atau papan klip sistem.", "recoveryKey": "Kunci pemulihan", "storeInAppleKeyChain": "Simpan di Apple KeyChain", - "pleaseEnterRecoveryKey": "Mohon masukkan kunci pemulihanmu:", "unlockOldMessages": "Akses pesan lama", "recoveryKeyLost": "Kunci pemulihan hilang?", "storeInAndroidKeystore": "Simpan di Android KeyStore", @@ -2270,14 +2034,8 @@ } }, "hydrate": "Pulihkan dari file cadangan", - "indexedDbErrorTitle": "Masalah dengan mode privat", - "indexedDbErrorLong": "Penyimpanan pesan sayangnya tidak diaktifkan dalam mode privat secara default.\nMohon kunjungi\n- about:config\n- tetapkan dom.indexedDB.privateBrowsing.enabled ke true\nJika tidak ditetapkan, FluffyChat tidak akan dapat dijalankan.", "dehydrate": "Ekspor sesi dan bersihkan perangkat", "dehydrateWarning": "Tindakan ini tidak dapat diurungkan. Pastikan kamu telah menyimpan file cadangan dengan aman.", - "dehydrateTor": "Pengguna Tor: Ekspor sesi", - "hydrateTorLong": "Apakah kamu mengekspor sesimu terakhir kali di Tor? Impor dengan cepat dan lanjut mengobrol.", - "dehydrateTorLong": "Pengguna Tor disarankan untuk mengekspor sesi sebelum menutup jendela.", - "hydrateTor": "Pengguna Tor: Impor eksporan sesi", "custom": "Kustom", "user": "Pengguna", "confirmMatrixId": "Mohon konfirmasi ID Matrix Anda untuk menghapus akun Anda.", @@ -2293,31 +2051,13 @@ "commandHint_markasdm": "Tandai sebagai ruangan pesan langsung untuk ID Matrix yang ditentukan", "commandHint_markasgroup": "Tandai sebagai grup", "screenSharingTitle": "membagikan layar", - "appearOnTopDetails": "Memperbolehkan aplikasi untuk ditampilkan di atas (tidak dibutuhkan jika kamu memiliki FluffyChat ditetapkan sebagai akun pemanggilan)", - "callingAccountDetails": "Memperbolehkan FluffyChat untuk menggunakan aplikasi penelepon Android bawaan.", "noKeyForThisMessage": "Hal ini bisa terjadi jika pesan dikirim sebelum kamu masuk ke akunmu di perangkat ini.\n\nMungkin juga pengirim telah memblokir perangkatmu atau ada yang tidak beres dengan koneksi internet.\n\nApakah kamu bisa membaca pesan pada sesi lain? Maka kamu bisa mentransfer pesan dari sesi tersebut! Buka Pengaturan > Perangkat dan pastikan bahwa perangkat Anda telah ditandatangani secara silang. Ketika kamu membuka ruangan di lain waktu dan kedua sesi berada di latar depan, kunci akan ditransmisikan secara otomatis.\n\nApakah kamu tidak mau kehilangan kunci saat keluar atau berpindah perangkat? Pastikan bahwa kamu telah mengaktifkan cadangan obrolan dalam pengaturan.", "foregroundServiceRunning": "Notifikasi ini ditampilkan ketika layanan latar depan berjalan.", - "callingPermissions": "Perizinan panggilan", - "appearOnTop": "Tampilkan di atas", - "callingAccount": "Akun pemanggilan", - "otherCallingPermissions": "Mikrofon, kamera dan perizinan FluffyChat lainnya", "whyIsThisMessageEncrypted": "Mengapa pesan ini tidak bisa dibaca?", "newGroup": "Grup baru", "newSpace": "Space baru", - "enterSpace": "Masuk space", - "enterRoom": "Masuk ruangan", "allSpaces": "Semua space", "screenSharingDetail": "Kamu membagikan layarmu di FluffyChat", - "numChats": "{number} obrolan", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Sembunyikan peristiwa keadaan yang tidak penting", "doNotShowAgain": "Jangan tampilkan lagi", "hugContent": "{senderName} memeluk kamu", "@hugContent": { @@ -2358,7 +2098,6 @@ } } }, - "startFirstChat": "Mulai obrolan pertamamu", "newSpaceDescription": "Fitur space bisa membantu untuk memisahkan obrolanmu dan membuat komunitas pribadi atau publik.", "sorryThatsNotPossible": "Maaf... itu tidak mungkin", "deviceKeys": "Kunci perangkat:", @@ -2381,24 +2120,8 @@ "readUpToHere": "Baca sampai sini", "jump": "Lompat", "openLinkInBrowser": "Buka tautan dalam peramban", - "allRooms": "Semua Percakapan Grup", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "report": "laporkan", "reportErrorDescription": "😭 Aduh. Ada yang salah. Jika kamu mau, kamu bisa melaporkan kutu ini kepada para pengembang.", - "signInWithPassword": "Masuk dengan kata sandi", - "pleaseTryAgainLaterOrChooseDifferentServer": "Silakan coba lagi nanti atau pilih server yang lain.", - "signInWith": "Masuk dengan {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "notAnImage": "Bukan berkas gambar.", "importNow": "Impor sekarang", "importFromZipFile": "Impor dari berkas .zip", @@ -2407,13 +2130,10 @@ "importEmojis": "Impor Emoji", "sendTypingNotifications": "Kirim notifikasi pengetikan", "createGroup": "Buat grup", - "inviteContactToGroupQuestion": "Apakah kamu ingin mengundang {contact} ke obrolan \"{groupName}\"?", "tryAgain": "Coba ulang", "messagesStyle": "Pesan:", "shareInviteLink": "Bagikan tautan undangan", - "setTheme": "Atur tema:", "invalidServerName": "Nama server tidak valid", - "addChatDescription": "Tambahkan deskripsi obrolan...", "chatPermissions": "Perizinan obrolan", "chatDescription": "Deskripsi obrolan", "chatDescriptionHasBeenChanged": "Deskripsi obrolan diubah", @@ -2443,11 +2163,9 @@ } }, "setChatDescription": "Lihat deskripsi obrolan", - "profileNotFound": "Pengguna ini tidak dapat ditemukan di server. Mungkin ada masalah koneksi atau penggunanya tidak ada.", "setColorTheme": "Atur tema warna:", "invite": "Undang", "inviteGroupChat": "📨 Undangan percakapan grup", - "invitePrivateChat": "📨 Undangan percakapan privat", "emoteKeyboardNoRecents": "Emote yang telah digunakan akan muncul di sini...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2543,34 +2261,12 @@ } } }, - "databaseBuildErrorBody": "Tidak dapat membangun basis data SQLite. Aplikasi mencoba menggunakan basis data lawas untuk sekarang. Silakan laporkan kesalahan ini kepada pengembang di {url}. Pesan kesalahannya adalah: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "passwordIsWrong": "Kata sandi yang kamu masukkan salah", "searchChatsRooms": "Cari #percakapan, @pengguna...", "createGroupAndInviteUsers": "Buat sebuah grup dan undang pengguna", "pleaseEnterYourCurrentPassword": "Silakan masukkan kata sandimu saat ini", "passwordsDoNotMatch": "Kata sandi tidak cocok", - "publicLink": "Tautan publik", "sendTypingNotificationsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu sedang mengetik sebuah pesan baru.", - "forwardMessageTo": "Teruskan pesan ke {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "Kirim laporan dibaca", "formattedMessages": "Pesan yang diformat", "verifyOtherUser": "🔐 Verifikasi pengguna lain", @@ -2598,24 +2294,11 @@ } } }, - "presenceStyle": "Presensi:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Tampilkan pesan status dari pengguna lain", "@presencesToggle": { "type": "String", "placeholders": {} }, - "youInvitedToBy": "📩 Kamu telah diundang melalui surel ke:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "publicSpaces": "Space publik", "commandHint_sendraw": "Kirim JSON mentah", "sendReadReceiptsDescription": "Anggota lain dalam percakapan dapat melihat ketika kamu membaca sebuah pesan.", @@ -2627,11 +2310,8 @@ "transparent": "Transparan", "stickers": "Stiker", "discover": "Jelajahi", - "startConversation": "Mulai percakapan", "yourGlobalUserIdIs": "ID pengguna globalmu adalah: ", "select": "Pilih", - "subspace": "Subspace", - "decline": "Tolak", "nothingFound": "Tidak ada yang ditemukan...", "thisDevice": "Perangkat ini:", "newPassword": "Kata sandi baru", @@ -2676,23 +2356,11 @@ "calls": "Panggilan", "customEmojisAndStickers": "Emoji dan stiker kustom", "hideRedactedMessagesBody": "Jika seseorang menghapus pesan, pesannya tidak akan terlihat lagi dalam obrolan.", - "hideMemberChangesInPublicChatsBody": "Jangan tampilkan dalam lini masa obrolan jika seseorang bergabung atau keluar dari obrolan untuk meningkatkan keterlihatan.", - "notifyMeFor": "Beri tahu aku untuk", "hideInvalidOrUnknownMessageFormats": "Sembunyikan format pesan yang tidak valid atau tidak diketahui", - "hideMemberChangesInPublicChats": "Sembunyikan perubahan anggota dalam obrolan publik", "overview": "Ikhtisar", "passwordRecoverySettings": "Pengaturan pemulihan kata sandi", "usersMustKnock": "Pengguna harus mengetuk", "noOneCanJoin": "Tidak ada siapa pun yang dapat bergabung", - "userWouldLikeToChangeTheChat": "{user} ingin bergabung dengan obrolan.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Belum ada tautan publik yang dibuat", "knock": "Ketuk", "knocking": "Mengetuk", "chatCanBeDiscoveredViaSearchOnServer": "Obrolan dapat ditemukan melalui pencarian di {server}", @@ -2711,16 +2379,6 @@ }, "publicChatAddresses": "Alamat obrolan umum", "createNewAddress": "Buat alamat baru", - "userRole": "Peran pengguna", - "minimumPowerLevel": "{level} adalah tingkat daya minimum.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "swipeRightToLeftToReply": "Usap dari kanan ke kiri untuk membalas", "searchMore": "Cari lebih banyak...", "gallery": "Galeri", @@ -2804,29 +2462,14 @@ } }, "changeGeneralChatSettings": "Ubah pengaturan chat umum", - "discoverHomeservers": "Jelajahi homeserver", "loginWithMatrixId": "Masuk dengan ID Matrix", "doesNotSeemToBeAValidHomeserver": "Sepertinya bukan homeserver yang kompatibel. URL salah?", - "countChatsAndCountParticipants": "{chats} chat dan {participants} anggota", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "unread": "Tidak dibaca", "space": "Space", "spaces": "Space", - "joinedChats": "Bergabung chat", "noMoreChatsFound": "Tidak ada chat lagi yang ditemukan...", "generatingVideoThumbnail": "Membuat gambar kecil video...", "changelog": "Catatan perubahan", - "whatIsAHomeserver": "Apa itu homeserver?", "sendRoomNotifications": "Kirim notifikasi @room", "updateInstalled": "🎉 Pembaruan {version} terpasang!", "@updateInstalled": { @@ -2848,7 +2491,6 @@ } }, "chatPermissionsDescription": "Tentukan tingkat kekuasaan yang diperlukan untuk tindakan tertentu dalam chat ini. Tingkat kekuasaan 0, 50 dan 100 biasanya mewakili pengguna, moderator dan admin, tetapi gradasi apa pun dimungkinkan.", - "homeserverDescription": "Semua data Anda disimpan di dalam server, seperti halnya penyedia email. Anda dapat memilih homeserver mana yang ingin Anda gunakan, sementara Anda masih dapat berkomunikasi dengan semua orang. Pelajari lebih lanjut di https://matrix.org.", "oneOfYourDevicesIsNotVerified": "Salah satu perangkat Anda tidak terverifikasi", "noticeChatBackupDeviceVerification": "Catatan: Ketika Anda menghubungkan semua perangkat Anda ke cadangan chat, mereka akan diverifikasi secara otomatis.", "welcomeText": "Halo 👋 Ini FluffyChat. Kamu bisa masuk ke homeserver mana pun, yang kompatibel dengan https://matrix.org. Lalu, chat dengan siapa pun. Ini merupakan jaringan perpesanan besar yang terdesentralisasi!", @@ -2950,7 +2592,6 @@ "allDevices": "Semua perangkat", "crossVerifiedDevices": "Perangkat terverifikasi silang", "waitingForServer": "Menunggu server...", - "appIntroduction": "FluffyChat memungkinkanmu untuk mengobrol dengan teman-temanmu di berbagai perpesanan. Pelajari lebih lanjut di https://matrix.org atau ketuk *Lanjutkan* saja.", "notificationRuleContainsDisplayNameDescription": "Memberi tahu pengguna ketika pesan berisi nama tampilannya.", "shareKeysWith": "Bagikan kunci dengan...", "synchronizingPleaseWaitCounter": " Sinkronisasi… ({percentage}%)", @@ -2985,10 +2626,7 @@ "enterNewChat": "Masuk ke obrolan baru", "commandHint_roomupgrade": "Tingkatkan ruangan ini ke versi ruangan yang ditentukan", "pleaseWaitUntilInvited": "Silakan menunggu sampai seseorang dari ruangan mengundang Anda.", - "setCustomPermissionLevel": "Atur tingkat perizinan kustom", - "setPermissionsLevelDescription": "Silakan pilih peran yang sudah ditentukan di bawah atau masukkan tingkat perizinan kustom antara 0 dan 100.", "ignoreUser": "Abaikan pengguna", - "normalUser": "Pengguna biasa", "approve": "Terima", "youHaveKnocked": "Anda telah mengetuk", "sentVoiceMessage": "🎙️ {duration} - Pesan suara dari {sender}", @@ -3025,10 +2663,6 @@ "resume": "Lanjut", "changedTheChatDescription": "{username} mengubah deskripsi obrolan", "changedTheChatName": "{username} mengubah nama obrolan", - "newSubSpace": "Sub space baru", - "moveToDifferentSpace": "Pindahkan ke space berbeda", - "moveUp": "Pindah ke atas", - "moveDown": "Pindah ke bawah", "removeFromSpaceDescription": "Obrolan akan dihapus dari space tetapi masih muncul di daftar obrolan Anda.", "countChats": "{chats} obrolan", "@countChats": { @@ -3071,7 +2705,6 @@ "startPoll": "Mulai polling", "endPoll": "Akhiri polling", "answersVisible": "Jawaban terlihat", - "answersHidden": "Jawaban tersembunyi", "pollQuestion": "Pertanyaan polling", "answerOption": "Opsi jawaban", "addAnswerOption": "Tambah opsi jawaban", @@ -3143,4 +2776,4 @@ "signInGreeting": "Anda sudah memiliki akun di Matrix? Selamat datang kembali! Pilih homeserver Anda dan masuk.", "appIntro": "Dengan FluffyChat Anda dapat mengobrol dengan teman-teman Anda. Ini adalah messenger [matrix] terdesentralisasi yang aman! Pelajari lebih lanjut di https://matrix.org jika Anda suka atau cukup daftar.", "theProcessWasCanceled": "Proses dibatalkan." -} +} \ No newline at end of file diff --git a/lib/l10n/intl_ie.arb b/lib/l10n/intl_ie.arb index 20258f7c..41f899c8 100644 --- a/lib/l10n/intl_ie.arb +++ b/lib/l10n/intl_ie.arb @@ -4,21 +4,11 @@ "type": "String", "placeholders": {} }, - "identity": "Identitá", - "@identity": { - "type": "String", - "placeholders": {} - }, "close": "Cluder", "@close": { "type": "String", "placeholders": {} }, - "confirm": "Confirmar", - "@confirm": { - "type": "String", - "placeholders": {} - }, "admin": "Administrator", "@admin": { "type": "String", @@ -29,16 +19,6 @@ "type": "String", "placeholders": {} }, - "containsUserName": "Contene li nómine", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "Contene li visibil nómine", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "copiedToClipboard": "Copiat al Paperiere", "@copiedToClipboard": { "type": "String", @@ -120,11 +100,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Provide vor hem-servitor", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "fromTheInvitation": "Pro invitation", "@fromTheInvitation": { "type": "String", @@ -180,11 +155,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Invitationes por me", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "lastActiveAgo": "Ultim activité: {localizedTimeShort}", "@lastActiveAgo": { "type": "String", @@ -229,11 +199,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Cambios inter membres", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "muteChat": "Assurdar li conversation", "@muteChat": { "type": "String", @@ -276,11 +241,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Ples selecter", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pushRules": "Regules de push-notificationes", "@pushRules": { "type": "String", @@ -291,11 +251,6 @@ "type": "String", "placeholders": {} }, - "removeDevice": "Remover li aparate", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "saveFile": "Gardar li file", "@saveFile": { "type": "String", @@ -328,11 +283,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "Marcar quam (ín)leet", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "unblockDevice": "Deblocar li aparate", "@unblockDevice": { "type": "String", @@ -348,11 +298,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Tapete", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "messageType": "Tip de missage", "@messageType": {}, "start": "Iniciar", @@ -361,23 +306,10 @@ "@messageInfo": {}, "openGallery": "Aperter li galerie", "@openGallery": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "reportUser": "Raportar li usator", "@reportUser": {}, "voiceCall": "Telefonada", "@voiceCall": {}, - "nextAccount": "Sequent conto", - "@nextAccount": {}, - "previousAccount": "Precedent conto", - "@previousAccount": {}, "countFiles": "{count} files", "@countFiles": { "placeholders": { @@ -396,11 +328,6 @@ "type": "String", "placeholders": {} }, - "connect": "Conexer", - "@connect": { - "type": "String", - "placeholders": {} - }, "copy": "Copiar", "@copy": { "type": "String", @@ -421,11 +348,6 @@ "type": "String", "placeholders": {} }, - "rejoin": "Re-adherer", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Remover", "@remove": { "type": "String", @@ -441,21 +363,6 @@ "type": "String", "placeholders": {} }, - "dateWithYear": "{day}.{month}.{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "delete": "Remover", "@delete": { "type": "String", @@ -538,8 +445,6 @@ }, "time": "Hora", "@time": {}, - "publish": "Publicar", - "@publish": {}, "sender": "Autor", "@sender": {}, "dismiss": "Demisser", @@ -548,8 +453,6 @@ "@custom": {}, "emojis": "Emoji", "@emojis": {}, - "widgetCustom": "Personalisat", - "@widgetCustom": {}, "users": "Usatores", "@users": {}, "user": "Usator", @@ -584,11 +487,6 @@ "type": "String", "placeholders": {} }, - "license": "Licentie", - "@license": { - "type": "String", - "placeholders": {} - }, "or": "O", "@or": { "type": "String", @@ -606,11 +504,6 @@ "type": "String", "placeholders": {} }, - "people": "Homes", - "@people": { - "type": "String", - "placeholders": {} - }, "pin": "Fixar", "@pin": { "type": "String", @@ -732,11 +625,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Inviar li originale", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "theyMatch": "Corresponde", "@theyMatch": { "type": "String", @@ -752,8 +640,6 @@ "type": "String", "placeholders": {} }, - "addWidget": "Adjunter un widget", - "@addWidget": {}, "addAccount": "Adjunter un conto", "@addAccount": {}, "publicRooms": "Public chambres", @@ -776,11 +662,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Inviar un nota adhesiv", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "setStatus": "Assignar li statu", "@setStatus": { "type": "String", @@ -845,11 +726,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Missages de robots", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "changeDeviceName": "Cambiar li nómine de aparate", "@changeDeviceName": { "type": "String", @@ -894,8 +770,6 @@ "@commandInvalid": { "type": "String" }, - "widgetEtherpad": "Textual nota", - "@widgetEtherpad": {}, "banFromChat": "Bannir del conversation", "@banFromChat": { "type": "String", @@ -908,14 +782,8 @@ }, "commandHint_markasgroup": "Marcar quam gruppe", "@commandHint_markasgroup": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "screenSharingTitle": "partir li ecran", "@screenSharingTitle": {}, - "callingPermissions": "Permissiones de telefonada", - "@callingPermissions": {}, - "callingAccount": "Conto telefonante", - "@callingAccount": {}, "bannedUser": "{username} ha bannit {targetName}", "@bannedUser": { "type": "String", @@ -1028,39 +896,11 @@ } } }, - "badServerVersionsException": "Li hem-servitor supporta ti versiones de specification:\n{serverVersions}\nMa ti-ci application supporta solmen {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "device": "Aparate", "@device": { "type": "String", "placeholders": {} }, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetName": "Nómine", - "@widgetName": {}, "account": "Conto", "@account": { "type": "String", @@ -1112,21 +952,8 @@ "@newGroup": {}, "newSpace": "Crear un spacie", "@newSpace": {}, - "enterSpace": "Intrar li spacie", - "@enterSpace": {}, - "enterRoom": "Intrar li chambre", - "@enterRoom": {}, "allSpaces": "Omni spacies", "@allSpaces": {}, - "numChats": "{number} conversationes", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "logout": "Cluder li session", "@logout": { "type": "String", @@ -1202,20 +1029,12 @@ "placeholders": {} }, "@jumpToLastReadMessage": {}, - "@allRooms": { - "type": "String", - "placeholders": {} - }, "@commandHint_cuddle": {}, "@noEncryptionForPublicRooms": { "type": "String", "placeholders": {} }, "@reportErrorDescription": {}, - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "@inviteContactToGroup": { "type": "String", "placeholders": { @@ -1224,7 +1043,6 @@ } } }, - "@chatHasBeenAddedToThisSpace": {}, "@removeYourAvatar": { "type": "String", "placeholders": {} @@ -1234,12 +1052,7 @@ "type": "String", "placeholders": {} }, - "@indexedDbErrorLong": {}, "@oneClientLoggedOut": {}, - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "@unsupportedAndroidVersionLong": {}, "@kicked": { "type": "String", @@ -1268,7 +1081,6 @@ "type": "String", "placeholders": {} }, - "@startFirstChat": {}, "@sentAPicture": { "type": "String", "placeholders": { @@ -1293,10 +1105,6 @@ "type": "String", "description": "Usage hint for the command /create" }, - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "@sentAFile": { "type": "String", "placeholders": { @@ -1380,10 +1188,6 @@ } } }, - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "@tryAgain": {}, "@areGuestsAllowedToJoin": { "type": "String", @@ -1425,7 +1229,6 @@ } }, "@youRejectedTheInvitation": {}, - "@otherCallingPermissions": {}, "@messagesStyle": {}, "@couldNotDecryptMessage": { "type": "String", @@ -1435,11 +1238,8 @@ } } }, - "@widgetUrlError": {}, - "@emailOrUsername": {}, "@newSpaceDescription": {}, "@chatDescription": {}, - "@callingAccountDetails": {}, "@pleaseFollowInstructionsOnWeb": { "type": "String", "placeholders": {} @@ -1457,17 +1257,7 @@ "type": "String", "placeholders": {} }, - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "@reopenChat": {}, - "@pleaseEnterRecoveryKey": {}, - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "@widgetNameError": {}, "@addToBundle": {}, "@spaceIsPublic": { "type": "String", @@ -1501,7 +1291,6 @@ } } }, - "@hydrateTor": {}, "@pushNotificationsNotAvailable": {}, "@storeInAppleKeyChain": {}, "@replaceRoomWithNewerVersion": { @@ -1520,7 +1309,6 @@ "type": "String", "placeholders": {} }, - "@signInWithPassword": {}, "@changedTheGuestAccessRulesTo": { "type": "String", "placeholders": { @@ -1557,21 +1345,9 @@ "type": "String", "placeholders": {} }, - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "@saveKeyManuallyDescription": {}, "@editBundlesForAccount": {}, "@whyIsThisMessageEncrypted": {}, - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "@rejectedTheInvitation": { "type": "String", "placeholders": { @@ -1596,14 +1372,6 @@ "type": "String", "placeholders": {} }, - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "@storeSecurlyOnThisDevice": {}, "@yourChatBackupHasBeenSetUp": {}, "@redactedBy": { @@ -1647,14 +1415,6 @@ } } }, - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "@changedTheRoomAliases": { "type": "String", "placeholders": { @@ -1753,14 +1513,6 @@ } } }, - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "@setAsCanonicalAlias": { "type": "String", "placeholders": {} @@ -1800,7 +1552,6 @@ "type": "String", "placeholders": {} }, - "@inviteContactToGroupQuestion": {}, "@redactedByBecause": { "type": "String", "placeholders": { @@ -1819,7 +1570,6 @@ } } }, - "@appearOnTopDetails": {}, "@roomHasBeenUpgraded": { "type": "String", "placeholders": {} @@ -1921,7 +1671,6 @@ "type": "String", "placeholders": {} }, - "@dehydrateTorLong": {}, "@yourPublicKey": { "type": "String", "placeholders": {} @@ -1957,7 +1706,6 @@ "placeholders": {} }, "@serverRequiresEmail": {}, - "@hideUnimportantStateEvents": {}, "@sentCallInformations": { "type": "String", "placeholders": { @@ -1966,7 +1714,6 @@ } } }, - "@addToSpaceDescription": {}, "@googlyEyesContent": { "type": "String", "placeholders": { @@ -1994,7 +1741,6 @@ "type": "String", "placeholders": {} }, - "@addChatDescription": {}, "@sentAnAudio": { "type": "String", "placeholders": { @@ -2051,8 +1797,6 @@ }, "@sendTypingNotifications": {}, "@inviteGroupChat": {}, - "@appearOnTop": {}, - "@invitePrivateChat": {}, "@verifyTitle": { "type": "String", "placeholders": {} @@ -2113,7 +1857,6 @@ "@notAnImage": {}, "@chatDescriptionHasBeenChanged": {}, "@bundleName": {}, - "@dehydrateTor": {}, "@removeFromSpace": {}, "@commandHint_op": { "type": "String", @@ -2159,7 +1902,6 @@ } } }, - "@profileNotFound": {}, "@jump": {}, "@reactedWith": { "type": "String", @@ -2209,10 +1951,6 @@ "type": "String", "placeholders": {} }, - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "@startedACall": { "type": "String", "placeholders": { @@ -2225,20 +1963,11 @@ "type": "String", "placeholders": {} }, - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "@visibilityOfTheChatHistory": { "type": "String", "placeholders": {} }, - "@setTheme": {}, "@youJoinedTheChat": {}, - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "@chatBackupDescription": { "type": "String", "placeholders": {} @@ -2256,7 +1985,6 @@ } } }, - "@errorAddingWidget": {}, "@commandHint_dm": { "type": "String", "description": "Usage hint for the command /dm" @@ -2307,9 +2035,7 @@ "placeholders": {} }, "@commandHint_googly": {}, - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "@createGroup": {}, - "@hydrateTorLong": {}, "@contentHasBeenReported": { "type": "String", "placeholders": {} @@ -2322,10 +2048,6 @@ "placeholders": {} }, "@importNow": {}, - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "@pinMessage": {}, "@screenSharingDetail": {}, "@invite": {}, @@ -2334,7 +2056,6 @@ "type": "String", "placeholders": {} }, - "@indexedDbErrorTitle": {}, "@endedTheCall": { "type": "String", "placeholders": { @@ -2343,4 +2064,4 @@ } } } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_it.arb b/lib/l10n/intl_it.arb index 6009bfa3..6ad2b9c5 100644 --- a/lib/l10n/intl_it.arb +++ b/lib/l10n/intl_it.arb @@ -118,18 +118,6 @@ } } }, - "badServerVersionsException": "L'homeserver supporta le versioni Spec:\n{serverVersions}\nMa questa applicazione supporta solo {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Bandisci dalla chat", "@banFromChat": { "type": "String", @@ -162,11 +150,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Messaggi bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Annulla", "@cancel": { "type": "String", @@ -396,31 +379,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Conferma", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Connetti", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Il contatto è stato invitato nel gruppo", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Contiene nome visibile", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Contiene nome utente", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Il contenuto è stato segnalato agli amministratori del server", "@contentHasBeenReported": { "type": "String", @@ -495,33 +458,6 @@ } } }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Disabiliterà il tuo account. Non puoi tornare indietro! Sei sicuro/a?", "@deactivateAccountWarning": { "type": "String", @@ -622,11 +558,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Devi scegliere una scorciatoia emote e aggiungere un immagine!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Discussione vuota", "@emptyChat": { "type": "String", @@ -676,11 +607,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Inserisci il tuo server principale", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "Tutto pronto!", "@everythingReady": { "type": "String", @@ -721,11 +647,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Vai nella nuova stanza", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Gruppo", "@group": { "type": "String", @@ -797,11 +718,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identità", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignora", "@ignore": { "type": "String", @@ -863,11 +779,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Invita per me", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} ti ha invitato/a a FluffyChat.\n1. Visita fluffychat.im e installa l'applicazione\n2. Iscriviti o accedi\n3. Apri il collegamento di invito: \n {link}", "@inviteText": { "type": "String", @@ -947,11 +858,6 @@ "type": "String", "placeholders": {} }, - "license": "Licenza", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Chiaro", "@lightTheme": { "type": "String", @@ -995,11 +901,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Cambiamenti di membri", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Menzione", "@mention": { "type": "String", @@ -1095,11 +996,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notifiche abilitate per questo account", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} utenti stanno scrivendo…", "@numUsersTyping": { "type": "String", @@ -1179,11 +1075,6 @@ "type": "String", "placeholders": {} }, - "people": "Persone", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Scegli un'immagine", "@pickImage": { "type": "String", @@ -1286,11 +1177,6 @@ } } }, - "rejoin": "Riunisciti", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Rimuovi", "@remove": { "type": "String", @@ -1310,11 +1196,6 @@ } } }, - "removeDevice": "Rimuovi il dispositivo", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Rimuovi il ban dalla chat", "@unbanFromChat": { "type": "String", @@ -1360,15 +1241,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Visto da {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Invia", "@send": { "type": "String", @@ -1399,11 +1271,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Invia l'originale", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Invia un video", "@sendVideo": { "type": "String", @@ -1463,21 +1330,6 @@ } } }, - "setCustomEmotes": "Imposta emoticon personalizzate", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Imposta il collegamento di invito", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Imposta il livello di autorizzazione", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Imposta lo stato", "@setStatus": { "type": "String", @@ -1562,21 +1414,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Attiva/disattiva preferito", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Attiva/disattiva il silenziatore", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Segna come letto / non letto", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Troppe richieste. Per favore riprova più tardi!", "@tooManyRequestsWarning": { "type": "String", @@ -1643,15 +1480,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 discussione non letta} other{{unreadCount} discussioni non lette}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} e {count} altri stanno scrivendo…", "@userAndOthersAreTyping": { "type": "String", @@ -1776,11 +1604,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Immagine di sfondo:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Attenzione!", "@warning": { "type": "String", @@ -1846,11 +1669,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Accesso singolo", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Imposta come alias principale", "@setAsCanonicalAlias": { "type": "String", @@ -1871,11 +1689,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Si prega di scegliere", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "or": "O", "@or": { "type": "String", @@ -1915,11 +1728,6 @@ "type": "String", "description": "Usage hint for the command /ban" }, - "sendSticker": "Invia adesivo", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "commandHint_html": "Invia testo formattato in HTML", "@commandHint_html": { "type": "String", @@ -2002,11 +1810,6 @@ }, "jumpToLastReadMessage": "Salta all'ultimo messaggio letto", "@jumpToLastReadMessage": {}, - "allRooms": "Tutte le chat di gruppo", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "obtainingLocation": "Ottengo la posizione…", "@obtainingLocation": { "type": "String", @@ -2014,32 +1817,18 @@ }, "commandHint_cuddle": "Invia una coccola", "@commandHint_cuddle": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, "dismiss": "Chiudi", "@dismiss": {}, "reportErrorDescription": "😭 Oh no. Qualcosa è andato storto. Se vuoi, puoi segnalare questo bug agli sviluppatori.", "@reportErrorDescription": {}, - "chatHasBeenAddedToThisSpace": "La chat è stata aggiunta a questo spazio", - "@chatHasBeenAddedToThisSpace": {}, "unsupportedAndroidVersion": "Versione di Android non supportata", "@unsupportedAndroidVersion": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "messageType": "Tipo del Messaggio", "@messageType": {}, - "indexedDbErrorLong": "Sfortunatamente l'archiviazione dei messaggi non è abilitata in modalità privata per impostazione predefinita.\nPer favore visita\n - about:config\n - imposta dom.indexedDB.privateBrowsing.enabled su true\nAltrimenti, non è possibile eseguire FluffyChat.", - "@indexedDbErrorLong": {}, "oneClientLoggedOut": "Uno dei tuoi client è stato disconnesso", "@oneClientLoggedOut": {}, - "startFirstChat": "Inizia la tua prima chat", - "@startFirstChat": {}, - "callingAccount": "Account di chiamata", - "@callingAccount": {}, "setColorTheme": "Imposta tema colore:", "@setColorTheme": {}, - "nextAccount": "Account successivo", - "@nextAccount": {}, "commandHint_create": "Crea una chat di gruppo vuota\nUtilizza --no-encryption per disattivare la criptazione", "@commandHint_create": { "type": "String", @@ -2082,15 +1871,8 @@ }, "banUserDescription": "L'utente sarà bannato dalla chat e non sarà in grado di rientrare finché non verrà sbannato.", "@banUserDescription": {}, - "widgetEtherpad": "Nota di testo", - "@widgetEtherpad": {}, "removeDevicesDescription": "Sarai disconnesso da questo dispositivo e non potrai più ricevere messaggi.", "@removeDevicesDescription": {}, - "separateChatTypes": "Separare le chat dirette e i gruppi", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "tryAgain": "Riprova", "@tryAgain": {}, "youKickedAndBanned": "🙅 Hai rimosso e bannato {user}", @@ -2107,32 +1889,16 @@ "@sendOnEnter": {}, "youRejectedTheInvitation": "Hai rifiutato l'invito", "@youRejectedTheInvitation": {}, - "otherCallingPermissions": "Microfono, fotocamera e altri permessi di FluffyChat", - "@otherCallingPermissions": {}, "messagesStyle": "Messaggi:", "@messagesStyle": {}, - "widgetUrlError": "Questo non è un URL valido.", - "@widgetUrlError": {}, - "emailOrUsername": "Email o nome utente", - "@emailOrUsername": {}, "newSpaceDescription": "Gli spazi ti permettono di consolidare le tue chat e di creare comunità private o pubbliche.", "@newSpaceDescription": {}, "chatDescription": "Descrizione della chat", "@chatDescription": {}, - "callingAccountDetails": "Dai l'autorizzazione a FluffyChat di usare l'app di composizione Android nativa.", - "@callingAccountDetails": {}, - "enterSpace": "Unirsi allo spazio", - "@enterSpace": {}, "encryptThisChat": "Cifra questa chat", "@encryptThisChat": {}, - "previousAccount": "Account precedente", - "@previousAccount": {}, "reopenChat": "Riapri la chat", "@reopenChat": {}, - "pleaseEnterRecoveryKey": "Per favore inserisci la tua chiave di recupero:", - "@pleaseEnterRecoveryKey": {}, - "widgetNameError": "Per favore fornire un nome da visualizzare.", - "@widgetNameError": {}, "addToBundle": "Aggiungi al bundle", "@addToBundle": {}, "spaceIsPublic": "Lo spazio è pubblico", @@ -2140,8 +1906,6 @@ "type": "String", "placeholders": {} }, - "addWidget": "Aggiungi widget", - "@addWidget": {}, "countFiles": "{count} file", "@countFiles": { "placeholders": { @@ -2163,8 +1927,6 @@ } } }, - "hydrateTor": "Utenti TOR: Importa l'esportazione della sessione", - "@hydrateTor": {}, "pushNotificationsNotAvailable": "Notifiche push non disponibili", "@pushNotificationsNotAvailable": {}, "storeInAppleKeyChain": "Salva nel portachiavi di Apple", @@ -2179,8 +1941,6 @@ "@sender": {}, "storeInAndroidKeystore": "Salva nel KeyStore di Android", "@storeInAndroidKeystore": {}, - "signInWithPassword": "Accedi con la password", - "@signInWithPassword": {}, "makeAdminDescription": "Una volta che fai questo utente amministratore, potresti non essere in grado di rimuoverlo, in quanto avrà i tuoi stessi privilegi.", "@makeAdminDescription": {}, "synchronizingPleaseWait": "Sincronizzazione... Attendere prego.", @@ -2223,36 +1983,16 @@ }, "videoCallsBetaWarning": "Nota che le video chiamate sono attualmente in beta. Potrebbero non funzionare come previsto o non funzionare del tutto su alcune piattaforme.", "@videoCallsBetaWarning": {}, - "signInWith": "Accedi con {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "fileIsTooBigForServer": "Impossibile inviare! Il server supporta solo allegati fino a {max}.", "@fileIsTooBigForServer": {}, "homeserver": "Homeserver", "@homeserver": {}, - "callingPermissions": "Permessi di chiamata", - "@callingPermissions": {}, "readUpToHere": "Letto fino a qui", "@readUpToHere": {}, "start": "Inizio", "@start": {}, "unlockOldMessages": "Sblocca i vecchi messaggi", "@unlockOldMessages": {}, - "numChats": "{number} chat", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "optionalRedactReason": "(Opzionale) Ragione per rimuovere questo messaggio...", "@optionalRedactReason": {}, "dehydrate": "Esporta la sessione e cancella il dispositivo", @@ -2266,21 +2006,10 @@ "@archiveRoomDescription": {}, "exportEmotePack": "Esporta pack di Emote come .zip", "@exportEmotePack": {}, - "switchToAccount": "Passa all'account {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "experimentalVideoCalls": "Video chiamate sperimentali", "@experimentalVideoCalls": {}, "pleaseEnterRecoveryKeyDescription": "Per sbloccare i tuoi vecchi messaggi, per favore inserisci la tua chiave di recupero che è stata generata nella tua sessione precedente. La tua chiave di recupero NON è la tua password.", "@pleaseEnterRecoveryKeyDescription": {}, - "inviteContactToGroupQuestion": "Vuoi invitare {contact} nella chat \"{groupName}\"?", - "@inviteContactToGroupQuestion": {}, "redactedByBecause": "Rimosso da {username} per: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2301,10 +2030,6 @@ } } }, - "appearOnTopDetails": "Permetti all'app di apparire in alto (non necessario se hai già impostato Fluffychat come account di chiamata)", - "@appearOnTopDetails": {}, - "enterRoom": "Unirsi alla stanza", - "@enterRoom": {}, "reportUser": "Segnala utente", "@reportUser": {}, "confirmEventUnpin": "Sei sicuro di voler permanentemente sfissare l'evento?", @@ -2347,8 +2072,6 @@ }, "invalidInput": "Contenuto non valido!", "@invalidInput": {}, - "dehydrateTorLong": "Per gli utenti TOR, è raccomandato esportare la sessione prima di chiudere la finestra.", - "@dehydrateTorLong": {}, "commandHint_myroomnick": "Imposta il nome visualizzato per questa stanza", "@commandHint_myroomnick": { "type": "String", @@ -2358,14 +2081,8 @@ "@doNotShowAgain": {}, "report": "segnala", "@report": {}, - "hideUnimportantStateEvents": "Nascondi gli eventi di stato non importanti", - "@hideUnimportantStateEvents": {}, "screenSharingTitle": "condivisione schermo", "@screenSharingTitle": {}, - "widgetCustom": "Personalizzati", - "@widgetCustom": {}, - "addToSpaceDescription": "Seleziona una spazio a cui aggiungere questa chat.", - "@addToSpaceDescription": {}, "googlyEyesContent": "{senderName} ti ha inviato degli occhi finti", "@googlyEyesContent": { "type": "String", @@ -2383,8 +2100,6 @@ } } }, - "addChatDescription": "Aggiungi una descrizione chat...", - "@addChatDescription": {}, "commandHint_myroomavatar": "Importa la foto profilo per questa stanza ( mxc-uri)", "@commandHint_myroomavatar": { "type": "String", @@ -2398,8 +2113,6 @@ } } }, - "publish": "Pubblicare", - "@publish": {}, "openLinkInBrowser": "Apri il collegamento nel browser", "@openLinkInBrowser": {}, "commandHint_react": "Rispondi con una reazione", @@ -2431,10 +2144,6 @@ "@sendTypingNotifications": {}, "inviteGroupChat": "📨 Invita a una chat di gruppo", "@inviteGroupChat": {}, - "appearOnTop": "Appare in alto", - "@appearOnTop": {}, - "invitePrivateChat": "📨 Invita a una chat privata", - "@invitePrivateChat": {}, "foregroundServiceRunning": "Questa notifica viene mostrata quando il servizio in primo piano è in esecuzione.", "@foregroundServiceRunning": {}, "voiceCall": "Chiamata vocale", @@ -2485,8 +2194,6 @@ "@newGroup": {}, "bundleName": "Nome del bundle", "@bundleName": {}, - "dehydrateTor": "Utenti TOR: Esporta la sessione", - "@dehydrateTor": {}, "removeFromSpace": "Rimuovi dallo spazio", "@removeFromSpace": {}, "commandHint_op": "Imposta il livello di privilegi dell'utente specificato (predefinito: 50)", @@ -2516,8 +2223,6 @@ } } }, - "profileNotFound": "Impossibile trovare l'utente sul server. Forse c'è un problema di connessione oppure l'utente non esiste.", - "@profileNotFound": {}, "jump": "Salta", "@jump": {}, "reactedWith": "{sender} ha reagito con {reaction}", @@ -2534,15 +2239,6 @@ }, "sorryThatsNotPossible": "Scusa... questo non è possibile", "@sorryThatsNotPossible": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "shareInviteLink": "Condividi link d'invito", "@shareInviteLink": {}, "commandHint_markasdm": "Contrassegna questo Matrix ID come stanza di messaggi diretti", @@ -2565,21 +2261,10 @@ "type": "String", "placeholders": {} }, - "setTheme": "Imposta tema:", - "@setTheme": {}, "youJoinedTheChat": "Sei entrato/a nella chat", "@youJoinedTheChat": {}, - "openVideoCamera": "Apri la fotocamera per un video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "markAsRead": "Segna come letto", "@markAsRead": {}, - "widgetName": "Nome", - "@widgetName": {}, - "errorAddingWidget": "Errore aggiungendo il widget.", - "@errorAddingWidget": {}, "commandHint_dm": "Avvia una chat diretta\nUsa --no-encryption per disabilitare la crittografia", "@commandHint_dm": { "type": "String", @@ -2603,12 +2288,8 @@ "@emojis": {}, "commandHint_googly": "Invia degli occhi finti", "@commandHint_googly": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Per favore riprova più tardi o scegli un server diverso.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "createGroup": "Crea gruppo", "@createGroup": {}, - "hydrateTorLong": "Hai esportato la tua sessione l'ultima volta con TOR? Importala velocemente e continua a chattare.", - "@hydrateTorLong": {}, "time": "Tempo", "@time": {}, "custom": "Personalizzato", @@ -2629,8 +2310,6 @@ "@invite": {}, "enableMultiAccounts": "(BETA) Abilita account multipli su questo dispositivo", "@enableMultiAccounts": {}, - "indexedDbErrorTitle": "Problemi con la modalità privata", - "@indexedDbErrorTitle": {}, "unsupportedAndroidVersionLong": "Questa funzionalità richiede una versione di Android più recente. Si prega di verificare la presenza di aggiornamenti o supporto per Lineage OS.", "@unsupportedAndroidVersionLong": {}, "storeSecurlyOnThisDevice": "Salva in modo sicuro su questo dispositivo", @@ -2647,8 +2326,6 @@ "@blockUsername": {}, "createGroupAndInviteUsers": "Crea un gruppo e invita gli utenti", "@createGroupAndInviteUsers": {}, - "startConversation": "Inizia una conversazione", - "@startConversation": {}, "groupCanBeFoundViaSearch": "Il gruppo può essere cercato", "@groupCanBeFoundViaSearch": {}, "noUsersFoundWithQuery": "Sfortunatamente non è stato trovato nessun utente con \"{query}\". Per favore controlla se hai fatto un errore di battitura.", @@ -2676,18 +2353,8 @@ "@searchChatsRooms": {}, "databaseMigrationBody": "Attendere prego. L'operazione potrebbe richiedere un momento.", "@databaseMigrationBody": {}, - "youInvitedToBy": "📩 Sei stato invitato tramite link in:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "addChatOrSubSpace": "Aggiungi chat o sottospazio", "@addChatOrSubSpace": {}, - "subspace": "Sottospazio", - "@subspace": {}, "publicSpaces": "Spazio pubblico", "@publicSpaces": {}, "hidePresences": "Nascondere l'elenco degli stati?", @@ -2696,18 +2363,6 @@ "@pleaseEnterYourCurrentPassword": {}, "passwordIsWrong": "La password inserita è sbagliata", "@passwordIsWrong": {}, - "databaseBuildErrorBody": "Impossibile costruire il database SQlite. L'applicazione proverà ad usare il database legacy per ora. Per favore segnala questo errore agli sviluppatori su {url}. Il messaggio di errore è: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "select": "Seleziona", "@select": {}, "newPassword": "Nuova password", @@ -2716,15 +2371,6 @@ "@pleaseChooseAStrongPassword": {}, "thisDevice": "Questo dispositivo:", "@thisDevice": {}, - "forwardMessageTo": "Inoltra messaggio in {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "verifyOtherUser": "🔐 Verifica altro utente", "@verifyOtherUser": {}, "verifyOtherUserDescription": "Se verifichi un altro utente, puoi essere certo di sapere a chi stai realmente scrivendo. 💪\n\nQuando inizi una verifica, tu e l'altro utente vedrete un popup nell'app. Lì vedrai una serie di emoji o numeri che dovrai confrontare tra loro.\n\nIl modo migliore per farlo è incontrarsi o avviare una videochiamata. 👭", @@ -2740,28 +2386,20 @@ "type": "String", "placeholders": {} }, - "publicLink": "Link pubblico", - "@publicLink": {}, "leaveEmptyToClearStatus": "Lascia vuoto per cancellare il tuo stato.", "@leaveEmptyToClearStatus": {}, - "decline": "Declina", - "@decline": {}, "transparent": "Trasparente", "@transparent": {}, "incomingMessages": "Messaggi in arrivo", "@incomingMessages": {}, "noChatsFoundHere": "Nessuna chat trovata. Inizia una nuova chat con qualcuno usando il pulsante qui sotto. ⤵️", "@noChatsFoundHere": {}, - "joinedChats": "Chat a cui partecipi", - "@joinedChats": {}, "unread": "Non letti", "@unread": {}, "space": "Spazio", "@space": {}, "spaces": "Spazi", "@spaces": {}, - "notifyMeFor": "Avvisami per", - "@notifyMeFor": {}, "invitedBy": "📩 Invitato da {user}", "@invitedBy": { "placeholders": { @@ -2776,29 +2414,10 @@ "@hideInvalidOrUnknownMessageFormats": {}, "overview": "Panoramica", "@overview": {}, - "presenceStyle": "Presenza:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "swipeRightToLeftToReply": "Scorri da destra a sinistra per rispondere", "@swipeRightToLeftToReply": {}, "globalChatId": "ID chat globale", "@globalChatId": {}, - "hideMemberChangesInPublicChats": "Nascondi le modifiche dei membri nelle chat pubbliche", - "@hideMemberChangesInPublicChats": {}, - "hideMemberChangesInPublicChatsBody": "Per migliorare la leggibilità, non mostrare nella cronologia della chat se qualcuno si unisce o abbandona una chat pubblica.", - "@hideMemberChangesInPublicChatsBody": {}, - "userWouldLikeToChangeTheChat": "{user} vorrebbe unirsi alla chat.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Non è stato ancora creato alcun link pubblico", - "@noPublicLinkHasBeenCreatedYet": {}, "appLockDescription": "Blocca l'app con un codice PIN quando non è in uso", "@appLockDescription": {}, "noOneCanJoin": "Nessuno può unirsi", @@ -2827,18 +2446,6 @@ "@passwordRecoverySettings": {}, "noMoreChatsFound": "Non sono state trovate altre chat...", "@noMoreChatsFound": {}, - "countChatsAndCountParticipants": "{chats} chat e {participants} partecipanti", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "stickers": "Adesivi", "@stickers": {}, "searchMore": "Cerca di più...", @@ -2929,17 +2536,6 @@ "@publicChatAddresses": {}, "createNewAddress": "Crea un nuovo indirizzo", "@createNewAddress": {}, - "userRole": "Ruolo utente", - "@userRole": {}, - "minimumPowerLevel": "{level} è il livello minimo di privilegi.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchIn": "Cerca nella chat \"{chat}\"...", "@searchIn": { "type": "String", @@ -3098,12 +2694,6 @@ "@changeGeneralChatSettings": {}, "loginWithMatrixId": "Accedi con il Matrix ID", "@loginWithMatrixId": {}, - "homeserverDescription": "Tutti i tuoi dati sono archiviati sull'homeserver, proprio come un provider di posta elettronica. Puoi scegliere quale homeserver vuoi usare, mentre puoi comunque comunicare con tutti. Scopri di più su https://matrix.org.", - "@homeserverDescription": {}, - "discoverHomeservers": "Scopri gli homeserver", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "Cos'è un homeserver?", - "@whatIsAHomeserver": {}, "changelog": "Registro delle modifiche", "@changelog": {}, "doesNotSeemToBeAValidHomeserver": "Non sembra essere un homeserver compatibile. URL sbagliato?", @@ -3297,8 +2887,6 @@ "@open": {}, "appWantsToUseForLoginDescription": "Con la presente consenti all'app e al sito web di condividere informazioni su di te.", "@appWantsToUseForLoginDescription": {}, - "appIntroduction": "FluffyChat ti consente di chattare con i tuoi amici attraverso diverse app di messaggistica. Ulteriori informazioni su https://matrix.org o semplicemente tocca *Continua*.", - "@appIntroduction": {}, "waitingForServer": "In attesa del server...", "@waitingForServer": {}, "synchronizingPleaseWaitCounter": " Sincronizzazione… ({percentage}%)", @@ -3332,14 +2920,8 @@ "@notSupportedOnThisDevice": {}, "enterNewChat": "Inizia nuova chat", "@enterNewChat": {}, - "setCustomPermissionLevel": "Imposta livello di permesso personalizzato", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Scegli un ruolo predefinito qui sotto o inserisci un livello di permesso personalizzato tra 0 e 100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Ignora utente", "@ignoreUser": {}, - "normalUser": "Utente normale", - "@normalUser": {}, "commandHint_roomupgrade": "Aggiorna questa stanza alla versione specificata", "@commandHint_roomupgrade": {}, "optionalMessage": "Messaggio (opzionale)...", @@ -3392,13 +2974,5 @@ "pause": "Pausa", "@pause": {}, "resume": "Riprendi", - "@resume": {}, - "newSubSpace": "Nuovo sotto sapzio", - "@newSubSpace": {}, - "moveToDifferentSpace": "Cambia spazio", - "@moveToDifferentSpace": {}, - "moveUp": "Muoviti sopra", - "@moveUp": {}, - "moveDown": "Muoviti sotto", - "@moveDown": {} -} + "@resume": {} +} \ No newline at end of file diff --git a/lib/l10n/intl_ja.arb b/lib/l10n/intl_ja.arb index a857c4c0..97ef471d 100644 --- a/lib/l10n/intl_ja.arb +++ b/lib/l10n/intl_ja.arb @@ -119,18 +119,6 @@ } } }, - "badServerVersionsException": "ホームサーバーでサポートされているバージョン:\n{serverVersions}\nアプリでは{supportedVersions}しかサポートされていません", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "チャットからBANする", "@banFromChat": { "type": "String", @@ -163,11 +151,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "ボットメッセージ", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "キャンセル", "@cancel": { "type": "String", @@ -398,31 +381,11 @@ "type": "String", "placeholders": {} }, - "confirm": "確認", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "接続", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "連絡先に登録された人が招待されました", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "表示名を含んでいます", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "ユーザー名を含んでいます", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "サーバー管理者に通報されました", "@contentHasBeenReported": { "type": "String", @@ -497,33 +460,6 @@ } } }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}/{month}/{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "あなたのアカウントを無効化します。この操作は元に戻せません!よろしいですか?", "@deactivateAccountWarning": { "type": "String", @@ -629,11 +565,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Emoteショートコードと画像を選択してください!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "空のチャット", "@emptyChat": { "type": "String", @@ -683,11 +614,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "ホームサーバーを入力してください", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "すべての準備は完了しました!", "@everythingReady": { "type": "String", @@ -728,11 +654,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "新規ルームへ", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "グループ", "@group": { "type": "String", @@ -804,11 +725,6 @@ "type": "String", "placeholders": {} }, - "identity": "アイデンティティ", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "無視する", "@ignore": { "type": "String", @@ -870,11 +786,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "自分への招待", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username}があなたをFluffyChatに招待しました。\n1. FluffyChatをインストール: fluffychat.im \n2. アカウントの作成、またはサインインを行う\n3. 招待リンクを開く\n {link}", "@inviteText": { "type": "String", @@ -954,11 +865,6 @@ "type": "String", "placeholders": {} }, - "license": "ライセンス", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "ライト", "@lightTheme": { "type": "String", @@ -1002,11 +908,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "メンバーの変更", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "メンション", "@mention": { "type": "String", @@ -1102,11 +1003,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "このアカウントでは通知が有効です", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count}人が入力中…", "@numUsersTyping": { "type": "String", @@ -1186,11 +1082,6 @@ "type": "String", "placeholders": {} }, - "people": "人々", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "画像を選択してください", "@pickImage": { "type": "String", @@ -1298,11 +1189,6 @@ } } }, - "rejoin": "再参加", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "消去", "@remove": { "type": "String", @@ -1322,11 +1208,6 @@ } } }, - "removeDevice": "デバイスの削除", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "チャットからのブロックを解除する", "@unbanFromChat": { "type": "String", @@ -1372,15 +1253,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "{username}が既読", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "送信", "@send": { "type": "String", @@ -1411,11 +1283,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "オリジナルの送信", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "動画を送信", "@sendVideo": { "type": "String", @@ -1480,21 +1347,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "カスタムエモートの設定", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "招待リンクを設定する", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "権限レベルをセット", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "ステータスの設定", "@setStatus": { "type": "String", @@ -1579,21 +1431,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "お気に入り切り替え", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "ミュート切り替え", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "既読/未読にマーク", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "リクエストが多すぎます。また後で試してみてください!", "@tooManyRequestsWarning": { "type": "String", @@ -1660,15 +1497,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1件の未読メッセージ} other{{unreadCount}件の未読メッセージ}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username}と他{count}名が入力しています…", "@userAndOthersAreTyping": { "type": "String", @@ -1793,11 +1621,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "壁紙:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "警告!", "@warning": { "type": "String", @@ -1891,7 +1714,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "このスペースにチャットが追加されました", "commandHint_ban": "このユーザーを禁止する", "@commandHint_ban": { "type": "String", @@ -1957,17 +1779,10 @@ "placeCall": "電話をかける", "voiceCall": "音声通話", "unsupportedAndroidVersionLong": "この機能を利用するには、より新しいAndroidのバージョンが必要です。アップデートまたはLineage OSのサポートをご確認ください。", - "widgetVideo": "動画", - "widgetName": "名称", - "widgetCustom": "カスタム", - "widgetJitsi": "Jitsi Meet", "dehydrateWarning": "この操作は元に戻せません。バックアップファイルを安全に保存してください。", "dehydrate": "セッションのエクスポートとデバイスの消去", "messageType": "メッセージの種類", "start": "開始", - "publish": "公開", - "indexedDbErrorTitle": "プライベートモードに関する問題", - "addWidget": "ウィジェットを追加", "youBannedUser": "{user} を禁止しました", "@youBannedUser": { "placeholders": { @@ -2010,11 +1825,6 @@ } } }, - "openVideoCamera": "ビデオ用にカメラを開く", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "link": "リンク", "or": "または", "@or": { @@ -2037,11 +1847,6 @@ "placeholders": {} }, "recoveryKey": "リカバリーキー", - "singlesignon": "シングルサインオン", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "spaceIsPublic": "スペースは公開されています", "@spaceIsPublic": { "type": "String", @@ -2052,37 +1857,13 @@ "type": "String", "placeholders": {} }, - "startFirstChat": "最初のチャットを開始する", - "addToSpaceDescription": "このチャットを追加するスペースを選択してください。", "messageInfo": "メッセージの情報", "openGallery": "ギャラリーを開く", "removeFromSpace": "スペースから削除", "pleaseEnterRecoveryKeyDescription": "古いメッセージを解除するには、以前のセッションで生成されたリカバリーキーを入力してください。リカバリーキーはパスワードではありません。", - "videoWithSize": "ビデオ ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "openChat": "チャットを開く", "experimentalVideoCalls": "実験的なビデオ通話", - "emailOrUsername": "メールアドレスまたはユーザー名", - "switchToAccount": "アカウント {number} に切り替える", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "次のアカウント", "youAcceptedTheInvitation": "👍 招待を承諾しました", - "errorAddingWidget": "ウィジェットの追加中にエラーが発生しました。", - "widgetNameError": "表示名を入力してください。", "youUnbannedUser": "{user} の禁止を解除しました", "@youUnbannedUser": { "placeholders": { @@ -2119,8 +1900,6 @@ "storeInAndroidKeystore": "Android KeyStoreに保存する", "storeInSecureStorageDescription": "このデバイスの安全なストレージにリカバリーキーを保存。", "unlockOldMessages": "古いメッセージのロックを解除する", - "callingAccount": "通話アカウント", - "callingPermissions": "通話の権限", "screenSharingTitle": "画面共有", "foregroundServiceRunning": "この通知は、フォアグラウンド サービスの実行中に表示されます。", "custom": "カスタム", @@ -2134,18 +1913,8 @@ }, "storeSecurlyOnThisDevice": "このデバイスに安全に保管する", "whyIsThisMessageEncrypted": "このメッセージが読めない理由", - "otherCallingPermissions": "マイク、カメラ、その他FluffyChatの権限", - "appearOnTopDetails": "アプリをトップに表示できるようにする(すでに通話アカウントとしてFluffychatを設定している場合は必要ありません)", - "dehydrateTorLong": "TOR ユーザーの場合、ウィンドウを閉じる前にセッションをエクスポートすることをお勧めします。", - "hydrateTorLong": "前回、TOR でセッションをエクスポートしましたか?すぐにインポートしてチャットを続けましょう。", "enableMultiAccounts": "(ベータ版) このデバイスで複数のアカウントを有効にする", - "pleaseEnterRecoveryKey": "リカバリーキーを入力してください。", "serverRequiresEmail": "このサーバーは、登録のためにメールアドレスを検証する必要があります。", - "sendSticker": "ステッカーを送る", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "synchronizingPleaseWait": "同期中...お待ちください。", "@synchronizingPleaseWait": { "type": "String", @@ -2185,7 +1954,6 @@ "type": "String", "placeholders": {} }, - "widgetUrlError": "有効なURLではありません。", "reportUser": "ユーザーを報告", "errorObtainingLocation": "位置情報の取得中にエラーが発生しました: {error}", "@errorObtainingLocation": { @@ -2197,12 +1965,6 @@ } }, "pinMessage": "部屋にピン留めする", - "previousAccount": "前のアカウント", - "pleaseChoose": "選択してください", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "oopsPushError": "おっと!残念ながら、プッシュ通知の設定中にエラーが発生しました。", "@oopsPushError": { "type": "String", @@ -2254,8 +2016,6 @@ "type": "String", "description": "Usage hint for the command /react" }, - "dehydrateTor": "TOR ユーザー: セッションをエクスポート", - "hydrateTor": "TOR ユーザー: セッションのエクスポートをインポート", "locationDisabledNotice": "位置情報サービスが無効になっています。位置情報を共有できるようにするには、位置情報サービスを有効にしてください。", "@locationDisabledNotice": { "type": "String", @@ -2278,34 +2038,11 @@ } }, "doNotShowAgain": "今後表示しない", - "hideUnimportantStateEvents": "重要でない状態イベントを非表示にする", - "numChats": "{number} チャット", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "allSpaces": "すべてのスペース", - "enterRoom": "部屋に入る", - "enterSpace": "スペースに入る", "newSpace": "新しいスペース", "reopenChat": "チャットを再開する", - "signInWith": "{provider}でログイン", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "signInWithPassword": "パスワードでログイン", "notAnImage": "画像ファイルではありません。", "ignoreUser": "ユーザーを無視する", - "normalUser": "通常のユーザー", "aboutHomeserver": "{homeserver} について", "@aboutHomeserver": { "type": "String", @@ -2336,11 +2073,6 @@ } }, "createGroup": "グループを作成する", - "allRooms": "すべてのグループチャット", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "emoteKeyboardNoRecents": "最近使われた絵文字がここに表示されます…", "@emoteKeyboardNoRecents": { "type": "String", @@ -2353,7 +2085,6 @@ "block": "ブロック", "blockedUsers": "ブロック済みのユーザー", "blockUsername": "ユーザー名を無視する", - "inviteContactToGroupQuestion": "{contact}を「{groupName}」のチャットに招待しますか?", "noChatDescriptionYet": "チャットの説明はまだ作成されていません。", "tryAgain": "再試行", "messagesStyle": "メッセージ:", @@ -2363,8 +2094,6 @@ "type": "String", "placeholders": {} }, - "hideMemberChangesInPublicChats": "公開チャットでのメンバー変更を非表示にする", - "notifyMeFor": "お知らせを受ける", "redactedBy": "{username}によって削除済み", "@redactedBy": { "type": "String", @@ -2447,20 +2176,7 @@ "appLockDescription": "未使用時にアプリをPINコードでロック", "sendTypingNotifications": "入力通知を送信", "swipeRightToLeftToReply": "左にスワイプして返信", - "countChatsAndCountParticipants": "{chats}チャットと{participants}人の参加者", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noChatsFoundHere": "ここにはまだチャットがありません。下のボタンを使ってみんなと新しいチャットを始めましょう。⤵️", - "joinedChats": "チャットに参加しました", "commandHint_unban": "このルームから禁止されたユーザーを解禁する", "@commandHint_unban": { "type": "String", @@ -2478,4 +2194,4 @@ "blockListDescription": "迷惑なユーザーをブロックすることができます。あなたの個人的なブロックリストに記載されたユーザーは、あらゆるメッセージやルームへの招待を受け取ることができません。", "invalidServerName": "無効なサーバー名", "redactMessageDescription": "メッセージはこの会話のすべての参加者から削除されます。これは取り消すことができません。" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_ka.arb b/lib/l10n/intl_ka.arb index c885a04a..a5687f29 100644 --- a/lib/l10n/intl_ka.arb +++ b/lib/l10n/intl_ka.arb @@ -80,11 +80,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "ბოტის შეტყობინებები", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "გაუქმება", "@cancel": { "type": "String", @@ -171,16 +166,6 @@ }, "description": "State that {command} is not a valid /command." }, - "confirm": "დადასტურება", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "დაკავშირება", - "@connect": { - "type": "String", - "placeholders": {} - }, "countParticipants": "{count} მონაწილე", "@countParticipants": { "type": "String", @@ -264,7 +249,6 @@ "placeholders": {} }, "confirmMatrixId": "გთხოვთ, დაადასტუროთ თქვენი Matrix ID ანგარიშის წაშლისათვის.", - "addChatDescription": "ჩატის აღწერილობის დამატება...", "addToSpace": "სივრცეში დამატება", "admin": "ადმინი", "@admin": { @@ -486,7 +470,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "ჩატი დაემატა ამ სივრცეს", "chats": "ჩატები", "@chats": { "type": "String", @@ -563,11 +546,6 @@ "type": "String", "placeholders": {} }, - "containsUserName": "შეიცავს სახელს", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "copiedToClipboard": "კოპირებულია ბუფერში", "@copiedToClipboard": { "type": "String", @@ -616,33 +594,6 @@ "type": "String", "placeholders": {} }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "delete": "წაშლა", "@delete": { "type": "String", @@ -673,11 +624,6 @@ "type": "String", "placeholders": {} }, - "allRooms": "ყველა ჯგუფური ჩატები", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "downloadFile": "ფაილის ჩატვირთვა", "@downloadFile": { "type": "String", @@ -781,11 +727,6 @@ "type": "String", "description": "Usage hint for the command /react" }, - "containsDisplayName": "ნაჩვენებ სახელს შეიცავს", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "ეს კონტენტი გაგზავნილ იქნა სერვერის ადმინისტრატორებთან", "@contentHasBeenReported": { "type": "String", @@ -807,7 +748,6 @@ "placeholders": {} }, "ignoreUser": "დაიგნორება", - "normalUser": "ჩვეულებრვი მომხმარებელი", "aboutHomeserver": "{homeserver}-ის შესახებ", "@aboutHomeserver": { "type": "String", @@ -817,4 +757,4 @@ } } } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index 4b3cfc7f..e2e2fa63 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -2,10 +2,7 @@ "@@locale": "kab", "repeatPassword": "Ales awal n uɛeddi", "notAnImage": "Mačči d afaylu n tugna.", - "setCustomPermissionLevel": "Sbadu aswir yugnen n usireg", "ignoreUser": "Zgel aseqdac", - "setPermissionsLevelDescription": "Ma ulac aɣilif fren tamlilt i yettusbadun ddaw-a neɣ sekcem aswir n usireg yugnen gar 0 akked 100.", - "normalUser": "Aseqdac amagnu", "remove": "Kkes", "@remove": { "type": "String", @@ -69,7 +66,6 @@ } } }, - "addChatDescription": "Rnu aglam n udiwenni...", "addToSpace": "Rnu ɣer tallunt", "admin": "Anedbal", "@admin": { @@ -179,11 +175,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Iznan n iṛubuten", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Sefsex", "@cancel": { "type": "String", @@ -280,7 +271,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Adiwenni yettwarna ɣer tallunt-agi", "chats": "Idiwenniyen", "@chats": { "type": "String", @@ -396,33 +386,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Ayagi ad yekkes armed i umiḍan-ik·im n useqdac. Aya ur yezmir ara ad yettwasefsex. Tetḥeqqeḍ s tidet?", "@deactivateAccountWarning": { "type": "String", @@ -468,11 +431,6 @@ "type": "String", "placeholders": {} }, - "allRooms": "Akk Igrawen Usriden", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "displaynameHasBeenChanged": "Isem n uskan yettusnifel", "@displaynameHasBeenChanged": { "type": "String", @@ -524,11 +482,6 @@ "placeholders": {} }, "homeserver": "Aqeddac agejdan", - "enterYourHomeserver": "Sekcem Aqeddac-ik·im agejdan", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Tuccḍa deg wawway n yideg: {error}", "@errorObtainingLocation": { "type": "String", @@ -573,11 +526,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Ddu ɣer texxamt tamaynut", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Agraw", "@group": { "type": "String", @@ -630,11 +578,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Snubget i nekk", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "isTyping": "la yettaru…", "@isTyping": { "type": "String", @@ -702,11 +645,6 @@ "type": "String", "placeholders": {} }, - "license": "Turagt", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Aceɛlal", "@lightTheme": { "type": "String", @@ -723,10 +661,6 @@ }, "dehydrate": "Sifeḍ tiɣimit akked usfaḍ n yibenk", "dehydrateWarning": "Tigawt-agi ur tezmir ara ad tettwasefsex. Tḥeqqeq belli tesseklaseḍ afaylu n weḥraz.", - "dehydrateTor": "Iseqdacen TOR: Sifeḍ tiɣimit", - "dehydrateTorLong": "I iseqdacen TOR, yettusemter ad tsifeḍ tɣimit send ad tmedleḍ asfaylu.", - "hydrateTor": "Iseqdacen TOR: Akter n tɣimit usifeḍ", - "hydrateTorLong": "Tsifḍeḍ tiɣimit-ik·im taneggarut deg TOR? kter-it-id s wudem arurad u kemmel adiwenni.", "hydrate": "Err-d seg ufaylu n weḥraz", "loadingPleaseWait": "Asali... Ttxil-k·m arǧu.", "@loadingPleaseWait": { @@ -871,11 +805,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Ibeddilen n iɛeggalen", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Abdar", "@mention": { "type": "String", @@ -975,11 +904,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Ilɣa remden i umiḍan-agi", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} n iseqdacen la yettarun…", "@numUsersTyping": { "type": "String", @@ -1036,20 +960,13 @@ "type": "String", "placeholders": {} }, - "hideMemberChangesInPublicChats": "Ffer isenfal n iɛeggalen deg udiwenni azayez", "overview": "Taskant", - "notifyMeFor": "Seɛlem-iyi-d ɣef", "passwordRecoverySettings": "Iɣewwaṛen n tririt n wawal n uɛeddi", "passwordRecovery": "Tiririt n wawal n uɛeddi", "@passwordRecovery": { "type": "String", "placeholders": {} }, - "people": "Imdanen", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Fren tugna", "@pickImage": { "type": "String", @@ -1064,11 +981,6 @@ } } }, - "pleaseChoose": "Ttxil-k·m fren", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Ttxil-k·m fren tangalt n uɛeddi", "@pleaseChooseAPasscode": { "type": "String", @@ -1204,11 +1116,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Tugna n ugdil:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Ɣur-k·m!", "@warning": { "type": "String", @@ -1280,18 +1187,7 @@ "sender": "Amazan", "openGallery": "Ldi timidelt", "removeFromSpace": "Kkes seg tallunt", - "addToSpaceDescription": "Fren tallunt akken ad ternuḍ adiwenni-a.", "start": "Senker", - "publish": "Suffeɣ-d", - "videoWithSize": "Avidyu ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "openChat": "Ldi Adiwenni", "markAsRead": "Creḍ amzun yettwaɣṛa", "reportUser": "Cetki aseqdac", @@ -1327,11 +1223,6 @@ } } }, - "removeDevice": "Kkes ibenk", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Kkes agdal seg udiwenni", "@unbanFromChat": { "type": "String", @@ -1352,31 +1243,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Sentem", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Qqen", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Anermis yettwaɛreḍ ɣer ugraw", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Igber askan n yisem", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Igber isem n useqdac", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Agbur yettwammel i inedbalen n uqeddac", "@contentHasBeenReported": { "type": "String", @@ -1402,7 +1273,6 @@ "type": "String", "placeholders": {} }, - "inviteContactToGroupQuestion": "Tebɣiḍ ad d-ɛerḍeḍ {contact} ɣer udiwenni \"{groupName}\"?", "inviteContactToGroup": "Snubg anermis ɣer {groupName}", "@inviteContactToGroup": { "type": "String", @@ -1435,11 +1305,6 @@ "type": "String", "placeholders": {} }, - "identity": "Tamagit", - "@identity": { - "type": "String", - "placeholders": {} - }, "block": "Iḥder", "blockedUsers": "Iseqdacen yettusweḥlen", "blockUsername": "Zgel isem n useqdac", @@ -1502,21 +1367,12 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "Ldi takamiṛat i tvidyut", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "moreEvents": "Ugar n ineḍruyen", "declineInvitation": "Agi tinnubga", "noMessagesYet": "Ulac iznan akka tura", "longPressToRecordVoiceMessage": "Asiti aɣezzfan i usekles n yizen n taɣect.", "pause": "Serǧu", "resume": "Kemmel", - "newSubSpace": "Tallunt tanaddawt tamaynut", - "moveToDifferentSpace": "Smutti ɣer tallunt yemgaraden", - "moveUp": "Ddu d asawen", - "moveDown": "Ddu d akessar", "removeFromSpaceDescription": "Adiwenni ad yettwakkes seg tallunt maca mazal ad yettban deg tebdart-ik·im n udiwenni.", "countChats": "{chats} idiwenniyen", "@countChats": { @@ -1550,7 +1406,6 @@ "startPoll": "Senker tafrent", "endPoll": "Eg taggara n tafrent", "answersVisible": "Tiririyin yettbanen", - "answersHidden": "Tiririyin yeffren", "pollQuestion": "Isteqsiyen n tefrent", "answerOption": "tanefrunt n tririt", "addAnswerOption": "Rnu tanefrunt n tririt", @@ -1639,37 +1494,8 @@ }, "sendTypingNotifications": "Azen alɣu ttaruɣ", "swipeRightToLeftToReply": "Zuɣer seg uyeffus ɣer uzelmaḍ akken ad d-terreḍ", - "badServerVersionsException": "Aqeddac agejdan issefrak ileqman Spec:\n{serverVersions}\nMaca asnas-agi issefrak kan {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "countChatsAndCountParticipants": "{chats} n yidiwenniyen akked {participants} n yimttekkiyen", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Ulac ugar n idiwenniyen yettwafen…", "noChatsFoundHere": "Ur d-nufi ula d yiwen n udiwenni da. Bdu adiwenni akked yiwen s useqdec n tqeffalt ukessar-a. ⤵️", - "joinedChats": "Yettwarna ɣer udiwenni", - "widgetName": "Isem", - "widgetUrlError": "Wagi mačči d URL ameɣtu.", - "widgetNameError": "Ttxil-k·m sekcem isem n uskan.", - "errorAddingWidget": "Tuccḍa deg tmerna n uwiǧit.", "youRejectedTheInvitation": "Tugiḍ tinnubga", "youJoinedTheChat": "Tekcemeḍ ɣer udiwenni", "youAcceptedTheInvitation": "👍 Tqebleḍ tinubga", @@ -1689,14 +1515,6 @@ } } }, - "youInvitedToBy": "📩 Tettwaɛerḍeḍ s useɣwen ɣer:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "youInvitedBy": "📩 Tettwaɛerḍeḍ sɣur {user}", "@youInvitedBy": { "placeholders": { @@ -1755,15 +1573,6 @@ }, "usersMustKnock": "Iseqdacen yessefk ad sṭebṭben", "noOneCanJoin": "Yiwen ur yezmir ad d-yernu", - "userWouldLikeToChangeTheChat": "{user} yebɣa ad yettekki deg udiwenni.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Werɛad ur d-yennulfa ula d yiwen n wassaɣ azayez", "users": "Iseqdacen", "unlockOldMessages": "Kkes asekkeṛ i yiznan iqbuṛen", "storeInSecureStorageDescription": "Ḥrez tasarut n tririt deg usekles aɣelsan n yibenk-a.", @@ -1784,22 +1593,8 @@ "foregroundServiceRunning": "Alɣu-agi yettban-d ticki ameẓlu n uɣawas amezwaru iteddu.", "screenSharingTitle": "beṭṭu n ugdil", "screenSharingDetail": "Tbeṭṭuḍ agdil-ik·im deg FluffyChat", - "callingPermissions": "Tisirag n usiwel", - "callingAccount": "amiḍan n usiwel", - "callingAccountDetails": "Sireg FluffyChat ad iseqdec asnas aneṣli n Android i usɛeddi n usiwel.", - "appearOnTop": "Sbeqeḍ deg uksawen", - "otherCallingPermissions": "Tisirag n umikrufun, takamiṛat akked tiyaḍ n FluffyChat", "whyIsThisMessageEncrypted": "Acuɣer izen-agi ur yettwaɣri ara?", "recoveryKeyLost": "Tasarut n tririt teɛreq?", - "seenByUser": "Yemmẓer sɣur {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Azen", "@send": { "type": "String", @@ -1843,16 +1638,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Azen aneṣli", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Azen ticṛeṭ n tesfift", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Azen avidyu", "@sendVideo": { "type": "String", @@ -1942,14 +1727,9 @@ "openLinkInBrowser": "Ldi aseɣwen deg yiminig", "reportErrorDescription": "😭 Uhu. Yella kra n wugur ay yellan. Ma tebɣiḍ, tzemreḍ ad tazneḍ aneqqis-a i yineflayen.", "report": "aneqqis", - "signInWithPassword": "Kcem s wawal n uɛeddi", - "pleaseTryAgainLaterOrChooseDifferentServer": "Ma ulac aɣilif, ɛreḍ tikelt nniḍen ticki neɣ fren aqeddac nniḍen.", - "profileNotFound": "Aseqdac ur yettwaf ara deg uqeddac. Ahat yella wugur n uẓeṭṭa neɣ aseqdac ulac-it.", - "setTheme": "Sbadu asentel:", "setColorTheme": "Sbadu asentel n yini:", "invite": "Snubget", "inviteGroupChat": "📨Snubget ɣer udiwenni n ugraw", - "invitePrivateChat": "📨Snubget ɣze udiwenni Uslig", "invalidInput": "Anekcam d armeɣtu!", "wrongPinEntered": "Tettwasekcem tangalt PIN d armeɣtut! Ɛreḍ tikkelt nniḍen deg {seconds} n tasinin…", "@wrongPinEntered": { @@ -1982,7 +1762,6 @@ }, "unsupportedAndroidVersion": "Lqem Android ur yettwasefrak ara", "unsupportedAndroidVersionLong": "Tamahilt-a tesra lqem Android tamaynut. Ttxil-k·m senqed ileqman neɣ asefrak n Lineage OS.", - "startFirstChat": "Senker adiwenni-ik·im amezwaru", "status": "Addad", "@status": { "type": "String", @@ -2033,21 +1812,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Qluqel asmenyif", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Qluqel asgugem", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Creḍ Yettwaɣri/Ur yettwaɣri ara", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Deqs n tuttriwin. Ttxil-k·m, ɛreḍ tikelt nniḍen ticki!", "@tooManyRequestsWarning": { "type": "String", @@ -2121,39 +1885,9 @@ }, "pleaseEnterRecoveryKeyDescription": "Akken ad tekkseḍ asekkeṛ i yiznan-ik·im iqburen, ttxil-k·m sekcem tasarut n tririt i d-yenulfan di tɣimit tuzwirt. Tasarut-ik·im n tririt UR TELLI ARA d awal-ik·im n uɛeddi.", "experimentalVideoCalls": "Isawalen uvidya s wudem armitan", - "emailOrUsername": "Imayl neɣ isem n useqdac", - "indexedDbErrorTitle": "Uguren n uskar uslig", - "indexedDbErrorLong": "Asekles n yizen ur yettwarmed ara deg uskar uslig s wudem amezwer.\nTtxil-k·m rzu ɣer\n - ɣef:swel\n - sbadu om.indexedDB.privateBrowsing.enabled ɣer d ilaw\nMa ulac, ur yezmir ara ad isselkem FluffyChat.", - "switchToAccount": "Ddu ɣer umiḍan {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Amiḍan uḍfir", - "previousAccount": "Amiḍan yezrin", - "addWidget": "Rnu awiǧit", - "widgetVideo": "Avidyu", - "widgetEtherpad": "Tazmilt n uḍris", - "widgetJitsi": "Asarag Jitsi", - "widgetCustom": "Sagen", "newGroup": "Agraw amaynut", "newSpace": "Tallunt tamaynut", - "enterSpace": "Kcem tallunt", - "enterRoom": "Kcem taxxamt", "allSpaces": "Akk tallunin", - "numChats": "{number} idiwenniyen", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "verifiedDevicesOnly": "Ibenkan yettwasneqden kan", "optionalMessage": "(D afrayan) izen…", "notSupportedOnThisDevice": "Ur itteddu ara deg yibenk-agi", @@ -2303,11 +2037,8 @@ "deviceKeys": "Tisura n yibenk:", "learnMore": "Issin ugar", "groupName": "Isem n ugraw", - "startConversation": "Bdu adiwenni", "newPassword": "Awal n uɛeddi amaynut", - "publicLink": "Aseɣwen azayaz", "thisDevice": "Ibenk-a:", - "userRole": "Tamlilt n useqdac", "searchMore": "Nadi ugar…", "allDevices": "Akk ibenkan", "saveChanges": "Sekles ibeddilen", @@ -2330,11 +2061,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Asesteb asuf", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "encryptThisChat": "Wgelhen adiwenni-a", "searchForUsers": "Nadi iseqdacen…", "createNewAddress": "Snulfu-d tansa tamaynut", @@ -2370,13 +2096,11 @@ } }, "enableMultiAccounts": "(armitan) Rmed aget n yimiḍanen deg yibenk-agi", - "hideMemberChangesInPublicChatsBody": "Ur d-skan ara deg yizirig n wakud ma yella win i d-yernan neɣ yeffɣen adiwenni azayez i usnerni n tɣara n tɣuṛi.", "pleaseEnter4Digits": "Ttxil-k·m sekcem 4 n wuṭṭunen neɣ eǧǧ-it d ilem akken ad tsenseḍ asekkeṛ n usnas.", "@pleaseEnter4Digits": { "type": "String", "placeholders": {} }, - "pleaseEnterRecoveryKey": "Ttxil-k·m sekcem tasarut-ik·im n tririt:", "pleaseEnterYourPin": "Ttxil-k·m sekcem tangalt-ik·im pin", "@pleaseEnterYourPin": { "type": "String", @@ -2406,11 +2130,6 @@ } } }, - "rejoin": "ales attekki tikkelt nniḍen", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "reportMessage": "Mmel-d izen", "@reportMessage": { "type": "String", @@ -2426,22 +2145,7 @@ "type": "String", "placeholders": {} }, - "separateChatTypes": "Brez Idiwenniyen usriden akked igrawen", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "setChatDescription": "Sbadu aglam n udiwenni", - "setInvitationLink": "Sbadu aseɣwen n tinubga", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Sbadu aswir n tsirag", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "sharedTheLocation": "{username} yebḍa adig-is", "@sharedTheLocation": { "type": "String", @@ -2475,4 +2179,4 @@ "notificationRuleCallDescription": "Azen alɣu i useqdac ɣef isawalen.", "notificationRuleEncryptedRoomOneToOne": "Taxxamt yettwawgelhen s wudem n yiwen ɣer yiwen", "notificationRuleRoomOneToOne": "Taxxamt s wudem n yiwen ɣer yiwen" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_ko.arb b/lib/l10n/intl_ko.arb index 2697a159..9344f679 100644 --- a/lib/l10n/intl_ko.arb +++ b/lib/l10n/intl_ko.arb @@ -88,11 +88,6 @@ "type": "String", "placeholders": {} }, - "license": "라이선스", - "@license": { - "type": "String", - "placeholders": {} - }, "help": "도움", "@help": { "type": "String", @@ -118,11 +113,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "새로운 방 가기", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "fromTheInvitation": "초대받은 후부터", "@fromTheInvitation": { "type": "String", @@ -163,11 +153,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "당신의 홈서버를 입력하세요", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "homeserver": "홈서버", "@homeserver": {}, "enterAnEmailAddress": "이메일 주소 입력", @@ -219,11 +204,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "이모트 단축키와 이미지를 골라야 합니다!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emoteShortcode": "이모트 단축키", "@emoteShortcode": { "type": "String", @@ -381,31 +361,11 @@ "type": "String", "placeholders": {} }, - "containsUserName": "내 아이디 포함", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "내 닉네임 포함", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "연락처가 채팅에 초대되었습니다", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "connect": "연결", - "@connect": { - "type": "String", - "placeholders": {} - }, - "confirm": "확인", - "@confirm": { - "type": "String", - "placeholders": {} - }, "configureChat": "채팅 설정", "@configureChat": { "type": "String", @@ -477,8 +437,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "이 스페이스에 채팅이 추가되었습니다", - "@chatHasBeenAddedToThisSpace": {}, "chatDetails": "채팅 정보", "@chatDetails": { "type": "String", @@ -683,11 +641,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "봇 메시지", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "blocked": "차단됨", "@blocked": { "type": "String", @@ -720,18 +673,6 @@ "type": "String", "placeholders": {} }, - "badServerVersionsException": "이 홈서버가 지원하는 Spec 버전:\n{serverVersions}\n하지만 이 앱은 {supportedVersions}만 지원합니다", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "sendOnEnter": "엔터로 보내기", "@sendOnEnter": {}, "badServerLoginTypesException": "홈서버가 지원하는 로그인 유형:\n{serverVersions}\n하지만 이 앱에서 지원하는 것은:\n{supportedVersions}", @@ -849,11 +790,6 @@ "type": "String", "placeholders": {} }, - "identity": "신원", - "@identity": { - "type": "String", - "placeholders": {} - }, "id": "ID", "@id": { "type": "String", @@ -919,33 +855,6 @@ "type": "String", "placeholders": {} }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "dateAndTimeOfDay": "{date}, {timeOfDay}", "@dateAndTimeOfDay": { "type": "String", @@ -1008,11 +917,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "배경:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "waitingPartnerNumbers": "상대가 숫자를 수락하길 기다리는 중…", "@waitingPartnerNumbers": { "type": "String", @@ -1226,11 +1130,6 @@ } } }, - "notificationsEnabledForThisAccount": "이 계정에서 알림이 활성화되었습니다", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "notifications": "알림", "@notifications": { "type": "String", @@ -1324,15 +1223,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{읽지 않은 채팅 1} other{{unreadCount} 개}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "unavailable": "사용할 수 없음", "@unavailable": { "type": "String", @@ -1426,21 +1316,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "메시지 안/읽음 으로 표시", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "음소거 토글", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleFavorite": "즐겨찾기 토글", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "title": "FluffyChat", "@title": { "description": "Title for the application", @@ -1501,11 +1376,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "단일 계정 로그인(SSO)", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "pushRules": "푸시 규칙", "@pushRules": { "type": "String", @@ -1535,11 +1405,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "선택해주세요", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "play": "{fileName} 재생", "@play": { "type": "String", @@ -1549,11 +1414,6 @@ } } }, - "people": "사람들", - "@people": { - "type": "String", - "placeholders": {} - }, "passwordHasBeenChanged": "비밀번호가 변경됨", "@passwordHasBeenChanged": { "type": "String", @@ -1633,11 +1493,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "참가자 변경", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "loadingPleaseWait": "로딩 중... 기다려 주세요.", "@loadingPleaseWait": { "type": "String", @@ -1697,21 +1552,6 @@ "type": "String", "placeholders": {} }, - "setPermissionsLevel": "권한 레벨 설정", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "초대 링크 설정", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setCustomEmotes": "맞춤 이모트 설정", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "주 별명으로 설정", "@setAsCanonicalAlias": { "type": "String", @@ -1735,11 +1575,6 @@ } } }, - "sendOriginal": "원본 보내기", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendMessages": "메시지 보내기", "@sendMessages": { "type": "String", @@ -1774,15 +1609,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "{username}님이 읽음", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "security": "보안", "@security": { "type": "String", @@ -1879,11 +1705,6 @@ } } }, - "inviteForMe": "초대됨", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "invitedUsersOnly": "초대된 유저만", "@invitedUsersOnly": { "type": "String", @@ -1976,11 +1797,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "스티커 보내기", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "reportMessage": "메시지 신고", "@reportMessage": { "type": "String", @@ -2006,11 +1822,6 @@ "type": "String", "placeholders": {} }, - "removeDevice": "기기 삭제", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "removedBy": "{username}에 의해 지워짐", "@removedBy": { "type": "String", @@ -2030,11 +1841,6 @@ "type": "String", "placeholders": {} }, - "rejoin": "다시 참가", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "rejectedTheInvitation": "{username}님이 초대를 거절함", "@rejectedTheInvitation": { "type": "String", @@ -2129,8 +1935,6 @@ "@start": {}, "removeFromSpace": "스페이스에서 삭제", "@removeFromSpace": {}, - "addToSpaceDescription": "이 채팅을 추가할 스페이스를 선택하세요.", - "@addToSpaceDescription": {}, "commandHint_discardsession": "세션 삭제", "@commandHint_discardsession": { "type": "String", @@ -2151,22 +1955,6 @@ "type": "String", "description": "Usage hint for the command /create" }, - "openVideoCamera": "영상용 카메라 열기", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "publish": "공개", - "@publish": {}, - "videoWithSize": "영상 ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "dismiss": "닫기", "@dismiss": {}, "markAsRead": "읽음으로 표시하기", @@ -2205,8 +1993,6 @@ "@unsupportedAndroidVersionLong": {}, "videoCallsBetaWarning": "영상 통화는 베타임을 확인해주세요. 의도한 대로 작동하지 않거나 모든 플랫폼에서 작동하지 않을 수 있습니다.", "@videoCallsBetaWarning": {}, - "emailOrUsername": "이메일이나 유저 이름", - "@emailOrUsername": {}, "confirmMatrixId": "계정을 삭제하려면 Matrix ID를 입력해 주세요.", "@confirmMatrixId": {}, "commandHint_googly": "왕눈이 눈알 보내기", @@ -2237,29 +2023,12 @@ }, "jumpToLastReadMessage": "마지막으로 읽은 메시지로 이동", "@jumpToLastReadMessage": {}, - "allRooms": "모든 그룹 채팅", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "commandHint_cuddle": "미소 보내기", "@commandHint_cuddle": {}, - "widgetVideo": "영상", - "@widgetVideo": {}, "reportErrorDescription": "😭 이런. 무언가 잘못되었습니다. 원한다면, 개발자에게 버그를 신고할 수 있습니다.", "@reportErrorDescription": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "indexedDbErrorLong": "메시지 저장은 기본적으로 사생활 보호 모드에서 사용할 수 없습니다.\n- about:config 로 이동\n- dom.indexedDB.privateBrowsing.enabled 를 true로 설정\n그렇지 않으면 FluffyChat을 실행할 수 없습니다.", - "@indexedDbErrorLong": {}, - "startFirstChat": "첫 번째 채팅을 시작하기", - "@startFirstChat": {}, - "callingAccount": "통화 계정", - "@callingAccount": {}, "setColorTheme": "색상 테마 설정:", "@setColorTheme": {}, - "nextAccount": "다음 계정", - "@nextAccount": {}, "allSpaces": "모든 스페이스", "@allSpaces": {}, "supposedMxid": "{mxid} 이어야 함", @@ -2285,15 +2054,8 @@ }, "banUserDescription": "유저는 채팅에서 영구 추방되며 추방 해제 전까지 채팅을 다시 입력할 수 없습니다.", "@banUserDescription": {}, - "widgetEtherpad": "텍스트 메모", - "@widgetEtherpad": {}, "removeDevicesDescription": "이 기기에서 로그아웃되며 더 이상 메시지를 받을 수 없습니다.", "@removeDevicesDescription": {}, - "separateChatTypes": "다이렉트 채팅과 그룹 채팅 분리", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "tryAgain": "다시 시도하기", "@tryAgain": {}, "youKickedAndBanned": "🙅 {user}님을 영구 추방했습니다", @@ -2308,32 +2070,16 @@ "@unbanUserDescription": {}, "youRejectedTheInvitation": "초대를 거부했습니다", "@youRejectedTheInvitation": {}, - "otherCallingPermissions": "마이크, 카메라 그리고 다름 FluffyChat 권한", - "@otherCallingPermissions": {}, "messagesStyle": "메세지:", "@messagesStyle": {}, - "widgetUrlError": "유효한 URL이 아닙니다.", - "@widgetUrlError": {}, "newSpaceDescription": "스페이스를 사용하면 채팅을 통합하고 비공개 또는 공개 커뮤니티를 구축할 수 있습니다.", "@newSpaceDescription": {}, "chatDescription": "채팅 설명", "@chatDescription": {}, - "callingAccountDetails": "FluffyChat이 android 전화앱을 사용 할 수 있도록 허가.", - "@callingAccountDetails": {}, - "enterSpace": "스페이스에 입장", - "@enterSpace": {}, "encryptThisChat": "이 채팅을 암호화", "@encryptThisChat": {}, - "previousAccount": "이전 계정", - "@previousAccount": {}, "reopenChat": "채팅 다시 열기", "@reopenChat": {}, - "pleaseEnterRecoveryKey": "당신의 복구키를 입력하세요:", - "@pleaseEnterRecoveryKey": {}, - "widgetNameError": "표시 이름을 입력하세요.", - "@widgetNameError": {}, - "addWidget": "위젯 추가", - "@addWidget": {}, "countFiles": "{count}개의 파일", "@countFiles": { "placeholders": { @@ -2344,8 +2090,6 @@ }, "noKeyForThisMessage": "이것은 이 메시지가 당신이 이 기기를 서명하기 전에 발송되었기 때문에 일어났을 수 있습니다.\n\n이것은 또한 발송자가 당신의 기기를 차단하였거나 혹은 인터넷 연결이 잘못되었을 수 있습니다.\n\n다른 세션에서 이 메시지를 읽을 수 있나요? 그렇다면 그 메시지를 옮길 수 있습니다! 설정 > 기기로 가서 기기를 서로 증명하세요. 다음번에 방을 열었을 때 두 세션이 모두 작동중이라면, 키가 자동으로 옮겨질것입니다.\n\n로그아웃하거나 기기를 바꿀 때 키를 잃고싶지 않으신가요? 설정에서 채팅 백업을 사용중인지 확인하세요.", "@noKeyForThisMessage": {}, - "hydrateTor": "TOR 사용자: 내보낸 세션 불러오기", - "@hydrateTor": {}, "pushNotificationsNotAvailable": "푸시 알림 사용 불가", "@pushNotificationsNotAvailable": {}, "storeInAppleKeyChain": "Apple KeyChain에 저장하기", @@ -2358,8 +2102,6 @@ "@chatPermissions": {}, "storeInAndroidKeystore": "Android KeyStore에 저장하기", "@storeInAndroidKeystore": {}, - "signInWithPassword": "비밀번호로 로그인", - "@signInWithPassword": {}, "makeAdminDescription": "유저를 한 번 관리자로 만들면, 당신과 같은 권한을 가지기때문에 권한 회수가 불가능합니다.", "@makeAdminDescription": {}, "saveKeyManuallyDescription": "공유나 클립보드를 이용해 수동으로 키를 저장합니다.", @@ -2381,51 +2123,20 @@ } } }, - "signInWith": "{provider}로 로그인", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "fileIsTooBigForServer": "전송에 실패했습니다. 서버는 {max}가 넘는 파일을 지원하지 않습니다.", "@fileIsTooBigForServer": {}, - "callingPermissions": "통화 권한", - "@callingPermissions": {}, "readUpToHere": "여기까지 읽음", "@readUpToHere": {}, "unlockOldMessages": "오래된 메시지 잠금 해제하기", "@unlockOldMessages": {}, - "numChats": "{number}개의 채팅", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "optionalRedactReason": "(선택) 이 메시지를 편집하는 이유...", "@optionalRedactReason": {}, "archiveRoomDescription": "채팅이 보관함으로 이동합니다. 다른 유저들은 당신이 떠난다는것을 볼 수 있습니다.", "@archiveRoomDescription": {}, "exportEmotePack": ".zip 파일로 이모트 내보내기", "@exportEmotePack": {}, - "switchToAccount": "계정 {number}로 전환", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "pleaseEnterRecoveryKeyDescription": "오래된 메시지를 잠금 해제하려면, 이전 세션에서 생성된 복호화 키를 입력하세요. 복호화 키는 비밀번호가 아닙니다.", "@pleaseEnterRecoveryKeyDescription": {}, - "inviteContactToGroupQuestion": "{contact} 를 \"{groupName}\"에 초대할까요?", - "@inviteContactToGroupQuestion": {}, "redactedByBecause": "{username}님이 삭제함. 사유: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2446,10 +2157,6 @@ } } }, - "appearOnTopDetails": "앱이 상단에 표시되도록 허용 (이미 FluffyChat을 통화 계정으로 설정한 경우에는 필요하지 않음)", - "@appearOnTopDetails": {}, - "enterRoom": "방에 입장", - "@enterRoom": {}, "youInvitedUser": "📩 {user}님을 초대했습니다", "@youInvitedUser": { "placeholders": { @@ -2473,18 +2180,12 @@ "@recoveryKey": {}, "invalidInput": "잘못된 입력!", "@invalidInput": {}, - "dehydrateTorLong": "TOR 사용자들은 창을 닫기 전에 세션을 내보내는것이 권장됩니다.", - "@dehydrateTorLong": {}, "doNotShowAgain": "다시 보지 않기", "@doNotShowAgain": {}, "report": "신고", "@report": {}, - "hideUnimportantStateEvents": "중요하지 않은 상태 이벤트 숨기기", - "@hideUnimportantStateEvents": {}, "screenSharingTitle": "화면 공유", "@screenSharingTitle": {}, - "widgetCustom": "사용자 정의", - "@widgetCustom": {}, "youBannedUser": "{user}님을 영구 추방함", "@youBannedUser": { "placeholders": { @@ -2493,8 +2194,6 @@ } } }, - "addChatDescription": "채팅 설명 추가하기...", - "@addChatDescription": {}, "hasKnocked": "🚪 {user}님이 참가를 요청했습니다", "@hasKnocked": { "placeholders": { @@ -2522,10 +2221,6 @@ "@sendTypingNotifications": {}, "inviteGroupChat": "📨 그룹 채팅에 초대", "@inviteGroupChat": {}, - "appearOnTop": "상단에 표시", - "@appearOnTop": {}, - "invitePrivateChat": "📨 비공개 채팅에 초대", - "@invitePrivateChat": {}, "foregroundServiceRunning": "이 알림은 백그라운드 서비스가 실행중일때 표시됩니다.", "@foregroundServiceRunning": {}, "importEmojis": "이모지 불러오기", @@ -2551,8 +2246,6 @@ "@chatDescriptionHasBeenChanged": {}, "newGroup": "새 그룹 채팅", "@newGroup": {}, - "dehydrateTor": "TOR 사용자: 세션 내보내기", - "@dehydrateTor": {}, "roomUpgradeDescription": "채팅이 새로운 방 버전으로 다시 생성됩니다. 모든 참가자는 새로운 채팅으로 전환해야합니다. https://spec.matrix.org/latest/rooms/ 에서 방 버전에 대해 자세히 알아볼 수 있습니다.", "@roomUpgradeDescription": {}, "pleaseEnterANumber": "0보다 큰 숫자를 입력하세요", @@ -2565,8 +2258,6 @@ } } }, - "profileNotFound": "유저를 서버에서 찾을 수 있습니다. 연결 문제가 있거나 유저가 존재하지 않을 수 있습니다.", - "@profileNotFound": {}, "jump": "점프", "@jump": {}, "sorryThatsNotPossible": "죄송합니다...그것은 불가능합니다", @@ -2593,14 +2284,8 @@ "type": "String", "placeholders": {} }, - "setTheme": "테마 설정:", - "@setTheme": {}, "youJoinedTheChat": "채팅에 참가하였습니다", "@youJoinedTheChat": {}, - "widgetName": "이름", - "@widgetName": {}, - "errorAddingWidget": "위젯 추가중 오류 발생.", - "@errorAddingWidget": {}, "commandHint_hug": "허그 보내기", "@commandHint_hug": {}, "replace": "대체", @@ -2615,12 +2300,8 @@ }, "newSpace": "새 스페이스", "@newSpace": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "나중에 다시 시도하거나 다른 서버를 선택하십시오.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "createGroup": "새 그룹 채팅", "@createGroup": {}, - "hydrateTorLong": "지난 TOR 이용에서 세션을 내보내셨나요? 빠르게 불러오고 채팅을 계속하세요.", - "@hydrateTorLong": {}, "custom": "커스텀", "@custom": {}, "noBackupWarning": "경고! 채팅 백업을 켜지 않을경우, 당신은 암호화된 메시지에 대한 접근권한을 잃을것 입니다. 로그아웃 하기 전에 채팅을 백업하는것이 강력히 권장됩니다.", @@ -2633,8 +2314,6 @@ "@importNow": {}, "invite": "초대", "@invite": {}, - "indexedDbErrorTitle": "사생활 보호 모드의 문제", - "@indexedDbErrorTitle": {}, "storeSecurlyOnThisDevice": "이 기기에 안전하게 저장", "@storeSecurlyOnThisDevice": {}, "screenSharingDetail": "FluffyChat에 당신의 화면을 공유하는중", @@ -2653,24 +2332,12 @@ "@pleaseChooseAStrongPassword": {}, "addChatOrSubSpace": "채팅 또는 하위 스페이스 추가", "@addChatOrSubSpace": {}, - "subspace": "하위 스페이스", - "@subspace": {}, - "youInvitedToBy": "📩 링크를 통해 초대되셨습니다:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "databaseMigrationBody": "잠시만 기다리세요. 시간이 걸릴 수 있습니다.", "@databaseMigrationBody": {}, "select": "선택", "@select": {}, "joinSpace": "스페이스 참가", "@joinSpace": {}, - "decline": "거절", - "@decline": {}, "formattedMessagesDescription": "마크다운을 이용한 볼드등의 서식이 있는 메시지를 봅니다.", "@formattedMessagesDescription": {}, "completedKeyVerification": "{sender}가 키 검증을 완료함", @@ -2697,8 +2364,6 @@ "@passwordsDoNotMatch": {}, "passwordIsWrong": "비밀번호가 틀립니다", "@passwordIsWrong": {}, - "publicLink": "공개 링크", - "@publicLink": {}, "thisDevice": "이 기기:", "@thisDevice": {}, "sendReadReceipts": "읽음 확인 보내기", @@ -2753,11 +2418,6 @@ "@commandHint_unignore": {}, "blockListDescription": "당신은 당신을 방해하는 유저들을 차단할 수 있습니다. 당신은 당신의 개인 차단 목록에 있는 어떠한 유저의 메시지와 방 초대도 받지 않을것 입니다.", "@blockListDescription": {}, - "presenceStyle": "상태:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "sessionLostBody": "세션을 잃었습니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", "@sessionLostBody": { "type": "String", @@ -2783,8 +2443,6 @@ }, "nothingFound": "아무것도 찾지 못했습니다...", "@nothingFound": {}, - "startConversation": "대화 시작", - "@startConversation": {}, "databaseMigrationTitle": "데이터베이스가 최적화됨", "@databaseMigrationTitle": {}, "pleaseEnterYourCurrentPassword": "현재 비밀번호 입력", @@ -2793,31 +2451,10 @@ "@publicSpaces": {}, "initAppError": "앱 초기화중 오류 발생", "@initAppError": {}, - "databaseBuildErrorBody": "SQlite 데이터베이스를 구축할 수 없습니다. 현재 레거시 데이터베이스 사용을 시도중입니다. {url} 에서 개발자에게 오류를 신고하세요. 오류 메시지는 다음과 같습니다: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sendTypingNotificationsDescription": "채팅의 다른 참가자들이 당신이 새 메시지를 입력중인것을 볼 수 있습니다.", "@sendTypingNotificationsDescription": {}, "formattedMessages": "형식이 지정된 메시지", "@formattedMessages": {}, - "forwardMessageTo": "{roomName}에 메시지를 전달할까요?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "verifyOtherDevice": "🔐 다른 기기를 확인", "@verifyOtherDevice": {}, "verifyOtherUserDescription": "다른 유저를 확인하면, 당신은 당신이 누구에게 말하고있는지 알 수 있습니다. 💪\n\n확인을 시작할 때, 다른 유저는 앱에서 팝업을 볼 수 있습니다. 당신은 그런 다음 서로 비교해야 이모지 또는 숫자의 목록을 볼 수 있습니다.\n\n이 작업을 수행하는 가장 좋은 방법은 직접 만나거나 영상통화를 하는것입니다. 👭", @@ -2893,22 +2530,8 @@ "@hideInvalidOrUnknownMessageFormats": {}, "overview": "개요", "@overview": {}, - "notifyMeFor": "나에게 알림", - "@notifyMeFor": {}, "passwordRecoverySettings": "비밀번호 복구 설정", "@passwordRecoverySettings": {}, - "hideMemberChangesInPublicChats": "공개 채팅에서의 참가자 변화 숨김", - "@hideMemberChangesInPublicChats": {}, - "userWouldLikeToChangeTheChat": "{user}님이 참가를 희망합니다.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "공개 링크가 아직 생성되지 않았음", - "@noPublicLinkHasBeenCreatedYet": {}, "knock": "참가 요청", "@knock": {}, "usersMustKnock": "유저들이 참가를 허가받아야함", @@ -2931,25 +2554,12 @@ "type": "String", "count": {} }, - "minimumPowerLevel": "{level}은 최소 권한 레벨입니다.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "noDatabaseEncryption": "데이터베이스 암호화는 이 플랫폼에서 지원되지 않음", "@noDatabaseEncryption": {}, "publicChatAddresses": "공개 채팅 주소", "@publicChatAddresses": {}, - "userRole": "유저 역할", - "@userRole": {}, "createNewAddress": "새 주소 만들기", "@createNewAddress": {}, - "hideMemberChangesInPublicChatsBody": "공개 채팅에 누군가가 참가하거나 떠날때 타임라인에 표시하지 않습니다.", - "@hideMemberChangesInPublicChatsBody": {}, "searchMore": "더 검색...", "@searchMore": {}, "files": "파일", @@ -2988,20 +2598,6 @@ }, "markAsUnread": "읽지 않음으로 표시", "@markAsUnread": {}, - "countChatsAndCountParticipants": "{chats} 채팅과 {participants} 참여자", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, - "joinedChats": "참가한 채팅", - "@joinedChats": {}, "noMoreChatsFound": "채팅을 찾을 수 없습니다...", "@noMoreChatsFound": {}, "moderatorLevel": "{level} - 관리자", @@ -3047,8 +2643,6 @@ "@changeTheCanonicalRoomAlias": {}, "sendCanceled": "전송 최소됨", "@sendCanceled": {}, - "homeserverDescription": "당신의 모든 데이터는 이메일과 흡사하게 당신의 홈서버에 저장됩니다. 당신이 소통하고 싶은 사람들과 다른 서버를 사용해도 무관하니 당신이 원하는 홈서버를 선택해도 됩니다. https://matrix.org에서 자세히 알아보세요.", - "@homeserverDescription": {}, "sendingAttachmentCountOfCount": "첨부파일 {length}개중 {index}번째 전송 중...", "@sendingAttachmentCountOfCount": { "type": "integer", @@ -3125,10 +2719,6 @@ "@chatPermissionsDescription": {}, "loginWithMatrixId": "Matrix-ID로 로그인", "@loginWithMatrixId": {}, - "discoverHomeservers": "홈서버 찾아보기", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "홈서버가 무엇인가요?", - "@whatIsAHomeserver": {}, "doesNotSeemToBeAValidHomeserver": "호환되는 홈서버가 아닌 것 같습니다. URL을 올바르게 입력됐나요?", "@doesNotSeemToBeAValidHomeserver": {}, "continueText": "계속하기", @@ -3196,8 +2786,6 @@ "@previous": {}, "newChatRequest": "📩 새 채팅 요청", "@newChatRequest": {}, - "appIntroduction": "FluffyChat는 다른 메신저들을 사용하는 친구들과도 채팅할 수 있습니다. https://matrix.org에 방문하거나 *계속*을 눌러 자세한 정보를 확인하세요.", - "@appIntroduction": {}, "synchronizingPleaseWaitCounter": " 동기화중… ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -3271,14 +2859,8 @@ "@notificationRuleSuppressEditsDescription": {}, "notificationRuleCall": "전화", "@notificationRuleCall": {}, - "setCustomPermissionLevel": "사용자 지정 권한 수준 설정", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "아래에서 미리 정의된 역할을 선택하거나 0부터 100 사이의 사용자 지정 권한 수준을 입력해 주세요.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "사용자 무시", "@ignoreUser": {}, - "normalUser": "일반 사용자", - "@normalUser": {}, "commandHint_roomupgrade": "이 방을 주어진 방 버전으로 업그레이드합니다", "@commandHint_roomupgrade": {}, "checkList": "체크리스트", @@ -3292,4 +2874,4 @@ } } } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_lt.arb b/lib/l10n/intl_lt.arb index 44f5681e..2fd1b1e7 100644 --- a/lib/l10n/intl_lt.arb +++ b/lib/l10n/intl_lt.arb @@ -4,11 +4,6 @@ "type": "String", "description": "Usage hint for the command /leave" }, - "confirm": "Patvirtinti", - "@confirm": { - "type": "String", - "placeholders": {} - }, "cancel": "Atšaukti", "@cancel": { "type": "String", @@ -179,11 +174,6 @@ }, "homeserver": "Namų serveris", "@homeserver": {}, - "enterYourHomeserver": "Įveskite namų serverį", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "Viskas paruošta!", "@everythingReady": { "type": "String", @@ -201,16 +191,6 @@ "type": "String", "placeholders": {} }, - "connect": "Prisijungti", - "@connect": { - "type": "String", - "placeholders": {} - }, - "people": "Žmonės", - "@people": { - "type": "String", - "placeholders": {} - }, "moderator": "Moderatorius", "@moderator": { "type": "String", @@ -246,11 +226,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Pranešimai aktyvuoti šitai paskyrai", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "obtainingLocation": "Gaunama vieta…", "@obtainingLocation": { "type": "String", @@ -318,11 +293,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Prašome pasirinkti", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Pasirinkite slaptą kodą", "@pleaseChooseAPasscode": { "type": "String", @@ -383,11 +353,6 @@ "type": "String", "placeholders": {} }, - "rejoin": "Vėl prisijungti", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Pašalinti", "@remove": { "type": "String", @@ -398,11 +363,6 @@ "type": "String", "placeholders": {} }, - "removeDevice": "Pašalinti įrenginį", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "removeYourAvatar": "Pašalinti savo avatarą", "@removeYourAvatar": { "type": "String", @@ -649,11 +609,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Eiti į naują kambarį", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grupė", "@group": { "type": "String", @@ -694,11 +649,6 @@ "type": "String", "placeholders": {} }, - "identity": "Tapatybė", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignoruoti", "@ignore": { "type": "String", @@ -714,11 +664,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Narių pokyčiai", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Paminėti", "@mention": { "type": "String", @@ -853,11 +798,6 @@ "type": "String", "placeholders": {} }, - "license": "Licencija", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Šviesi", "@lightTheme": { "type": "String", @@ -898,16 +838,6 @@ "type": "String", "placeholders": {} }, - "setInvitationLink": "Nustatyti pakvietimo nuorodą", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "singlesignon": "Vienkartinis prisijungimas", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "sourceCode": "Programinis kodas", "@sourceCode": { "type": "String", @@ -1031,31 +961,16 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Siųsti originalą", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Siųsti video", "@sendVideo": { "type": "String", "placeholders": {} }, - "separateChatTypes": "Atskirti tiesioginius pokalbius ir grupes", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Nustatyti kaip pagrindinį slapyvardį", "@setAsCanonicalAlias": { "type": "String", "placeholders": {} }, - "setPermissionsLevel": "Nustatyti leidimų lygį", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Nustatyti būseną", "@setStatus": { "type": "String", @@ -1118,8 +1033,6 @@ "type": "String", "placeholders": {} }, - "addToSpaceDescription": "Pasirinkite erdvę, kad prie jos pridėtumėte šį pokalbį.", - "@addToSpaceDescription": {}, "start": "Pradžia", "@start": {}, "account": "Paskyra", @@ -1139,18 +1052,11 @@ "type": "String", "placeholders": {} }, - "botMessages": "Botų žinutės", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "channelCorruptedDecryptError": "Šifravimas buvo sugadintas", "@channelCorruptedDecryptError": { "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Pokalbis buvo pridėtas prie šios erdvės", - "@chatHasBeenAddedToThisSpace": {}, "compareEmojiMatch": "Palyginkite jaustukus", "@compareEmojiMatch": { "type": "String", @@ -1201,11 +1107,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "Pažymėti kaip skaitytą/neskaitytą", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Per daug užklausų. Pabandykite dar kartą vėliau!", "@tooManyRequestsWarning": { "type": "String", @@ -1221,11 +1122,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Užsklanda", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Įspėjimas!", "@warning": { "type": "String", @@ -1333,11 +1229,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "Atidarykite kamerą vaizdo įrašui", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "editBundlesForAccount": "Redaguoti šios paskyros paketus", "@editBundlesForAccount": {}, "serverRequiresEmail": "Šis serveris turi patvirtinti jūsų el. pašto adresą registracijai.", @@ -1399,20 +1290,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Matė {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sendSticker": "Siųsti lipduką", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sentAFile": "📁 {username} atsiuntė failą", "@sentAFile": { "type": "String", @@ -1534,8 +1411,6 @@ } } }, - "publish": "Paskelbti", - "@publish": {}, "openChat": "Atverti pokalbį", "@openChat": {}, "reportUser": "Pranešti apie vartotoją", @@ -1556,12 +1431,6 @@ }, "unsupportedAndroidVersion": "Nepalaikoma Android versija", "@unsupportedAndroidVersion": {}, - "emailOrUsername": "El. paštas arba vartotojo vardas", - "@emailOrUsername": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetNameError": "Pateikite rodomą vardą.", - "@widgetNameError": {}, "acceptedTheInvitation": "👍 {username} priėmė kvietimą", "@acceptedTheInvitation": { "type": "String", @@ -1610,18 +1479,6 @@ } } }, - "badServerVersionsException": "Namų serveris palaiko spec. versijas:\n{serverVersions}\nTačiau ši programa palaiko tik {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "bannedUser": "{username} užblokavo {targetName}", "@bannedUser": { "type": "String", @@ -1695,16 +1552,6 @@ }, "description": "State that {command} is not a valid /command." }, - "containsDisplayName": "Turi rodomą vardą", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Turi vartotojo vardą", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "couldNotDecryptMessage": "Nepavyko iššifruoti pranešimo: {error}", "@couldNotDecryptMessage": { "type": "String", @@ -1762,11 +1609,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Turite pasirinkti jaustuko trumpąjį kodą ir paveiksliuką!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "enableEmotesGlobally": "Įgalinti jaustukų paketą visur", "@enableEmotesGlobally": { "type": "String", @@ -1811,11 +1653,6 @@ } } }, - "inviteForMe": "Pakvietimas man", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteContactToGroup": "Pakviesti kontaktą į {groupName}", "@inviteContactToGroup": { "type": "String", @@ -1909,16 +1746,6 @@ } } }, - "toggleFavorite": "Perjungti parankinius", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Perjungti nutildytą", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "cantOpenUri": "Nepavyksta atidaryti URI {uri}", "@cantOpenUri": { "type": "String", @@ -2051,15 +1878,6 @@ } } }, - "videoWithSize": "Vaizdo įrašas ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "pinMessage": "Prisegti prie kambario", "@pinMessage": {}, "confirmEventUnpin": "Ar tikrai norite visam laikui atsegti įvykį?", @@ -2076,27 +1894,6 @@ "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Eksperimentiniai vaizdo skambučiai", "@experimentalVideoCalls": {}, - "switchToAccount": "Perjungti paskyrą į {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Kita paskyra", - "@nextAccount": {}, - "previousAccount": "Ankstesnė paskyra", - "@previousAccount": {}, - "widgetEtherpad": "Teksto pastaba", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetName": "Vardas", - "@widgetName": {}, - "widgetUrlError": "Netinkamas URL.", - "@widgetUrlError": {}, "youRejectedTheInvitation": "Jūs atmetėte kvietimą", "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Jūs prisijungėte prie pokalbio", @@ -2171,33 +1968,6 @@ } } }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "locationDisabledNotice": "Vietos nustatymo paslaugos yra išjungtos. Kad galėtumėte bendrinti savo buvimo vietą, įjunkite jas.", "@locationDisabledNotice": { "type": "String", @@ -2258,11 +2028,6 @@ } } }, - "setCustomEmotes": "Nustatyti pasirinktinius jaustukus", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "userLeftTheChat": "🚪 {username} paliko pokalbį", "@userLeftTheChat": { "type": "String", @@ -2279,21 +2044,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} neperskaityti pokalbiai}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, - "addWidget": "Pridėti programėlę", - "@addWidget": {}, - "widgetCustom": "Pasirinktinis", - "@widgetCustom": {}, - "errorAddingWidget": "Pridedant valdiklį įvyko klaida.", - "@errorAddingWidget": {}, "askSSSSSign": "Kad galėtumėte prijungti kitą asmenį, įveskite savo saugyklos slaptafrazę arba atkūrimo raktą.", "@askSSSSSign": { "type": "String", @@ -2306,32 +2056,16 @@ }, "commandHint_markasdm": "Pažymėti kaip tiesioginio pokalbio kambarį", "@commandHint_markasdm": {}, - "dehydrateTorLong": "TOR naudotojams rekomenduojama eksportuoti sesiją prieš uždarant langą.", - "@dehydrateTorLong": {}, "dehydrateWarning": "Šio veiksmo negalima atšaukti. Įsitikinkite, kad saugiai saugote atsarginę kopiją.", "@dehydrateWarning": {}, - "hydrateTorLong": "Ar paskutinį kartą eksportavote savo sesiją naudodami TOR? Greitai ją importuokite ir tęskite pokalbį.", - "@hydrateTorLong": {}, "commandHint_markasgroup": "Pažymėti kaip grupę", "@commandHint_markasgroup": {}, "pleaseEnterRecoveryKeyDescription": "Norėdami atrakinti senas žinutes, įveskite atkūrimo raktą, kuris buvo sukurtas ankstesnės sesijos metu. Atkūrimo raktas NĖRA jūsų slaptažodis.", "@pleaseEnterRecoveryKeyDescription": {}, - "callingPermissions": "Skambinimo leidimai", - "@callingPermissions": {}, "storeInAppleKeyChain": "Saugoti Apple raktų grandinėje", "@storeInAppleKeyChain": {}, - "callingAccount": "Skambinimo paskyra", - "@callingAccount": {}, "newSpace": "Nauja erdvė", "@newSpace": {}, - "callingAccountDetails": "Leidžia FluffyChat naudoti vietinę Android rinkiklio programą.", - "@callingAccountDetails": {}, - "appearOnTop": "Rodyti viršuje", - "@appearOnTop": {}, - "enterSpace": "Įeiti į erdvę", - "@enterSpace": {}, - "enterRoom": "Įeiti į kambarį", - "@enterRoom": {}, "allSpaces": "Visos erdvės", "@allSpaces": {}, "user": "Vartotojas", @@ -2351,20 +2085,12 @@ }, "dehydrate": "Eksportuoti sesiją ir išvalyti įrenginį", "@dehydrate": {}, - "dehydrateTor": "TOR Naudotojai: Eksportuoti sesiją", - "@dehydrateTor": {}, - "hydrateTor": "TOR Naudotojai: Importuoti sesijos eksportą", - "@hydrateTor": {}, "hydrate": "Atkurti iš atsarginės kopijos failo", "@hydrate": {}, - "pleaseEnterRecoveryKey": "Įveskite savo atkūrimo raktą:", - "@pleaseEnterRecoveryKey": {}, "recoveryKey": "Atkūrimo raktas", "@recoveryKey": {}, "recoveryKeyLost": "Pamestas atkūrimo raktas?", "@recoveryKeyLost": {}, - "indexedDbErrorLong": "Deja, pagal numatytuosius nustatymus žinučių saugojimas privačiame režime nėra įjungtas.\nPrašome apsilankyti\n - about:config\n - nustatykite dom.indexedDB.privateBrowsing.enabled į true\nPriešingu atveju FluffyChat paleisti neįmanoma.", - "@indexedDbErrorLong": {}, "countFiles": "{count} failai", "@countFiles": { "placeholders": { @@ -2385,33 +2111,16 @@ "@unlockOldMessages": {}, "storeInAndroidKeystore": "Saugoti Android raktų saugykloje", "@storeInAndroidKeystore": {}, - "indexedDbErrorTitle": "Privataus režimo problemos", - "@indexedDbErrorTitle": {}, "noKeyForThisMessage": "Taip gali atsitikti, jei žinutė buvo išsiųsta prieš prisijungiant prie paskyros šiame prietaise.\n\nTaip pat gali būti, kad siuntėjas užblokavo jūsų prietaisą arba kažkas sutriko su interneto ryšiu.\n\nAr galite perskaityti žinutę kitoje sesijoje? Tada galite perkelti žinutę iš jos! Eikite į Nustatymai > Prietaisai ir įsitikinkite, kad jūsų prietaisai patvirtino vienas kitą. Kai kitą kartą atidarysite kambarį ir abi sesijos bus pirmame plane, raktai bus perduoti automatiškai.\n\nNenorite prarasti raktų atsijungdami arba keisdami įrenginius? Įsitikinkite, kad nustatymuose įjungėte pokalbių atsarginę kopiją.", "@noKeyForThisMessage": {}, "foregroundServiceRunning": "Šis pranešimas rodomas, kai veikia pirmojo plano paslauga.", "@foregroundServiceRunning": {}, "screenSharingTitle": "ekrano bendrinimas", "@screenSharingTitle": {}, - "appearOnTopDetails": "Leidžia programėlę rodyti viršuje (nebūtina, jei jau esate nustatę Fluffychat kaip skambinimo paskyrą)", - "@appearOnTopDetails": {}, - "otherCallingPermissions": "Mikrofonas, kamera ir kiti FluffyChat leidimai", - "@otherCallingPermissions": {}, "whyIsThisMessageEncrypted": "Kodėl ši žinutė neperskaitoma?", "@whyIsThisMessageEncrypted": {}, "newGroup": "Nauja grupė", "@newGroup": {}, "screenSharingDetail": "Bendrinate savo ekraną per FuffyChat", - "@screenSharingDetail": {}, - "numChats": "{number} pokalbiai", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Slėpti nesvarbius būsenos įvykius", - "@hideUnimportantStateEvents": {} -} + "@screenSharingDetail": {} +} \ No newline at end of file diff --git a/lib/l10n/intl_lv.arb b/lib/l10n/intl_lv.arb index 9ad9c22f..cfca1b49 100644 --- a/lib/l10n/intl_lv.arb +++ b/lib/l10n/intl_lv.arb @@ -33,17 +33,7 @@ "type": "String", "placeholders": {} }, - "connect": "Savienot", - "@connect": { - "type": "String", - "placeholders": {} - }, "jumpToLastReadMessage": "Pārlēkt uz pēdējo izlasīto ziņu", - "allRooms": "Visām kopu tērzēšanām", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "obtainingLocation": "Iegūst atrašanās vietu…", "@obtainingLocation": { "type": "String", @@ -55,7 +45,6 @@ "type": "String", "placeholders": {} }, - "widgetVideo": "Video", "dismiss": "Atmest", "unknownDevice": "Nezināma ierīce", "@unknownDevice": { @@ -83,11 +72,6 @@ "type": "String", "placeholders": {} }, - "setPermissionsLevel": "Iestatīt atļauju līmeni", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "inviteContactToGroup": "Uzaicināt kontaktpersonu {groupName}", "@inviteContactToGroup": { "type": "String", @@ -108,7 +92,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Šai vietai tika pievienota tērzēšana", "reply": "Atbildēt", "@reply": { "type": "String", @@ -140,7 +123,6 @@ "type": "String", "description": "Usage hint for the command /html" }, - "widgetJitsi": "Jitsi Meet", "youAreNoLongerParticipatingInThisChat": "Tu vairs nepiedalies šajā tērzēšanā", "@youAreNoLongerParticipatingInThisChat": { "type": "String", @@ -152,13 +134,7 @@ "placeholders": {} }, "messageType": "Ziņas veids", - "indexedDbErrorLong": "Diemžēl ziņu krātuve pēc noklusējuma nav iespējota privātajā režīmā.\nLūgums apmeklēt\n - about:config\n - iestatīt dom.indexedDB.privateBrowsing.enabled kā true\nPretējā gadījumā nav iespējams palaist FluffyChat.", "oneClientLoggedOut": "Viens no klientiem ir atteicies", - "toggleMuted": "Pārslēgt apklusināšanu", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "unsupportedAndroidVersionLong": "Šai iespējai ir nepieciešama jaunāka Android versija. Lūgums pārbaudīt atjauninājumus vai Lineage OS atbalstu.", "kicked": "👞 {username} izmeta {targetName}", "@kicked": { @@ -207,8 +183,6 @@ "type": "String", "placeholders": {} }, - "startFirstChat": "Uzsāc savu pirmo tērzēšanu", - "callingAccount": "Zvanīšanas konts", "requestPermission": "Pieprasīt atļauju", "@requestPermission": { "type": "String", @@ -241,17 +215,11 @@ } }, "setColorTheme": "Iestatīt krāsu izskatu:", - "nextAccount": "Nākamais konts", "commandHint_create": "Izveidot tukšu kopas tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption", "@commandHint_create": { "type": "String", "description": "Usage hint for the command /create" }, - "singlesignon": "Vienotā pieteikšanās", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "warning": "Uzmanību!", "@warning": { "type": "String", @@ -369,7 +337,6 @@ "type": "String", "placeholders": {} }, - "widgetEtherpad": "Teksta piezīme", "waitingPartnerAcceptRequest": "Gaida, līdz biedrs apstiprinās pieprasījumu…", "@waitingPartnerAcceptRequest": { "type": "String", @@ -417,11 +384,6 @@ } } }, - "separateChatTypes": "Atdalīt tiešās tērzēšanas un kopas", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "tryAgain": "Jāmēģina vēlreiz", "areGuestsAllowedToJoin": "Vai vieslietotājiem ir ļauts pievienoties", "@areGuestsAllowedToJoin": { @@ -441,23 +403,6 @@ } } }, - "dateWithoutYear": "{day}.{month}.", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "removeDevice": "Noņemt ierīci", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanUserDescription": "Lietotājs varēs atkal pievienoties tērzēšanai, ja mēģinās.", "userAndUserAreTyping": "{username} un {username2} raksta…", "@userAndUserAreTyping": { @@ -497,7 +442,6 @@ } }, "youRejectedTheInvitation": "Tu noraidīji uzaicinājumu", - "otherCallingPermissions": "Mikrofons, kamera un citas FluffyChat atļaujas", "messagesStyle": "Ziņas:", "couldNotDecryptMessage": "Nevarēja atšifrēt ziņu: {error}", "@couldNotDecryptMessage": { @@ -514,11 +458,8 @@ "placeholders": {} }, "link": "Saite", - "widgetUrlError": "Tas nav derīgs URL.", - "emailOrUsername": "E-pasta adrese vai lietotājvārds", "newSpaceDescription": "Vietas ļauj apvienot tērzēšanas un būvēt privātas vai publiskas kopienas.", "chatDescription": "Tērzēšanas apraksts", - "callingAccountDetails": "Ļauj FluffyChat izmantot iebūvēto Android zvanīšanas lietotni.", "next": "Nākamais", "@next": { "type": "String", @@ -538,27 +479,11 @@ } } }, - "dateWithYear": "{year}.{month}.{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "editRoomAliases": "Labot istabu aizstājvārdus", "@editRoomAliases": { "type": "String", "placeholders": {} }, - "enterSpace": "Ieiet vietā", "encryptThisChat": "Šifrēt šo tērzēšanu", "fileName": "Datnes nosaukums", "@fileName": { @@ -570,7 +495,6 @@ "type": "String", "placeholders": {} }, - "previousAccount": "Iepriekšējais konts", "publicRooms": "Publiskas istabas", "@publicRooms": { "type": "String", @@ -591,23 +515,12 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Nepieciešams izvēlēties emocijas īskodu un attēlu.", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "reopenChat": "Atkārtoti atvērt tērzēšanu", - "pleaseEnterRecoveryKey": "Lūgums ievadīt savu atkopes atslēgu:", "create": "Izveidot", "@create": { "type": "String", "placeholders": {} }, - "toggleFavorite": "Pārslēgt iecienīto", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "no": "Nē", "@no": { "type": "String", @@ -618,7 +531,6 @@ "type": "String", "placeholders": {} }, - "widgetNameError": "Lūgums norādīt attēlojamo nosaukumu.", "inoffensive": "Nav aizskarošs", "@inoffensive": { "type": "String", @@ -640,7 +552,6 @@ "type": "String", "placeholders": {} }, - "addWidget": "Pievienot logrīku", "all": "Viss", "@all": { "type": "String", @@ -702,7 +613,6 @@ } } }, - "hydrateTor": "TOR lietotāji: ievietot sesijas izguvi", "pushNotificationsNotAvailable": "Pašpiegādes paziņojumi nav pieejami", "passwordRecovery": "Paroles atkope", "@passwordRecovery": { @@ -761,7 +671,6 @@ "type": "String", "placeholders": {} }, - "signInWithPassword": "Pieteikties ar paroli", "lastActiveAgo": "Pēdējoreiz tiešsaistē: {localizedTimeShort}", "@lastActiveAgo": { "type": "String", @@ -834,11 +743,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Doties uz jauno istabu", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "commandHint_clearcache": "Iztīrīt kešatmiņu", "@commandHint_clearcache": { "type": "String", @@ -867,15 +771,6 @@ "placeholders": {} }, "whyIsThisMessageEncrypted": "Kādēļ šī ziņa ir nelasāma?", - "unreadChats": "{unreadCount, plural, zero{{unreadCount} nelasītu tērzēšanu} =1{{unreadCount} nelasīta tērzēšana} other{{unreadCount} nelasītas tērzēšanas}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "rejectedTheInvitation": "{username} noraidīja uzaicinājumu", "@rejectedTheInvitation": { "type": "String", @@ -901,22 +796,12 @@ "placeholders": {} }, "importFromZipFile": "Ievietot no .zip datnes", - "toggleUnread": "Atzīmēt kā lasītu/nelasītu", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "or": "Vai", "@or": { "type": "String", "placeholders": {} }, "dehydrateWarning": "Šī darbība nav atdarāma. Jānodrošina, ka rezerves kopijas datne tiek droši uzglabāta.", - "sendOriginal": "Nosūtīt sākotnējo", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "noOtherDevicesFound": "Netika atrastas citas ierīces", "whoIsAllowedToJoinThisGroup": "Kuram ir ļauts pievienoties šai kopai", "@whoIsAllowedToJoinThisGroup": { @@ -928,15 +813,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "{username} redzēja", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "storeSecurlyOnThisDevice": "Droši uzglabāt šajā ierīcē", "yourChatBackupHasBeenSetUp": "Tērzēšanu rezerves kopēšana iestatīta.", "chatBackup": "Tērzēšanu rezerves kopēšana", @@ -1011,20 +887,6 @@ "type": "String", "placeholders": {} }, - "containsDisplayName": "Satur attēlojamo vārdu", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "signInWith": "Pieteikties ar {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "username": "Lietotājvārds", "@username": { "type": "String", @@ -1051,11 +913,6 @@ "type": "String", "placeholders": {} }, - "people": "Cilvēki", - "@people": { - "type": "String", - "placeholders": {} - }, "changedTheHistoryVisibilityTo": "{username} nomainīja vēstures redzamību uz {rules}", "@changedTheHistoryVisibilityTo": { "type": "String", @@ -1093,7 +950,6 @@ } } }, - "callingPermissions": "Zvanīšanas atļaujas", "delete": "Izdzēst", "@delete": { "type": "String", @@ -1122,20 +978,6 @@ "placeholders": {} }, "unlockOldMessages": "Atslēgt vecās ziņas", - "identity": "Identitāte", - "@identity": { - "type": "String", - "placeholders": {} - }, - "numChats": "{number} tērzēšanas", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "changedTheJoinRulesTo": "{username} nomainīja pievienošanās nosacījumus uz {joinRules}", "@changedTheJoinRulesTo": { "type": "String", @@ -1249,11 +1091,6 @@ "@sendAsText": { "type": "String" }, - "inviteForMe": "Uzaicinājumu man", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "archiveRoomDescription": "Tērzēšana tiks pārvietota uz arhīvu. Citi lietotāji redzēs, ka pameti tērzēšanu.", "exportEmotePack": "Izgūt emociju paku kā .zip", "changedTheChatNameTo": "{username} nomainīja tērzēšanas nosaukumu uz '{chatname}'", @@ -1268,25 +1105,11 @@ } } }, - "sendSticker": "Nosūtīt uzlīmi", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "account": "Konts", "@account": { "type": "String", "placeholders": {} }, - "switchToAccount": "Pārslēgties uz kontu {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "commandInvalid": "Nederīga komanda", "@commandInvalid": { "type": "String" @@ -1372,7 +1195,6 @@ "type": "String", "placeholders": {} }, - "inviteContactToGroupQuestion": "Vai vēlies uzaicināt {contact} uz tērzēšanu \"{groupName}\"?", "emoteExists": "Emocija jau pastāv.", "@emoteExists": { "type": "String", @@ -1423,13 +1245,11 @@ "type": "String", "placeholders": {} }, - "appearOnTopDetails": "Ļauj lietotnei parādīties virspusē (nav nepieciešams, ja FluffyChat jau ir iestatīts kā zvanīšanas konts)", "roomHasBeenUpgraded": "Istaba tika atjaunināta", "@roomHasBeenUpgraded": { "type": "String", "placeholders": {} }, - "enterRoom": "Ieiet istabā", "enableEmotesGlobally": "Iespējot kā vispārēju emociju paku", "@enableEmotesGlobally": { "type": "String", @@ -1497,18 +1317,6 @@ } }, "confirmEventUnpin": "Vai tiešām neatgriezeniski atspraust šo notikumu?", - "badServerVersionsException": "Mājasserveris nodrošina specifikācijas versijas:\n{serverVersions}\nSavukārt, lietotne atbalsta tikai {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "youInvitedUser": "📩 Tu uzaicināji {user}", "@youInvitedUser": { "placeholders": { @@ -1543,11 +1351,6 @@ } } }, - "license": "Licence", - "@license": { - "type": "String", - "placeholders": {} - }, "addToSpace": "Pievienot vietai", "unbanFromChat": "Atcelt liegumu tērzēšanā", "@unbanFromChat": { @@ -1565,11 +1368,6 @@ "description": "State that {command} is not a valid /command." }, "redactMessageDescription": "Ziņa tiks labota visiem šīs sarunas dalībniekiem. To nevar atdarīt.", - "rejoin": "Pievienoties atkārtoti", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "recoveryKey": "Atkopes atslēga", "redactMessage": "Labot ziņu", "@redactMessage": { @@ -1597,7 +1395,6 @@ "type": "String", "placeholders": {} }, - "dehydrateTorLong": "TOR lietotājiem ir ieteicams izgūt sesiju pirms loga aizvēršanas.", "yourPublicKey": "Tava publiskā atslēga", "@yourPublicKey": { "type": "String", @@ -1671,11 +1468,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Dalībnieku izmaiņām", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "joinRoom": "Pievienoties istabai", "@joinRoom": { "type": "String", @@ -1693,9 +1485,7 @@ "placeholders": {} }, "serverRequiresEmail": "Šim serverim ir nepieciešams pārbaudīt Tavu e-pasta adresi reģistrācijai.", - "hideUnimportantStateEvents": "Paslēpt nebūtiskus stāvokļa notikumus", "screenSharingTitle": "ekrāna kopīgošana", - "widgetCustom": "Pielāgots", "sentCallInformations": "{senderName} nosūtīja informāciju par zvanu", "@sentCallInformations": { "type": "String", @@ -1705,7 +1495,6 @@ } } }, - "addToSpaceDescription": "Atlasīt vietu, kurai pievienot šo tērzēšanu.", "googlyEyesContent": "{senderName} sūta izbolītas acis", "@googlyEyesContent": { "type": "String", @@ -1738,7 +1527,6 @@ "type": "String", "placeholders": {} }, - "addChatDescription": "Pievienot tērzēšanas aprakstu…", "sentAnAudio": "🎤 {username} nosūtīja skaņu", "@sentAnAudio": { "type": "String", @@ -1781,7 +1569,6 @@ } } }, - "publish": "Publicēt", "openLinkInBrowser": "Atvērt saiti pārlūkā", "clearArchive": "Iztīrīt arhīvu", "appLock": "Lietotnes aizslēgšana", @@ -1837,8 +1624,6 @@ "placeholders": {} }, "inviteGroupChat": "📨 Uzaicinājums uz kopas tērzēšanu", - "appearOnTop": "Parādīt virspusē", - "invitePrivateChat": "📨 Uzaicinājums uz privātu tērzēšanu", "verifyTitle": "Apliecina citu kontu", "@verifyTitle": { "type": "String", @@ -1882,11 +1667,6 @@ "description": "Usage hint for the command /ban" }, "importEmojis": "Ievietot emocijzīmes", - "confirm": "Apstiprināt", - "@confirm": { - "type": "String", - "placeholders": {} - }, "wasDirectChatDisplayName": "Tukša tērzēšana (bija {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -1945,7 +1725,6 @@ }, "newGroup": "Jauna kopa", "bundleName": "Komplekta nosaukums", - "dehydrateTor": "TOR lietotāji: izgūt sesiju", "removeFromSpace": "Noņemt no vietas", "dateAndTimeOfDay": "{date}, {timeOfDay}", "@dateAndTimeOfDay": { @@ -2026,7 +1805,6 @@ } } }, - "profileNotFound": "Lietotāju serverī nevarēja atrast. Varbūt ir nebūšanas ar savienojumu vai lietotājs nepastāv.", "jump": "Pārlēkt", "groups": "Kopas", "@groups": { @@ -2058,15 +1836,6 @@ } }, "sorryThatsNotPossible": "Atvaino! Tas nav iespējams", - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "oopsSomethingWentWrong": "Ups! Kaut kas nogāja greizi…", "@oopsSomethingWentWrong": { "type": "String", @@ -2102,11 +1871,6 @@ } } }, - "containsUserName": "Satur lietotājvārdu", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "messages": "Ziņas", "@messages": { "type": "String", @@ -2143,11 +1907,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Iestatīt pielāgotas emocijas", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "startedACall": "{senderName} uzsāka zvanu", "@startedACall": { "type": "String", @@ -2167,11 +1926,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Paziņojumi iespējoti šim kontam", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "deleteMessage": "Izdzēst ziņu", "@deleteMessage": { "type": "String", @@ -2187,23 +1941,12 @@ "type": "String", "placeholders": {} }, - "setTheme": "Iestatīt izskatu:", "changeTheHomeserver": "Mainīt mājasserveri", "@changeTheHomeserver": { "type": "String", "placeholders": {} }, "youJoinedTheChat": "Tu pievienojies tērzēšanai", - "wallpaper": "Ekrāntapete:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, - "openVideoCamera": "Atvērt kameru video uzņemšanai", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "play": "Atskaņot {fileName}", "@play": { "type": "String", @@ -2244,7 +1987,6 @@ "type": "String", "placeholders": {} }, - "widgetName": "Nosaukums", "sentASticker": "😊 {username} nosūtīja uzlīmi", "@sentASticker": { "type": "String", @@ -2254,7 +1996,6 @@ } } }, - "errorAddingWidget": "Kļūda logrīka pievienošanā.", "commandHint_dm": "Uzsākt tiešu tērzēšanu\nLai atspējotu šifrēšanu, jāizmanto --no-encryption", "@commandHint_dm": { "type": "String", @@ -2350,18 +2091,12 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Lūgums izvēlēties", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "share": "Kopīgot", "@share": { "type": "String", "placeholders": {} }, "commandHint_googly": "Nosūtīt izbolītu acu pāri", - "pleaseTryAgainLaterOrChooseDifferentServer": "Lūgums vēlāk mēģināt vēlreiz vai izvēlēties citu serveri.", "createGroup": "Izveidot kopu", "privacy": "Privātums", "@privacy": { @@ -2378,18 +2113,7 @@ "type": "String", "placeholders": {} }, - "hydrateTorLong": "Vai sesija pēdējoreiz tika izgūta TOR? Ātri ievieto to un turpini tērzēšanu!", "time": "Laiks", - "enterYourHomeserver": "Jāievada mājasserveris", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, - "botMessages": "Robotprogrammatūras ziņām", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Par saturu tika ziņos servera pārvaldītājiem", "@contentHasBeenReported": { "type": "String", @@ -2431,11 +2155,6 @@ "type": "String", "placeholders": {} }, - "setInvitationLink": "Iestatīt uzaicinājumu saiti", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "pinMessage": "Piespraust istabai", "screenSharingDetail": "Tu kopīgo savu ekrānu FluffyChat", "muteChat": "Apklusināt tērzēšanu", @@ -2455,7 +2174,6 @@ "type": "String", "placeholders": {} }, - "indexedDbErrorTitle": "Privātā režīma nebūšanas", "endedTheCall": "{senderName} beidza zvanu", "@endedTheCall": { "type": "String", @@ -2477,33 +2195,20 @@ "hideRedactedMessages": "Paslēpt labošanas ziņas", "hideRedactedMessagesBody": "Ja kāds labo ziņu, tā vairs nebūs redzama tērzēšanā.", "blockListDescription": "Ir iespējams atslēgt traucējošus lietotājus. Nebūs iespējams saņem jebkādas ziņas vai uzaicinājumus uz istabām no lietotājiem, kas ir personīgajā izslēgšanas sarakstā.", - "hideMemberChangesInPublicChatsBody": "Nerādīt tērzēšanas plūsmā, ja kāds pievienojas publiskai tērzēšanai vai pamet to, lai uzlabotu lasāmību.", "overview": "Pārskats", - "notifyMeFor": "Paziņot man par", "wrongRecoveryKey": "Atvaino... Nešķiet, ka šī būtu pareiza atkopes atslēga.", "block": "Izslēgt", - "hideMemberChangesInPublicChats": "Paslēpt dalībnieku izmaiņas publiskajās tērzēšanās", "passwordRecoverySettings": "Paroles atkopes iestatījumi", "blockedUsers": "Atslēgtie lietotāji", "transparent": "Caurspīdīgs", "searchForUsers": "Meklēt @lietotājus...", "pleaseEnterYourCurrentPassword": "Lūgums ievadīt savu pašreizējo paroli", "publicSpaces": "Publiskas vietas", - "decline": "Atteikt", "joinSpace": "Pievienoties vietai", "createGroupAndInviteUsers": "Izveidot kopu un uzaicināt lietotājus", "groupCanBeFoundViaSearch": "Kopu var atrast meklēšanā", "commandHint_sendraw": "Nosūtīt neapstrādātu JSON", "newPassword": "Jauna parole", - "forwardMessageTo": "Pārsūtīt ziņu uz {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "Nosūtīt lasīšanas atskaites", "verifyOtherUser": "🔐 Apliecināt otru lietotāju", "verifyOtherDevice": "🔐 Apliecināt otru ierīci", @@ -2561,28 +2266,6 @@ "commandHint_ignore": "Neņemt vērā norādīto Matrix Id", "searchChatsRooms": "Meklēt #tērzēšanas, @lietotājus...", "groupName": "Kopas nosaukums", - "presenceStyle": "Klātesamība:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, - "youInvitedToBy": "📩 Tu tiki uzaicināts ar saiti:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "userWouldLikeToChangeTheChat": "{user} vēlas pievienoties tērzēšanai.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Vēl nav izveidota neviena publiska saite", "knock": "Pieklauvēt", "stickers": "Uzlīmes", "usersMustKnock": "Lietotājiem jāpieklauvē", @@ -2599,12 +2282,10 @@ } }, "nothingFound": "Nekas netika atrasts...", - "startConversation": "Uzsākt sarunu", "databaseMigrationTitle": "Datubāze ir optimizēta", "leaveEmptyToClearStatus": "Atstāt tukšu, lai notīrītu savu stāvokli.", "pleaseChooseAStrongPassword": "Lūgums izvēlēties spēcīgu paroli", "passwordIsWrong": "Ievadītā parole ir nepareiza", - "publicLink": "Publiska saite", "thisDevice": "Šī ierīce:", "acceptedKeyVerification": "{sender} apstiprināja atslēgas apliecināšanu", "@acceptedKeyVerification": { @@ -2615,7 +2296,6 @@ } } }, - "userRole": "Lietotāja loma", "noDatabaseEncryption": "Šajā platformā datubāzes šifrēšana netiek nodrošināta", "presencesToggle": "Rādīt citu lietotāju stāvokļa ziņas", "@presencesToggle": { @@ -2626,15 +2306,6 @@ "passwordsDoNotMatch": "Paroles nesakrīt", "publicChatAddresses": "Publiskas tērzēšanas adreses", "createNewAddress": "Izveidot jaunu adresi", - "minimumPowerLevel": "{level} ir zemākais spēka līmenis.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "discover": "Atklāt", "unreadChatsInApp": "{appname}: {unread} nelasītas tērzēšanas", "@unreadChatsInApp": { @@ -2648,21 +2319,8 @@ } } }, - "subspace": "Apakšvieta", "addChatOrSubSpace": "Pievienot tērzēšanu vai apakšvietu", "formattedMessagesDescription": "Attēlot bagātinātu ziņu saturu, piemēram, ar Markdown iezīmētu treknrakstu.", - "databaseBuildErrorBody": "Nebija iespējams izveidot SQlite datubāzi. Lietotne pagaidām mēģina izmantot iepriekšējo datubāzi. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "Sesija ir zaudēta. Lūgums ziņot par šo kļūdu izstrādātājiem {url}. Kļūdas ziņojums ir: {error}", "@sessionLostBody": { "type": "String", @@ -2776,9 +2434,6 @@ "chatPermissionsDescription": "Noteikt, kurš spēka līmenis ir nepieciešams noteiktām darbībām šajā tērzēšanā. Spēka līmeņi 0, 50 un 100 parasti atbilst lietotājiem, moderatoriem un pārvaldītājiem, bet ir iespējams jebkāds iedalījums.", "doesNotSeemToBeAValidHomeserver": "Neizskatās pēc saderīga mājasservera. Nepareizs URL?", "loginWithMatrixId": "Pieteikties ar Matrix-Id", - "discoverHomeservers": "Atklāt mājasserverus", - "whatIsAHomeserver": "Kas ir mājasserveris?", - "homeserverDescription": "Visi lietotāja dati tiek glabāti mājasserverī, gluži kā ar e-pasta nodrošinātāju. Ir iespējams izvēlēties, kuru mājasserveri izmantot, saglabājot iespēju sazināties ar ikvienu. Vairāk var uzzināt https://matrix.org.", "updateInstalled": "🎉 Atjauninājums {version} uzstādīts.", "@updateInstalled": { "type": "String", @@ -2789,20 +2444,7 @@ } }, "changelog": "Izmaiņu žurnāls", - "countChatsAndCountParticipants": "{chats} tērzēšanas un {participants} dalībnieki", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Vairs netika atrasta neviena tērzēšana...", - "joinedChats": "Tērzēšanas, kurās piedalos", "unread": "Nelasītas", "space": "Vieta", "spaces": "Vietas", @@ -2876,7 +2518,6 @@ "compress": "Saspiest", "unableToJoinChat": "Nevarēja pievienoties tērzēšanai. Varbūt otra puse jau ir aizvērusi sarunu.", "appWantsToUseForLoginDescription": "Ar šo tiek ļauts lietotnei un tīmekļvietnei kopīgot informāciju par Tevi.", - "appIntroduction": "FluffyChat ļauj tērzēt ar draugiem, kuri izmanto dažādas ziņojumapmaiņas lietotnes. Vairāk var uzzināt https://matrix.org vai vienkārši piesitot *Turpināt*.", "synchronizingPleaseWaitCounter": " Sinhronizē... ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -2968,10 +2609,7 @@ "notSupportedOnThisDevice": "Šajā ierīcē nav atbalstīts", "enterNewChat": "Ieiet jaunajā tērzēšanā", "commandHint_roomupgrade": "Uzlabot šo istabu uz norādīto istabas versiju", - "setCustomPermissionLevel": "Iestatīt pielāgotu atļauju līmeni", - "setPermissionsLevelDescription": "Lūgums zemāk atlasīt iepriekšizveidotu lomu vai ievadīt pielāgotu atļauju līmeni starp 0 un 100.", "ignoreUser": "Neņemt vērā lietotāju", - "normalUser": "Parasts lietotājs", "youHaveKnocked": "Tu pieklauvēji", "pleaseWaitUntilInvited": "Lūgums tagad uzgaidīt, līdz kāds no istabas uzaicinās Tevi.", "approve": "Apstiprināt", @@ -3007,10 +2645,6 @@ "longPressToRecordVoiceMessage": "Ilga piespiešana, lai ierakstītu balss ziņu.", "pause": "Apturēt", "resume": "Atsākt", - "newSubSpace": "Jauna apakšvieta", - "moveToDifferentSpace": "Pārvietot uz citu vietu", - "moveUp": "Pārvietot augšup", - "moveDown": "Pārvietot lejup", "removeFromSpaceDescription": "Tērzēšana tiks noņemta no vietas, bet tā joprojām būs redzama tērzēšanu sarakstā.", "countChats": "{chats} tērzēšanas", "@countChats": { @@ -3053,7 +2687,6 @@ "startPoll": "Sākt aptauju", "endPoll": "Noslēgt aptauju", "answersVisible": "Atbildes ir redzamas", - "answersHidden": "Atbildes ir paslēptas", "pollQuestion": "Aptaujas jautājums", "answerOption": "Atbildes iespēja", "addAnswerOption": "Pievienot atbildes iespēju", @@ -3121,11 +2754,10 @@ "logs": "Žurnāli", "advancedConfigs": "Izvērsta konfigurācijas", "advancedConfigurations": "Izvērstas konfigurācijas", - "signInWithLabel": "Pieteikties ar:", "theProcessWasCanceled": "Darbība tika atcelta.", "signIn": "Pieteikties", "createNewAccount": "Izveidot jaunu kontu", "signUpGreeting": "FluffyChat ir decentralizēta. Jāatlasa serveris, kurā ir vēlēšanās izveidot savu kontu, un aiziet!", "signInGreeting": "Jau ir Matrix konts? Laipni lūdzam atpakaļ! Jāatlasa savs mājasserveris un jāpiesakās.", "appIntro": "Ar FluffyChat vari tērzēt ar saviem draugiem. Tā ir droša un decentralizēta [matrix] ziņapmaiņas lietotne. Vairāk var uzzināt https://matrix.org, ja ir vēlēšanās, vai vienkārši jāpiesakās." -} +} \ No newline at end of file diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 863b667b..01c0e58c 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -128,11 +128,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Bot-meldinger", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Avbryt", "@cancel": { "type": "String", @@ -357,31 +352,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Bekreft", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Koble til", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt invitert til gruppen", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Inneholder visningsnavn", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Inneholder brukernavn", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Innholdet har blitt rapportert til tjeneradministratorene", "@contentHasBeenReported": { "type": "String", @@ -456,33 +431,6 @@ } } }, - "dateWithoutYear": "{day} {month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day} {month} {year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Dette vil skru av din brukerkonto for godt, og kan ikke angres! Er du sikker?", "@deactivateAccountWarning": { "type": "String", @@ -583,11 +531,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Du må velge en smilefjes-kode og et bilde!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Tom sludring", "@emptyChat": { "type": "String", @@ -637,11 +580,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Skriv inn din hjemmetjener", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "Alt er klart!", "@everythingReady": { "type": "String", @@ -753,11 +691,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identitet", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorer", "@ignore": { "type": "String", @@ -819,11 +752,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Invitasjon for meg", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} har invitert deg til FluffyChat. \n1. Installer FluffyChat: https://fluffychat.im \n2. Registrer deg eller logg inn \n3. Åpne invitasjonslenken: \n {link}", "@inviteText": { "type": "String", @@ -903,11 +831,6 @@ "type": "String", "placeholders": {} }, - "license": "Lisens", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Lys", "@lightTheme": { "type": "String", @@ -951,11 +874,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Medlemsendringer", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Nevn", "@mention": { "type": "String", @@ -1041,11 +959,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Merknader påslått for denne kontoen", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} brukere skriver …", "@numUsersTyping": { "type": "String", @@ -1212,11 +1125,6 @@ } } }, - "rejoin": "Ta del igjen", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Fjern", "@remove": { "type": "String", @@ -1236,11 +1144,6 @@ } } }, - "removeDevice": "Fjern enhet", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Opphev bannlysning", "@unbanFromChat": { "type": "String", @@ -1281,15 +1184,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Sett av {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Send", "@send": { "type": "String", @@ -1320,11 +1214,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Send original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Send video", "@sendVideo": { "type": "String", @@ -1384,21 +1273,6 @@ } } }, - "setCustomEmotes": "Sett tilpassede smilefjes", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Sett invitasjonslenke", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Sett tilgangsnivå", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Angi status", "@setStatus": { "type": "String", @@ -1544,15 +1418,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} uleste sludringer}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} og {count} andre skriver…", "@userAndOthersAreTyping": { "type": "String", @@ -1662,11 +1527,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Bakgrunnsbilde:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Advarsel!", "@warning": { "type": "String", @@ -1727,21 +1587,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "Marker som lest/ulest", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Veksle forstumming", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleFavorite": "Veksle favorittmerking", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "noConnectionToTheServer": "Ingen tilkobling til tjeneren", "@noConnectionToTheServer": { "type": "String", @@ -1777,18 +1622,6 @@ } }, "sendOnEnter": "Trykk på enter for å sende", - "badServerVersionsException": "Hjemmeserveren støtter følgene Spec-versjoner:\n{serverVersions}\nMen applikasjonen støtter kun {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "blocked": "Blokkert", "@blocked": { "type": "String", @@ -1832,8 +1665,6 @@ }, "appLockDescription": "Lås appen med en PIN-kode når den ikke er i bruk", "ignoreUser": "Ignorer bruker", - "setCustomPermissionLevel": "Angi egendefinert tillatelsesnivå", - "normalUser": "Vanlig bruker", "replace": "Erstatt", "noMoreChatsFound": "Ingen flere chatter funnet ...", "confirmMatrixId": "Bekreft Matrix-IDen din for å slette kontoen din.", @@ -1852,18 +1683,10 @@ "openLinkInBrowser": "Åpne lenke i nettleser", "start": "Start", "passwordsDoNotMatch": "Passordene stemmer ikke overens", - "decline": "Avslå", - "emailOrUsername": "E-post eller brukernavn", "encryptThisChat": "Krypter denne chatten", - "nextAccount": "Neste konto", "doNotShowAgain": "Ikke vis igjen", "notificationRuleContainsUserName": "Inneholder brukernavn", "notificationRuleMaster": "Demp alle varslinger", - "presenceStyle": "Tilstedeværelse:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "verified": "Verifisert", "@verified": { "type": "String", @@ -1875,11 +1698,6 @@ "placeholders": {} }, "recoveryKey": "Gjenopprettingsnøkkel", - "sendSticker": "Send sticker", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "shareLocation": "Del lokasjon", "@shareLocation": { "type": "String", @@ -1897,7 +1715,6 @@ }, "dismiss": "Avvis", "openChat": "Åpne chat", - "addWidget": "Legg til widget", "reopenChat": "Gjenåpne chat", "changeTheDescriptionOfTheGroup": "Endre beskrivelsen til chatten", "inviteOtherUsers": "Inviter andre brukere til denne chatten", @@ -1906,14 +1723,7 @@ "notificationRuleJitsi": "Jitsi", "takeAPhoto": "Ta et bilde", "setChatDescription": "Sett chat beskrivelse", - "singlesignon": "Single Sign on (SSO)", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "openGallery": "Åpne galleri", - "widgetCustom": "Egendefinert", - "widgetVideo": "Video", "pushNotificationsNotAvailable": "Push-varsler er ikke tilgjengelige", "gallery": "Galleri", "moderatorLevel": "{level} - Moderator", @@ -1956,7 +1766,6 @@ "notificationRuleEncrypted": "Kkryptert", "more": "Mer", "passwordIsWrong": "Det inntastede passordet ditt er feil", - "startConversation": "Start samtale", "manageAccount": "Administrer konto", "nothingFound": "Ingenting funnet...", "incomingMessages": "Innkommende meldinger", @@ -1964,10 +1773,7 @@ "contactServerAdmin": "Kontakt serveradministrator", "setWallpaper": "Sett bakgrunnsbilde", "unsupportedAndroidVersion": "Usupportert Android-versjon", - "widgetName": "Navn", "youJoinedTheChat": "Du har blitt med i chatten", - "widgetJitsi": "Jitsi Meet", - "widgetNameError": "Vennligst oppgi et visningsnavn.", "youRejectedTheInvitation": "Du har avvist invitasjonen", "formattedMessages": "Formaterte meldinger", "allDevices": "Alle enheter", @@ -1975,7 +1781,6 @@ "sorryThatsNotPossible": "Beklager... det er ikke mulig", "markAsUnread": "Marker som ulest", "newGroup": "Ny gruppe", - "userRole": "Brukerrolle", "addLink": "Legg til lenke", "synchronizingPleaseWaitCounter": " Synkroniserer… ({percentage}%)", "@synchronizingPleaseWaitCounter": { @@ -2037,22 +1842,9 @@ } } }, - "addChatDescription": "Legg til chat beskrivelse...", "commandHint_roomupgrade": "Oppgrader dette rommet til den gitte romversjonen", - "hideMemberChangesInPublicChatsBody": "Ikke vis i chattens tidslinje hvis noen blir med i eller forlater en offentlig chat for økt lesbarhet.", "overview": "Oversikt", - "notifyMeFor": "Varsle meg om", "passwordRecoverySettings": "Innstillinger for gjenoppretting av passord", - "people": "Folk", - "@people": { - "type": "String", - "placeholders": {} - }, - "pleaseChoose": "Vennligst velg", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Vennligst velg en passordkode", "@pleaseChooseAPasscode": { "type": "String", @@ -2063,20 +1855,13 @@ "type": "String", "placeholders": {} }, - "pleaseEnterRecoveryKey": "Vennligst skriv inn gjenopprettingsnøkkelen din:", "pleaseEnterYourPin": "Oppgi din PIN-kode", "@pleaseEnterYourPin": { "type": "String", "placeholders": {} }, "globalChatId": "Global chat-ID", - "allRooms": "Alle gruppechatter", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "chatPermissions": "Chat tillatelser", - "setPermissionsLevelDescription": "Vennligst velg en forhåndsdefinert rolle nedenfor eller skriv inn et tilpasset tillatelsesnivå mellom 0 og 100.", "commandHint_invite": "Inviter den gitte brukeren til dette rommet", "@commandHint_invite": { "type": "String", @@ -2101,7 +1886,6 @@ }, "sendCanceled": "Sending avbrutt", "loginWithMatrixId": "Logg på med Matrix ID", - "discoverHomeservers": "Oppdag hjemmeservere", "shareInviteLink": "Del invitasjonslenke", "scanQrCode": "Skann QR-kode", "messagesStyle": "Meldinger:", @@ -2121,8 +1905,6 @@ "type": "String", "placeholders": {} }, - "previousAccount": "Forrige konto", - "widgetUrlError": "Dette er ikke en gyldig URL.", "custom": "Egendefinert", "user": "Bruker", "users": "Brukere", @@ -2151,16 +1933,6 @@ "time": "Tid", "messageType": "Meldingstype", "sender": "Avsender", - "publish": "Publiser", - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "reportUser": "Rapporter bruker", "youHaveWithdrawnTheInvitationFor": "Du har trukket tilbake invitasjonen for {user}", "@youHaveWithdrawnTheInvitationFor": { @@ -2180,17 +1952,8 @@ } }, "chatDescriptionHasBeenChanged": "Chatbeskrivelsen er endret", - "goToTheNewRoom": "Gå til det nye rommet", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "screenSharingTitle": "skjermdeling", "screenSharingDetail": "Du deler skjermen din i FuffyChat", - "callingPermissions": "Anropstillatelser", - "callingAccountDetails": "Lar FluffyChat bruke den innebygde Android-oppringingsappen.", - "appearOnTop": "Vis øverst", - "otherCallingPermissions": "Mikrofon, kamera og andre FluffyChat-tillatelser", "whyIsThisMessageEncrypted": "Hvorfor er denne meldingen uleselig?", "yourGlobalUserIdIs": "Din globale bruker-ID er: ", "searchChatsRooms": "Søk etter #chatter, @brukere...", @@ -2233,11 +1996,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "Åpne kameraet for en video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "obtainingLocation": "Henter sted …", "@obtainingLocation": { "type": "String", @@ -2246,14 +2004,6 @@ "noDatabaseEncryption": "Databasekryptering støttes ikke på denne plattformen", "changeGeneralChatSettings": "Endre generelle chatinnstillinger", "changeTheChatPermissions": "Endre chattillatelsene", - "youInvitedToBy": "📩 Du har blitt invitert via lenke til:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "youInvitedBy": "📩 Du har blitt invitert av {user}", "@youInvitedBy": { "placeholders": { @@ -2355,25 +2105,12 @@ "pleaseEnterANumber": "Vennligst skriv inn et tall større enn 0", "archiveRoomDescription": "Chatten vil bli flyttet til arkivet. Andre brukere vil kunne se at du har forlatt chatten.", "removeDevicesDescription": "Du vil bli logget ut av denne enheten og vil ikke lenger kunne motta meldinger.", - "profileNotFound": "Brukeren ble ikke funnet på serveren. Kanskje det er et tilkoblingsproblem, eller brukeren finnes ikke.", - "setTheme": "Angi tema:", "setColorTheme": "Angi fargetema:", "inviteGroupChat": "📨 Invitasjon til gruppechat", - "invitePrivateChat": "📨 Invitasjon til privat chat", "pleaseChooseAStrongPassword": "Vennligst velg et sterkt passord", - "publicLink": "Offentlig lenke", "publicChatAddresses": "Offentlige chatadresser", "createNewAddress": "Opprett ny adresse", "initAppError": "Det oppsto en feil under oppstart av appen", - "minimumPowerLevel": "{level} er det laveste strømnivået.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "sendReadReceipts": "Send lesebekreftelser", "searchMore": "Søk mer...", "shareKeysWithDescription": "Hvilke enheter bør man stole på, slik at de kan lese meldingene dine i krypterte chatter?", @@ -2436,28 +2173,7 @@ } } }, - "forwardMessageTo": "Videresende melding til {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Skjul uviktige tilstandshendelser", "hidePresences": "Skjul statuslisten?", - "signInWithPassword": "Logg inn med passord", - "pleaseTryAgainLaterOrChooseDifferentServer": "Prøv igjen senere eller velg en annen server.", - "signInWith": "Logg inn med {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "noMessagesYet": "Ingen meldinger enda", "notificationRuleMasterDescription": "Overstyrer alle andre regler og deaktiverer alle varsler.", "notificationRuleSuppressNotices": "Undertrykk automatiserte meldinger", @@ -2575,7 +2291,6 @@ "hideRedactedMessagesBody": "Hvis noen redigerer en melding, vil ikke denne meldingen lenger være synlig i chatten.", "blockListDescription": "Du kan blokkere brukere som forstyrrer deg. Du vil ikke kunne motta meldinger eller rominvitasjoner fra brukerne på din personlige blokkeringsliste.", "blockUsername": "Ignorer brukernavn", - "inviteContactToGroupQuestion": "Vil du invitere {contact} til chatten «{groupName}»?", "noChatDescriptionYet": "Ingen chatbeskrivelse er opprettet ennå.", "redactMessageDescription": "Meldingen vil bli redigert for alle deltakerne i denne samtalen. Dette kan ikke angres.", "optionalRedactReason": "(Valgfritt) Årsak til redigering av denne meldingen...", @@ -2591,10 +2306,6 @@ }, "dehydrate": "Eksporter økten og slett enheten", "dehydrateWarning": "Denne handlingen kan ikke angres. Sørg for at du lagrer sikkerhetskopifilen på en trygg måte.", - "dehydrateTor": "TOR-brukere: Eksporter økt", - "dehydrateTorLong": "For TOR-brukere anbefales det å eksportere økten før vinduet lukkes.", - "hydrateTor": "TOR-brukere: Importer eksportert økt", - "hydrateTorLong": "Eksporterte du økten din sist gang på TOR? Importer den raskt og fortsett å chatte.", "noEncryptionForPublicRooms": "Du kan bare aktivere kryptering på rom som ikke er offentlig tilgjengelig.", "@noEncryptionForPublicRooms": { "type": "String", @@ -2617,11 +2328,8 @@ "otherNotificationSettings": "Andre varslingsinnstillinger", "contentNotificationSettings": "Innstillinger for innholdsvarslinger", "generalNotificationSettings": "Generelle varslingsinnstillinger", - "appIntroduction": "Med FluffyChat kan du chatte med vennene dine på tvers av forskjellige meldingstjenester. Finn ut mer på https://matrix.org eller trykk bare på *Fortsett*.", "notificationRuleContainsUserNameDescription": "Varsler bruker når en melding inneholder ens brukernavn.", - "hideMemberChangesInPublicChats": "Skjul medlemsendringer i offentlige chatter", "removeFromSpace": "Fjern fra området", - "addToSpaceDescription": "Velg områder hvor denne chatten legges til.", "pleaseEnterRecoveryKeyDescription": "For å låse opp gamle meldinger, vennligst skriv inn gjenopprettingsnøkkelen som ble generert i en tidligere økt. Gjenopprettingsnøkkelen er IKKE passordet ditt.", "reactedWith": "{sender} reagerte med {reaction}", "@reactedWith": { @@ -2645,7 +2353,6 @@ "notificationRuleTombstoneDescription": "Varsler brukeren om meldinger om deaktivering av rom.", "notificationRuleReactionDescription": "Demper varsler for reaksjoner.", "notificationRuleSuppressEdits": "Demp redigeringer", - "chatHasBeenAddedToThisSpace": "Chatten er lagt til i dette området", "clearArchive": "Tøm arkivet", "commandHint_markasgroup": "Merk som gruppe", "commandHint_ban": "Utesteng den gitte brukeren fra dette rommet", @@ -2658,7 +2365,6 @@ "type": "String", "description": "Usage hint for the command /clearcache" }, - "homeserverDescription": "Alle dataene dine lagres på hjemmeserveren, akkurat som hos en e-postleverandør. Du kan velge hvilken hjemmeserver du vil bruke, samtidig som du fortsatt kan kommunisere med alle. Lær mer på https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "Ser ikke ut til å være en kompatibel hjemmeserver. Feil URL?", "prepareSendingAttachment": "Forbered sending av vedlegg...", "generatingVideoThumbnail": "Genererer videominiatyrbilde ...", @@ -2669,7 +2375,6 @@ "notificationRuleContainsDisplayNameDescription": "Varsler brukeren når en melding inneholder ens visningsnavnet.", "notificationRuleIsUserMention": "Brukeromtale", "notificationRuleIsRoomMention": "Romomtale", - "whatIsAHomeserver": "Hva er en hjemmeserver?", "commandHint_me": "Beskriv deg selv", "@commandHint_me": { "type": "String", @@ -2751,26 +2456,7 @@ "type": "String", "placeholders": {} }, - "switchToAccount": "Bytt til konto {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "widgetEtherpad": "Tekstnotat", "noOneCanJoin": "Ingen kan bli med", - "userWouldLikeToChangeTheChat": "{user} vil gjerne bli med i chatten.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Ingen offentlig lenke er opprettet ennå", "commandHint_html": "Send HTML-formatert tekst", "@commandHint_html": { "type": "String", @@ -2835,15 +2521,6 @@ }, "newSpace": "Nytt område", "allSpaces": "Alle områder", - "numChats": "{number} chats", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "wasDirectChatDisplayName": "Tom chat (var {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2853,7 +2530,6 @@ } } }, - "moveDown": "Flytt ned", "removeFromSpaceDescription": "Chatten blir fjernet fra området, men vises fortsatt i chatlisten din.", "countChats": "{chats} chats", "@countChats": { @@ -2870,7 +2546,6 @@ "kickUserDescription": "Brukeren blir kastet ut av chatten, men ikke utestengt. I offentlige chatter kan brukeren bli med på nytt når som helst.", "sendTypingNotifications": "Send varsler ved skriving", "swipeRightToLeftToReply": "Sveip fra høyre mot venstre for å svare", - "startFirstChat": "Start din første chat", "unlockOldMessages": "Lås opp gamle meldinger", "storeInAndroidKeystore": "Lagre i Android KeyStore", "storeInAppleKeyChain": "Lagre i Apple nøkkelring", @@ -2892,12 +2567,8 @@ "notificationRuleJitsiDescription": "Varsler brukeren om hendelser i Jitsi-widgeten.", "customReaction": "Egendefinert reaksjon", "pause": "Pause", - "moveToDifferentSpace": "Flytt til et annet område", - "moveUp": "Flytt opp", "storeInSecureStorageDescription": "Oppbevar gjenopprettingsnøkkelen på en sikker lagringsplass på denne enheten.", "foregroundServiceRunning": "Denne varslingen vises når forgrunnstjenesten kjører.", - "callingAccount": "Ringekonto", - "appearOnTopDetails": "Lar appen vises øverst (ikke nødvendig hvis du allerede har Fluffychat konfigurert som en ringekonto)", "longPressToRecordVoiceMessage": "Langt trykk for å spille inn talemelding.", "startedAPoll": "{username} startet en avstemning.", "@startedAPoll": { @@ -2912,7 +2583,6 @@ "startPoll": "Start avstemning", "endPoll": "Avslutt avstemning", "answersVisible": "Svar synlige", - "answersHidden": "Svar skjult", "addAnswerOption": "Legg til svaralternativ", "answerOption": "Svaralternativ", "allowMultipleAnswers": "Tillat flere svar", @@ -2953,30 +2623,11 @@ } } }, - "countChatsAndCountParticipants": "{chats} chatter og {participants} deltakere", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noChatsFoundHere": "Ingen chatter her. Bruk knappen under for å starte en ny samtale. ⤵️", - "joinedChats": "Mine chatter", "changedTheChatDescription": "{username} endret beskrivelsen av chatten", "changedTheChatName": "{username} endret navnet på chatten", "commandHint_markasdm": "Marker som rom for direktemeldinger for den angitte Matrix-IDen", - "indexedDbErrorTitle": "Problemer med privat modus", "recoveryKeyLost": "Mistet gjenopprettingsnøkkel?", - "separateChatTypes": "Skille direktemeldinger og grupper", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Angi som hovedalias", "@setAsCanonicalAlias": { "type": "String", @@ -2996,9 +2647,6 @@ "stickerPackNameAlreadyExists": "Klistremerkepakken finnes allerede", "newStickerPack": "Ny klistremerkepakke", "stickerPackName": "Navn på klistremerkepakke", - "signInWithLabel": "Logg inn med:", - "enterSpace": "Bli med i området", - "enterRoom": "Bli med i rommet", "addToBundle": "Legg til i pakke", "removeFromBundle": "Fjern fra denne pakken", "bundleName": "Navn på pakke", @@ -3014,22 +2662,9 @@ "type": "String", "placeholders": {} }, - "errorAddingWidget": "Kunne ikke legge til widget.", "makeAdminDescription": "Når du gjør denne brukeren til administrator, kan du kanskje ikke omgjøre det senere. Brukeren vil da få de samme rettighetene som deg.", "joinSpace": "Bli med i området", "publicSpaces": "Offentlige områder", - "databaseBuildErrorBody": "Kunne ikke bygge SQLite-databasen. Appen prøver å bruke den gamle databasen enn så lenge. Vennligst rapporter denne feilen til utviklerne på {url}. Feilmeldingen er: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "verifyOtherUserDescription": "Hvis du verifiserer en annen bruker, kan du være trygg på at du vet hvem du faktisk skriver med. 💪\n\nNår du starter en verifisering, vil både du og den andre brukeren se et popup-vindu i appen. Der vil dere se en serie emojier eller tall som dere må sammenligne med hverandre.\n\nDen beste måten å gjøre dette på er å møtes ansikt til ansikt eller starte en videosamtale. 👭", "verifyOtherDeviceDescription": "Når du verifiserer en annen enhet, kan disse enhetene utveksle nøkler, noe som øker den generelle sikkerheten din. 💪 Når du starter en verifisering, vil det dukke opp et popup-vindu i appen på begge enhetene. Der vil du se en serie emojier eller tall som du må sammenligne med hverandre. Det er best å ha begge enhetene forhånden før du starter verifiseringen. 🤳", "clientWellKnownInformation": "Velkjent informasjon om klienten:", @@ -3132,7 +2767,6 @@ } }, "confirmEventUnpin": "Er du sikker på at du vil løsne hendelsen permanent?", - "indexedDbErrorLong": "Lagring av meldinger er dessverre ikke aktivert i privat modus som standard.\nVennligst gå til:\n - about:config\n - Sett dom.indexedDB.privateBrowsing.enabled til true\nEllers er det ikke mulig å kjøre FluffyChat.", "saveKeyManuallyDescription": "Lagre denne nøkkelen manuelt ved å åpne systemets delingsmeny eller kopiere til utklippstavlen.", "newSpaceDescription": "Områder lar deg samle chattene dine og bygge private eller offentlige fellesskap.", "chatPermissionsDescription": "Definer hvilket tilgangsnivå som kreves for bestemte handlinger i denne chatten. Nivåene 0, 50 og 100 representerer vanligvis brukere, moderatorer og administratorer, men alle mellomtrinn er mulige.", @@ -3144,8 +2778,6 @@ "noKeyForThisMessage": "Dette kan skje hvis meldingen ble sendt før du logget inn på kontoen din på denne enheten.\n\nDet er også mulig at senderen har blokkert enheten din, eller at noe gikk galt med internettforbindelsen.\n\nEr du i stand til å lese meldingen i en annen sesjon? Da kan du overføre meldingen fra den! Gå til Innstillinger > Enheter og sørg for at enhetene dine har verifisert hverandre. Neste gang du åpner rommet og begge sesjonene er i forgrunnen, vil nøklene bli overført automatisk.\n\nVil du unngå å miste nøklene når du logger ut eller bytter enhet? Sørg for at du har aktivert sikkerhetskopiering av chat i innstillingene.", "report": "rapportere", "addChatOrSubSpace": "Legg til chat eller underområde", - "subspace": "Underområde", - "newSubSpace": "Nytt underområde", "signIn": "Logg på", "createNewAccount": "Opprett ny konto", "signUpGreeting": "FluffyChat er desentralisert! Velg en server der du vil opprette kontoen din, så kjører vi på!", @@ -3163,4 +2795,4 @@ "powerLevel": "Styrkenivå", "setPowerLevelDescription": "Styrkenivåer definerer hva et medlem har lov til å gjøre i dette rommet, og varierer vanligvis mellom 0 og 100.", "owner": "Eier" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index bb31e4d8..10c39668 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -129,18 +129,6 @@ } } }, - "badServerVersionsException": "De homeserver ondersteunt de Spec-versies:\n{serverVersions}\nMaar deze app ondersteunt alleen {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Van chat verbannen", "@banFromChat": { "type": "String", @@ -173,11 +161,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Bot-berichten", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Annuleren", "@cancel": { "type": "String", @@ -391,7 +374,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Chat is toegevoegd aan deze space", "chats": "Chats", "@chats": { "type": "String", @@ -507,31 +489,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Bevestigen", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Verbinden", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Contact is voor de groep uitgenodigd", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Bevat naam", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Bevat inlognaam", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "De inhoud is gerapporteerd aan de serverbeheerders", "@contentHasBeenReported": { "type": "String", @@ -611,33 +573,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Hierdoor wordt je account gedeactiveerd. Dit kan niet ongedaan gemaakt worden! Weet je het zeker?", "@deactivateAccountWarning": { "type": "String", @@ -743,11 +678,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Je moet een emoticon korte code en afbeelding kiezen!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Lege chat", "@emptyChat": { "type": "String", @@ -797,11 +727,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Vul je homeserver in", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Locatie ophalen fout: {error}", "@errorObtainingLocation": { "type": "String", @@ -851,11 +776,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Ga naar de nieuwe chat", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Groep", "@group": { "type": "String", @@ -927,11 +847,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identiteit", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Negeer", "@ignore": { "type": "String", @@ -993,11 +908,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Persoonlijke uitnodiging", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} heeft je uitgenodigd voor FluffyChat.\n1. Bezoek https://fluffychat.im en installeer de app\n2. Registreer of log in\n3. Open deze uitnodigingslink:\n{link}", "@inviteText": { "type": "String", @@ -1077,11 +987,6 @@ "type": "String", "placeholders": {} }, - "license": "Licentie", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Licht", "@lightTheme": { "type": "String", @@ -1135,11 +1040,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Persoon wijzigingen", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Vermeld", "@mention": { "type": "String", @@ -1247,11 +1147,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Meldingen ingeschakeld voor dit account", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} personen typen…", "@numUsersTyping": { "type": "String", @@ -1351,11 +1246,6 @@ "type": "String", "placeholders": {} }, - "people": "Personen", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Kies een afbeelding", "@pickImage": { "type": "String", @@ -1375,11 +1265,6 @@ } } }, - "pleaseChoose": "Maak een keuze", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Kies een toegangscode", "@pleaseChooseAPasscode": { "type": "String", @@ -1473,11 +1358,6 @@ } } }, - "rejoin": "Opnieuw deelnemen", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Verwijder", "@remove": { "type": "String", @@ -1497,11 +1377,6 @@ } } }, - "removeDevice": "Verwijder apparaat", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Verbanning opheffen", "@unbanFromChat": { "type": "String", @@ -1557,15 +1432,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Gezien door {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Verstuur", "@send": { "type": "String", @@ -1600,16 +1466,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Origineel versturen", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Sticker versturen", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Video versturen", "@sendVideo": { "type": "String", @@ -1674,21 +1530,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Aangepaste emoticons instellen", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Uitnodigingslink instellen", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Rechten-niveau instellen", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Status instellen", "@setStatus": { "type": "String", @@ -1723,11 +1564,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Eenmalig Inloggen", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Overslaan", "@skip": { "type": "String", @@ -1798,21 +1634,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Favoriet in- of uitschakelen", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Dempen in- of uitschakelen", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Markeer gelezen/ongelezen", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Te veel verzoeken. Probeer het later nog eens!", "@tooManyRequestsWarning": { "type": "String", @@ -1879,15 +1700,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 ongelezen chat} other{{unreadCount} ongelezen chats}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} en {count} anderen zijn aan het typen …", "@userAndOthersAreTyping": { "type": "String", @@ -2012,11 +1824,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Achtergrond:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Waarschuwing!", "@warning": { "type": "String", @@ -2102,7 +1909,6 @@ "messageType": "Berichttype", "sender": "Afzender", "openGallery": "Galerij openen", - "addToSpaceDescription": "Selecteer een space om deze chat aan toe te voegen.", "removeFromSpace": "Uit de space verwijderen", "start": "Start", "commandHint_clearcache": "Cache wissen", @@ -2125,21 +1931,6 @@ "type": "String", "description": "Usage hint for the command /discardsession" }, - "openVideoCamera": "Videocamera openen", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "publish": "Publiceren", "dismiss": "Sluiten", "markAsRead": "Markeer als gelezen", "reportUser": "Persoon rapporteren", @@ -2165,32 +1956,6 @@ "voiceCall": "Spraakoproep", "confirmEventUnpin": "Weet je zeker dat je de gebeurtenis definitief wilt losmaken?", "experimentalVideoCalls": "Videogesprekken (experimenteel)", - "emailOrUsername": "Email of inlognaam", - "nextAccount": "Volgende account", - "switchToAccount": "Naar account {number} overschakelen", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "previousAccount": "Vorige account", - "widgetCustom": "Aangepast", - "widgetName": "Naam", - "widgetUrlError": "Dit is geen geldige link.", - "widgetNameError": "Geef een naam op.", - "errorAddingWidget": "Fout bij het toevoegen van de widget.", - "widgetJitsi": "Jitsi Meet", - "addWidget": "Widget toevoegen", - "widgetVideo": "Video", - "widgetEtherpad": "Tekstnotitie", - "separateChatTypes": "Directe chats en groepen los weergeven", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "youAcceptedTheInvitation": "👍 Je hebt de uitnodiging geaccepteerd", "youRejectedTheInvitation": "Je hebt de uitnodiging afgewezen", "youJoinedTheChat": "Je bent toegetreden tot de chat", @@ -2252,7 +2017,6 @@ }, "recoveryKey": "Herstelsleutel", "recoveryKeyLost": "Herstelsleutel verloren?", - "pleaseEnterRecoveryKey": "Voer jouw herstelsleutel in:", "users": "Personen", "unlockOldMessages": "Oude berichten ontgrendelen", "storeInAndroidKeystore": "In Android KeyStore opslaan", @@ -2263,13 +2027,7 @@ "storeSecurlyOnThisDevice": "Veilig opslaan op dit apparaat", "dehydrate": "Sessie exporteren en apparaat wissen", "dehydrateWarning": "Deze actie kan niet ongedaan worden gemaakt. Zorg ervoor dat je het back-upbestand veilig opslaat.", - "dehydrateTor": "TOR-sessies: Exporteer sessie", - "dehydrateTorLong": "Voor TOR-sessies is het aanbevolen de sessie te exporteren alvorens het venster te sluiten.", - "hydrateTor": "TOR-sessie: Importeren sessie export", - "hydrateTorLong": "Heb je de vorige keer jouw sessie geëxporteerd met TOR? Importeer het dan snel en ga verder met chatten.", "hydrate": "Herstellen vanuit back-upbestand", - "indexedDbErrorTitle": "Problemen met privémodus", - "indexedDbErrorLong": "Het opslaan van berichten is helaas niet standaard ingeschakeld in de privémodus.\nBezoek alsjeblieft\n - about:config\n - stel dom.indexedDB.privateBrowsing.enabled in op true\nAnders is het niet mogelijk om FluffyChat op te starten.", "countFiles": "{count} bestanden", "@countFiles": { "placeholders": { @@ -2294,30 +2052,12 @@ "commandHint_markasgroup": "Markeer als groep", "whyIsThisMessageEncrypted": "Waarom is dit bericht onleesbaar?", "noKeyForThisMessage": "Dit kan gebeuren als het bericht is verzonden voordat je bij je account op dit apparaat hebt aangemeld.\n\nHet is ook mogelijk dat de afzender je apparaat heeft geblokkeerd of dat er iets mis is gegaan met de internetverbinding.\n\nKan je het bericht wel lezen in een andere sessie? Dan kan je het bericht daarvandaan overzetten! Ga naar Instellingen > Apparaten en zorg ervoor dat je apparaten elkaar hebben geverifieerd. Wanneer je de chat de volgende keer opent en beide sessies op de voorgrond staan, zullen de sleutels automatisch worden verzonden.\n\nWil je de sleutels niet verliezen als je uitlogt of van apparaat wisselt? Zorg er dan voor dat je de chatback-up hebt aangezet in de instellingen.", - "enterSpace": "Space betreden", "allSpaces": "Alle spaces", "foregroundServiceRunning": "Deze melding verschijnt wanneer de voorgronddienst draait.", "screenSharingTitle": "scherm delen", "screenSharingDetail": "Je deelt je scherm in FuffyChat", - "callingPermissions": "Telefoon-rechten", - "callingAccount": "Telefoon-account", - "callingAccountDetails": "Hiermee kan FluffyChat de Android telefoon-app gebruiken.", - "appearOnTop": "Bovenaan verschijnen", - "appearOnTopDetails": "Laat de app bovenaan verschijnen (niet nodig als je FluffyChat al hebt ingesteld als een bel-account)", - "otherCallingPermissions": "Microfoon, camera en andere FluffyChat-rechten", "newGroup": "Nieuwe groep", "newSpace": "Space aanmaken", - "enterRoom": "Chat betreden", - "numChats": "{number} chats", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Onbelangrijke statusgebeurtenissen verbergen", "doNotShowAgain": "Niet meer tonen", "googlyEyesContent": "{senderName} stuurt je wiebelogen", "@googlyEyesContent": { @@ -2363,7 +2103,6 @@ "reopenChat": "Chat heropenen", "encryptThisChat": "Versleutel deze chat", "deviceKeys": "Apparaatsleutels:", - "startFirstChat": "Begin je eerste chat", "newSpaceDescription": "Met spaces kun je je chats samenvoegen en privé- of publieke community's bouwen.", "noOtherDevicesFound": "Geen andere apparaten gevonden", "noBackupWarning": "Waarschuwing! Zonder de chatback-up in te schakelen, verlies je de toegang tot je versleutelde berichten. Het is sterk aanbevolen om eerst de chatback-up in te schakelen voordat je uitlogt.", @@ -2381,20 +2120,6 @@ "readUpToHere": "Lees tot hier", "jump": "Spring", "openLinkInBrowser": "Link in browser openen", - "allRooms": "Alle groepschats", - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "signInWith": "Aanmelden met {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "notAnImage": "Geen afbeeldingsbestand.", "importNow": "Nu importeren", "importEmojis": "Emoji's importeren", @@ -2404,8 +2129,6 @@ "report": "Rapporteer", "reportErrorDescription": "😭 Oh nee. Er is iets misgegaan. Probeer het later nog eens. Als je wilt, kun je de bug rapporteren aan de ontwikkelaars.", "sendTypingNotifications": "Typemeldingen verzenden", - "pleaseTryAgainLaterOrChooseDifferentServer": "Probeer het later nog eens of kies een andere server.", - "signInWithPassword": "Aanmelden met wachtwoord", "chatPermissions": "Chatrechten", "chatDescription": "Onderwerp", "chatDescriptionHasBeenChanged": "Onderwerp gewijzigd", @@ -2424,11 +2147,8 @@ } } }, - "profileNotFound": "De persoon kan niet gevonden worden op de server. Misschien is er een verbindingsprobleem of de persoon bestaat niet.", "createGroup": "Groep aanmaken", - "inviteContactToGroupQuestion": "Wil je {contact} uitnodigingen voor de chat \"{groupName}\"?", "optionalRedactReason": "(Optioneel) Reden voor aanpassing van dit bericht...", - "addChatDescription": "Voeg een onderwerp toe...", "invalidServerName": "Foute servernaam", "messagesStyle": "Berichten:", "shareInviteLink": "Uitnodigingslink delen", @@ -2443,11 +2163,9 @@ }, "directChat": "Directe chat", "setChatDescription": "Onderwerp instellen", - "setTheme": "Thema instellen:", "setColorTheme": "Kleurthema instellen:", "invite": "Uitnodigen", "inviteGroupChat": "📨 Groeps-chat uitnodiging", - "invitePrivateChat": "📨 Privé-chat uitnodiging", "emoteKeyboardNoRecents": "Recent gebruikte emoticons zullen hier verschijnen...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2488,11 +2206,6 @@ "joinSpace": "Toetreden tot de space", "block": "Blokkeren", "blockedUsers": "Geblokkeerde personen", - "presenceStyle": "Aanwezigheid:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "searchChatsRooms": "Zoek #chats, @personen...", "swipeRightToLeftToReply": "Veeg van rechts naar links om te reageren", "calls": "Gesprekken", @@ -2503,14 +2216,6 @@ "hideRedactedMessagesBody": "Als iemand een bericht verwijdert is dit bericht niet meer zichtbaar in de chat.", "hideInvalidOrUnknownMessageFormats": "Ongeldige of onbekende berichtformaten verbergen", "passwordRecoverySettings": "Wachtwoordherstel-instellingen", - "youInvitedToBy": "📩 Je bent uitgenodigd via een link voor:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "knock": "Klop", "overview": "Overzicht", "hidePresences": "Verberg statuslijst?", @@ -2531,42 +2236,16 @@ "blockUsername": "Negeer inlognaam", "publicChatAddresses": "Publieke chat adressen", "createNewAddress": "Creëer nieuw adres", - "countChatsAndCountParticipants": "{chats} chats en {participants} deelnemers", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Geen chats gevonden...", - "joinedChats": "Chats waaraan je deelneemt", "knocking": "Kloppen", "space": "Space", "spaces": "Spaces", "unread": "Ongelezen", - "databaseBuildErrorBody": "Het aanmaken van de SQlite database is mislukt. De app probeert nu een traditionele database te gebruiken. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze {url}. De foutmelding is: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "groupName": "Groepsnaam", "changeGeneralChatSettings": "Algemene chat instellingen wijzigen", "restricted": "Beperkt", "searchForUsers": "Zoek @personen...", "searchMore": "Zoek meer...", - "noPublicLinkHasBeenCreatedYet": "Publieke link is nog niet gecreëerd", "groupCanBeFoundViaSearch": "Groep kan gevonden worden via zoeken", "searchIn": "Zoek in chat \"{chat}\"...", "@searchIn": { @@ -2651,7 +2330,6 @@ "compress": "Comprimeren", "previous": "Vorige", "otherPartyNotLoggedIn": "De andere partij is momenteel niet ingelogd en kan daarom geen berichten ontvangen!", - "notifyMeFor": "Waarschuw mij voor", "blockListDescription": "Je kunt personen blokkeren die je lastig vallen. Je kan dan geen berichten meer ontvangen of chat uitnodigingen krijgen van de personen op je blokkeerlijst.", "sendImages": "Stuur {count} afbeelding(en)", "@sendImages": { @@ -2668,9 +2346,6 @@ "placeholders": {} }, "website": "Website", - "hideMemberChangesInPublicChats": "Verberg persoon veranderingen in publieke chats", - "hideMemberChangesInPublicChatsBody": "Verberg in de tijdlijn van de chat als iemand zich aanmeldt bij een publieke chat of deze verlaat om de leesbaarheid te verbeteren.", - "startConversation": "Start gesprek", "usersMustKnock": "Personen moeten kloppen", "noUsersFoundWithQuery": "Helaas kan er geen persoon gevonden worden met \"{query}\". Controleer of je een typfout hebt gemaakt.", "@noUsersFoundWithQuery": { @@ -2682,14 +2357,6 @@ } }, "createGroupAndInviteUsers": "Maak groep en nodig personen uit", - "userWouldLikeToChangeTheChat": "{user} wil graag deelnemen aan de chat.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "chatCanBeDiscoveredViaSearchOnServer": "Chat kan worden gevonden via een zoekopdracht op {server}", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2715,14 +2382,11 @@ "passwordIsWrong": "Je ingevoerde wachtwoord is fout", "newPassword": "Nieuw wachtwoord", "pleaseChooseAStrongPassword": "Kies a.j.b. een sterk wachtwoord", - "publicLink": "Publieke link", "select": "Selecteer", "leaveEmptyToClearStatus": "Laat leeg om je status te resetten.", "addChatOrSubSpace": "Voeg chat of subspace toe", - "subspace": "Subspace", "pleaseEnterYourCurrentPassword": "Vul je huidige wachtwoord in", "passwordsDoNotMatch": "Wachtwoorden komen niet overeen", - "decline": "Weiger", "thisDevice": "Dit apparaat:", "contentNotificationSettings": "Contentmelding instellingen", "roomNotificationSettings": "Kamermelding instellingen", @@ -2761,7 +2425,6 @@ "opacity": "Doorzichtigheid:", "verifyOtherUserDescription": "Als je een persoon verifieert ben je er zeker van dat je echt met haar contact hebt. 💪\n\nWanneer je een verificatie start ziet de persoon een popup in de app. Hier staat een serie van emoji's of getallen die je met elkaar moet vergelijken.\n\nDe beste manier om dit te doen is in persoon of met een videogesprek. 👭", "changeTheVisibilityOfChatHistory": "Zichtbaarheid van de chat-geschiedenis wijzigen", - "whatIsAHomeserver": "Wat is een server?", "sendRoomNotifications": "@room-meldingen versturen", "noticeChatBackupDeviceVerification": "Opmerking: Als al je apparaten zijn verbonden met de chat back-up worden ze automatisch geverifieerd.", "notificationRuleMemberEvent": "Chat-gebeurtenis uitschakelen", @@ -2833,7 +2496,6 @@ } } }, - "discoverHomeservers": "Ontdek servers", "changelog": "Wijzigingengeschiedenis", "loginWithMatrixId": "Inloggen met Matrix-ID", "calculatingFileSize": "Bestandsgrootte berekenen...", @@ -2856,15 +2518,6 @@ "name": "Naam", "verifyOtherDeviceDescription": "Een geverifieerd ander apparaat zorgt ervoor dat de apparaten sleutels uitwisselen, wat je beveiliging versterkt. 💪 Als je de verificatie start verschijnt er een popup op beide apparaten. Hier staat een reeks emoji's of getallen die je met elkaar moet vergelijken. Het is handig om beide apparaten bij de hand te hebben voordat je de verificatie start. 🤳", "commandHint_unignore": "Herstel de negeerde Matrix-ID", - "forwardMessageTo": "Bericht doorsturen naar {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "restoreSessionBody": "De app probeert nu je sessie te herstellen van een back-up. Meldt alsjeblieft deze fout aan de ontwikkelaars via deze link {url}. De foutmelding is: {error}", "@restoreSessionBody": { "type": "String", @@ -2881,16 +2534,6 @@ "formattedMessages": "Opgemaakte berichten", "chatPermissionsDescription": "Stel het gewenste rechten-niveau in voor bepaalde acties in deze chat. Het rechten-niveau 0, 50 en 100 zijn gebruikelijk voor deelnemer, moderator en beheerder, maar elke verdeling is mogelijk.", "changeTheDescriptionOfTheGroup": "Onderwerp wijzigen", - "userRole": "Rol", - "minimumPowerLevel": "{level} is het minimale rechten-niveau.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "sendReadReceiptsDescription": "Andere deelnemers van de chat kunnen zien of je een bericht hebt gelezen.", "formattedMessagesDescription": "Geef rijke berichtinhoud weer zoals vetgedrukte tekst met markdown.", "verifyOtherUser": "🔐 Persoon verifiëren", @@ -2921,7 +2564,6 @@ }, "appWantsToUseForLoginDescription": "Hierbij sta je toe dat de app en website informatie over je delen.", "open": "Open", - "appIntroduction": "FluffyChat laat je chatten met je vrienden tussen verschillende chat-netwerken. Lees meer op https://matrix.org of tik *Continue*.", "completedKeyVerification": "{sender} ronde de sleutelverificatie af", "@completedKeyVerification": { "type": "String", @@ -2931,7 +2573,6 @@ } } }, - "homeserverDescription": "Al je data is opgeslagen op de server, net als bij een email-leverancier. Je kan kiezen welke server je gebruikt en toch communiceren met iedereen. Lees meer op https://matrix.org.", "notificationRuleContainsDisplayName": "Bevat de naam", "notificationRuleIsUserMentionDescription": "Stuur een melding als je direct genoemd wordt in een bericht.", "notificationRuleContainsDisplayNameDescription": "Stuur een melding als je genoemd wordt in een bericht.", @@ -2984,10 +2625,7 @@ "optionalMessage": "(Optioneel) bericht...", "notSupportedOnThisDevice": "Niet ondersteund op dit apparaat", "commandHint_roomupgrade": "Upgradeer deze chat naar de aangegeven kamerversie", - "setCustomPermissionLevel": "Aangepast rechten-niveau instellen", - "setPermissionsLevelDescription": "Kies hieronder een standaard rol of voer een aangepast rechten-niveau in tussen 0 en 100.", "ignoreUser": "Persoon negeren", - "normalUser": "Normaal persoon", "pleaseWaitUntilInvited": "Wacht even alsjeblieft tot iemand van de chat je uitnodigt.", "approve": "Goedkeuren", "youHaveKnocked": "Je hebt geklopt", @@ -3024,10 +2662,6 @@ "pause": "Pauzeer", "resume": "Hervat", "donate": "Doneer", - "newSubSpace": "Nieuwe sub-space", - "moveToDifferentSpace": "Naar andere space verplaatsen", - "moveUp": "Omhoog verplaatsen", - "moveDown": "Omlaag verplaatsen", "removeFromSpaceDescription": "De chat zal worden verwijderd uit de space, maar blijft in je chats.", "countChats": "{chats} chats", "@countChats": { @@ -3069,7 +2703,6 @@ "startPoll": "Peiling starten", "endPoll": "Peiling beëindigen", "answersVisible": "Zichtbaar invullen", - "answersHidden": "Antwoorden verborgen", "pollQuestion": "Peiling vraag", "answerOption": "Antwoord optie", "addAnswerOption": "Antwoord optie toevoegen", @@ -3137,7 +2770,6 @@ "logs": "Logs", "advancedConfigs": "Geavanceerde configuratie", "advancedConfigurations": "Geavanceerde configuraties", - "signInWithLabel": "Log in met:", "signIn": "Log in", "createNewAccount": "Registreer nieuw account", "signUpGreeting": "FluffyChat is decentraal! Kies een server waar je wil voor jouw account en laten we gaan!", @@ -3155,4 +2787,4 @@ "powerLevel": "Rechtenniveau", "setPowerLevelDescription": "Rechtenniveau's definiëren wat een persoon mag doen in deze chat en variëren meestal tussen 0 en 100.", "owner": "Eigenaar" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index 16754022..d1d432d8 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -109,18 +109,6 @@ } } }, - "badServerVersionsException": "Serwer obsługuje wersje Spec:\n{serverVersions}\nAle aplikacja obsługuje tylko {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Ban w czacie", "@banFromChat": { "type": "String", @@ -153,11 +141,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Wiadomości botów", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Anuluj", "@cancel": { "type": "String", @@ -468,31 +451,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Potwierdź", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Połącz", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt został zaproszony do grupy", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Zawiera nazwę wyświetlaną", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Zawiera nazwę użytkownika", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "copiedToClipboard": "Skopiowano do schowka", "@copiedToClipboard": { "type": "String", @@ -562,33 +525,6 @@ } } }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}.{month}.{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "To zdezaktywuje twoje konto. To jest nieodwracalne! Na pewno chcesz to zrobić?", "@deactivateAccountWarning": { "type": "String", @@ -679,11 +615,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Musisz wybrać kod emotikonu oraz obraz!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Pusty czat", "@emptyChat": { "type": "String", @@ -728,11 +659,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Wpisz swój serwer domowy", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "Wszystko gotowe!", "@everythingReady": { "type": "String", @@ -763,11 +689,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Przejdź do nowego pokoju", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grupa", "@group": { "type": "String", @@ -829,11 +750,6 @@ "type": "String", "placeholders": {} }, - "identity": "Tożsamość", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignoredUsers": "Ignorowani użytkownicy", "@ignoredUsers": { "type": "String", @@ -885,11 +801,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Zaproszenie dla mnie", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} zaprosił/-a Cię do FluffyChat.\n1. Odwiedź fluffychat.im i zainstaluj aplikację\n2. Zarejestuj się lub zaloguj\n3. Otwórz link zaproszenia:\n{link}", "@inviteText": { "type": "String", @@ -969,11 +880,6 @@ "type": "String", "placeholders": {} }, - "license": "Licencja", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Jasny", "@lightTheme": { "type": "String", @@ -1017,11 +923,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Zmiany członków", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Wzmianka", "@mention": { "type": "String", @@ -1102,11 +1003,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Powiadomienia są włączone dla tego konta", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "oopsSomethingWentWrong": "Ojej! Coś poszło nie tak…", "@oopsSomethingWentWrong": { "type": "String", @@ -1132,11 +1028,6 @@ "type": "String", "placeholders": {} }, - "people": "Osoby", - "@people": { - "type": "String", - "placeholders": {} - }, "pin": "Przypnij", "@pin": { "type": "String", @@ -1204,11 +1095,6 @@ } } }, - "rejoin": "Dołącz ponownie", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Usuń", "@remove": { "type": "String", @@ -1228,11 +1114,6 @@ } } }, - "removeDevice": "Usuń urządzenie", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Odbanuj w czacie", "@unbanFromChat": { "type": "String", @@ -1253,15 +1134,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Zobaczone przez {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Wyślij", "@send": { "type": "String", @@ -1332,11 +1204,6 @@ "type": "String", "placeholders": {} }, - "setInvitationLink": "Ustaw link z zaproszeniem", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "setStatus": "Ustaw status", "@setStatus": { "type": "String", @@ -1443,15 +1310,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} oraz {count} pozostałych pisze…", "@userAndOthersAreTyping": { "type": "String", @@ -1546,11 +1404,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Tapeta:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "whoIsAllowedToJoinThisGroup": "Kto może dołączyć do tej grupy", "@whoIsAllowedToJoinThisGroup": { "type": "String", @@ -1620,11 +1473,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Proszę wybrać", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseClickOnLink": "Proszę kliknij w odnośnik wysłany w wiadomości e-mail, aby kontynuować.", "@pleaseClickOnLink": { "type": "String", @@ -1679,16 +1527,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Wyślij oryginał", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Wyślij naklejkę", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Wyślij film", "@sendVideo": { "type": "String", @@ -1789,15 +1627,8 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Przełącz ulubione", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "yourChatBackupHasBeenSetUp": "Kopia zapasowa Twojego czatu została ustawiona.", "@yourChatBackupHasBeenSetUp": {}, - "chatHasBeenAddedToThisSpace": "Czat został dodany do tej przestrzeni", - "@chatHasBeenAddedToThisSpace": {}, "contentHasBeenReported": "Treść została zgłoszona administratorom serwera", "@contentHasBeenReported": { "type": "String", @@ -1823,11 +1654,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "Nagraj film", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "messages": "Wiadomości", "@messages": { "type": "String", @@ -1853,11 +1679,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Ustaw niestandardowe emotikony", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "withTheseAddressesRecoveryDescription": "Dzięki tym adresom możesz odzyskać swoje hasło.", "@withTheseAddressesRecoveryDescription": { "type": "String", @@ -1873,11 +1694,6 @@ "type": "String", "placeholders": {} }, - "setPermissionsLevel": "Ustaw poziom uprawnień", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "skip": "Pomiń", "@skip": { "type": "String", @@ -1888,23 +1704,11 @@ "type": "String", "placeholders": {} }, - "toggleMuted": "Przełącz wyciszone", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Oznacz przeczytane/nieprzeczytane", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "unavailable": "Niedostępne", "@unavailable": { "type": "String", "placeholders": {} }, - "publish": "Opublikuj", - "@publish": {}, "scanQrCode": "Skanuj kod QR", "@scanQrCode": {}, "createNewSpace": "Nowa przestrzeń", @@ -2000,11 +1804,6 @@ "@time": {}, "messageType": "Rodzaj wiadomości", "@messageType": {}, - "separateChatTypes": "Oddzielenie czatów bezpośrednich i grupowych", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "waitingPartnerAcceptRequest": "Oczekiwanie na zaakceptowanie prośby przez drugą osobę…", "@waitingPartnerAcceptRequest": { "type": "String", @@ -2069,13 +1868,6 @@ } } }, - "singlesignon": "Pojedyncze logowanie", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "startFirstChat": "Rozpocznij swój pierwszy czat", - "@startFirstChat": {}, "verifyStart": "Rozpocznij weryfikację", "@verifyStart": { "type": "String", @@ -2104,19 +1896,6 @@ "@start": {}, "pleaseEnterRecoveryKeyDescription": "Aby odblokować wcześniejsze wiadomości, wprowadź swój klucz odzyskiwania, który został wygenerowany w poprzedniej sesji. Twój klucz odzyskiwania NIE jest Twoim hasłem.", "@pleaseEnterRecoveryKeyDescription": {}, - "videoWithSize": "Film ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "hydrateTorLong": "Czy ostatnio eksportowałeś/-aś swoją sesję na TOR? Szybko ją zaimportuj i kontynuuj rozmowy.", - "@hydrateTorLong": {}, - "dehydrateTorLong": "W przypadku użytkowników sieci TOR zaleca się eksportowanie sesji przed zamknięciem okna.", - "@dehydrateTorLong": {}, "hydrate": "Przywracanie z pliku kopii zapasowej", "@hydrate": {}, "noMatrixServer": "{server1} nie jest serwerem Matriksa, czy chcesz zamiast niego użyć {server2}?", @@ -2131,8 +1910,6 @@ } } }, - "hydrateTor": "Użytkownicy TOR: Importuj eksport sesji", - "@hydrateTor": {}, "numUsersTyping": "{count} użytkowników pisze…", "@numUsersTyping": { "type": "String", @@ -2147,8 +1924,6 @@ "type": "String", "placeholders": {} }, - "pleaseEnterRecoveryKey": "Wprowadź swój klucz odzyskiwania:", - "@pleaseEnterRecoveryKey": {}, "submit": "Odeślij", "@submit": { "type": "String", @@ -2184,8 +1959,6 @@ }, "openChat": "Otwórz czat", "@openChat": {}, - "addToSpaceDescription": "Wybierz przestrzeń, do której ten czat ma być dodany.", - "@addToSpaceDescription": {}, "supposedMxid": "To powinno być {mxid}", "@supposedMxid": { "type": "String", @@ -2210,16 +1983,8 @@ "@dehydrate": {}, "dehydrateWarning": "Tego nie można cofnąć. Upewnij się, że plik kopii zapasowej jest bezpiecznie przechowywany.", "@dehydrateWarning": {}, - "dehydrateTor": "Użytkownicy TOR: Eksportuj sesję", - "@dehydrateTor": {}, "unsupportedAndroidVersion": "Nieobsługiwana wersja systemu Android", "@unsupportedAndroidVersion": {}, - "widgetCustom": "Własny", - "@widgetCustom": {}, - "widgetEtherpad": "Notatka", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "pinMessage": "Przypnij do pokoju", "@pinMessage": {}, "confirmEventUnpin": "Czy na pewno chcesz trwale odpiąć wydarzenie?", @@ -2256,26 +2021,16 @@ }, "noOtherDevicesFound": "Nie znaleziono innych urządzeń", "@noOtherDevicesFound": {}, - "widgetUrlError": "Niepoprawny URL.", - "@widgetUrlError": {}, - "widgetNameError": "Podaj nazwę wyświetlaną.", - "@widgetNameError": {}, "encryptThisChat": "Zaszyfruj ten czat", "@encryptThisChat": {}, "disableEncryptionWarning": "Ze względów bezpieczeństwa nie można wyłączyć szyfrowania w czacie, w którym zostało ono wcześniej włączone.", "@disableEncryptionWarning": {}, "deviceKeys": "Klucze urządzenia:", "@deviceKeys": {}, - "emailOrUsername": "Adres e-mail lub nazwa użytkownika", - "@emailOrUsername": {}, - "indexedDbErrorLong": "Przechowywanie wiadomości niestety nie jest domyślnie włączone w trybie prywatnym.\nOdwiedź\n - about:config\n - ustaw dom.indexedDB.privateBrowsing.enabled na true\nW przeciwnym razie nie jest możliwe uruchomienie FluffyChat.", - "@indexedDbErrorLong": {}, "saveKeyManuallyDescription": "Zapisz ten klucz ręcznie, uruchamiając systemowe okno dialogowe udostępniania lub schowek.", "@saveKeyManuallyDescription": {}, "screenSharingTitle": "udostępnianie ekranu", "@screenSharingTitle": {}, - "appearOnTopDetails": "Umożliwia wyświetlanie aplikacji nad innymi (nie jest to konieczne, jeśli FluffyChat jest już ustawiony jako konto do dzwonienia)", - "@appearOnTopDetails": {}, "noKeyForThisMessage": "Może się to zdarzyć, jeśli wiadomość została wysłana przed zalogowaniem się na to konto na tym urządzeniu.\n\nMożliwe jest również, że nadawca zablokował Twoje urządzenie lub coś poszło nie tak z połączeniem internetowym.\n\nJesteś w stanie odczytać wiadomość na innej sesji? W takim razie możesz przenieść z niej wiadomość! Wejdź w Ustawienia > Urządzenia i upewnij się, że Twoje urządzenia zweryfikowały się wzajemnie. Gdy następnym razem otworzysz pokój i obie sesje będą włączone, klucze zostaną przekazane automatycznie.\n\nNie chcesz stracić kluczy podczas wylogowania lub przełączania urządzeń? Upewnij się, że w ustawieniach masz włączoną kopię zapasową czatu.", "@noKeyForThisMessage": {}, "sorryThatsNotPossible": "Przepraszamy... to nie jest możliwe", @@ -2284,8 +2039,6 @@ "@noBackupWarning": {}, "commandHint_googly": "Wyślij kręcące się oczka", "@commandHint_googly": {}, - "callingPermissions": "Uprawnienia połączeń", - "@callingPermissions": {}, "storeInAndroidKeystore": "Przechowaj w Android KeyStore", "@storeInAndroidKeystore": {}, "commandHint_cuddle": "Wyślij przytulenie", @@ -2343,29 +2096,6 @@ "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Eksperymentalne połączenia wideo", "@experimentalVideoCalls": {}, - "indexedDbErrorTitle": "Problemy związane z trybem prywatnym", - "@indexedDbErrorTitle": {}, - "switchToAccount": "Przełącz na konto {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Następne konto", - "@nextAccount": {}, - "previousAccount": "Poprzednie konto", - "@previousAccount": {}, - "addWidget": "Dodaj widżet", - "@addWidget": {}, - "widgetVideo": "Film", - "@widgetVideo": {}, - "widgetName": "Nazwa", - "@widgetName": {}, - "errorAddingWidget": "Błąd podczas dodawania widżetu.", - "@errorAddingWidget": {}, "youRejectedTheInvitation": "Odrzucono zaproszenie", "@youRejectedTheInvitation": {}, "youAcceptedTheInvitation": "👍 Zaakceptowałeś/-aś zaproszenie", @@ -2430,33 +2160,10 @@ "@foregroundServiceRunning": {}, "screenSharingDetail": "Udostępniasz swój ekran w FluffyChat", "@screenSharingDetail": {}, - "callingAccount": "Konto połączeń", - "@callingAccount": {}, - "callingAccountDetails": "Pozwala FluffyChat używać natywnej aplikacji do wykonywania połączeń w Androidzie.", - "@callingAccountDetails": {}, - "appearOnTop": "Wyświetlaj nad innymi", - "@appearOnTop": {}, - "otherCallingPermissions": "Mikrofon, kamera i inne uprawnienia FluffyChat", - "@otherCallingPermissions": {}, "whyIsThisMessageEncrypted": "Dlaczego nie można odczytać tej wiadomości?", "@whyIsThisMessageEncrypted": {}, - "enterSpace": "Wejdź do przestrzeni", - "@enterSpace": {}, - "enterRoom": "Wejdź do pokoju", - "@enterRoom": {}, "allSpaces": "Wszystkie przestrzenie", "@allSpaces": {}, - "numChats": "{number} czatów", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Ukryj nieistotne wydarzenia stanu", - "@hideUnimportantStateEvents": {}, "doNotShowAgain": "Nie pokazuj ponownie", "@doNotShowAgain": {}, "wasDirectChatDisplayName": "Pusty czat (wcześniej {oldDisplayName})", @@ -2497,11 +2204,6 @@ "@removeFromBundle": {}, "openLinkInBrowser": "Otwórz link w przeglądarce", "@openLinkInBrowser": {}, - "allRooms": "Wszystkie czaty grupowe", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "reportErrorDescription": "😭 O nie! Coś poszło nie tak. Spróbuj ponownie później. Jeśli chcesz, możesz zgłosić ten błąd autorom programu.", "@reportErrorDescription": {}, "setColorTheme": "Ustal styl kolorów:", @@ -2516,8 +2218,6 @@ "@invalidServerName": {}, "chatPermissions": "Uprawnienia w czacie", "@chatPermissions": {}, - "signInWithPassword": "Zaloguj się z hasłem", - "@signInWithPassword": {}, "setChatDescription": "Ustaw opis czatu", "@setChatDescription": {}, "importFromZipFile": "Zaimportuj z pliku .zip", @@ -2531,21 +2231,10 @@ } } }, - "signInWith": "Zaloguj się z {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "optionalRedactReason": "(Opcjonalnie) Powód usunięcia tej wiadomości...", "@optionalRedactReason": {}, "exportEmotePack": "Eksportuj pakiet emotikonów jako .zip", "@exportEmotePack": {}, - "inviteContactToGroupQuestion": "Czy chcesz zaprosić {contact} do czatu „{groupName}”?", - "@inviteContactToGroupQuestion": {}, "redactedByBecause": "Usunięte przez {username} z powodu „{reason}”", "@redactedByBecause": { "type": "String", @@ -2564,8 +2253,6 @@ "@invalidInput": {}, "report": "zgłoś", "@report": {}, - "addChatDescription": "Dodaj opis tego czatu...", - "@addChatDescription": {}, "directChat": "Czat bezpośredni", "@directChat": {}, "wrongPinEntered": "Wprowadzono nieprawidłowy kod PIN! Spróbuj ponownie za {seconds} sekund...", @@ -2581,8 +2268,6 @@ "@sendTypingNotifications": {}, "inviteGroupChat": "📨 Zaproszenie do rozmowy grupowej", "@inviteGroupChat": {}, - "invitePrivateChat": "📨 Zaproszenie do rozmowy prywatnej", - "@invitePrivateChat": {}, "importEmojis": "Zaimportuj emotikony", "@importEmojis": {}, "noChatDescriptionYet": "Nie utworzono jeszcze opisu czatu.", @@ -2591,8 +2276,6 @@ "@notAnImage": {}, "chatDescriptionHasBeenChanged": "Zmieniono opis czatu", "@chatDescriptionHasBeenChanged": {}, - "profileNotFound": "Nie można odnaleźć użytkownika na serwerze. Być może wystąpił problem z połączeniem lub użytkownik nie istnieje.", - "@profileNotFound": {}, "shareInviteLink": "Udostępnij link z zaproszeniem", "@shareInviteLink": {}, "emoteKeyboardNoRecents": "Tutaj pojawiają się ostatnio używane emotikony...", @@ -2600,12 +2283,8 @@ "type": "String", "placeholders": {} }, - "setTheme": "Ustaw wygląd:", - "@setTheme": {}, "replace": "Zastąp", "@replace": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Spróbuj ponownie później lub wybierz inny serwer.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "createGroup": "Utwórz grupę", "@createGroup": {}, "importNow": "Zaimportuj", @@ -2618,8 +2297,6 @@ "@blockedUsers": {}, "blockUsername": "Ignoruj użytkownika", "@blockUsername": {}, - "publicLink": "Link publiczny", - "@publicLink": {}, "transparent": "Przezroczystość", "@transparent": {}, "select": "Zaznacz", @@ -2632,8 +2309,6 @@ "@learnMore": {}, "groupName": "Nazwa grupy", "@groupName": {}, - "startConversation": "Rozpocznij rozmowę", - "@startConversation": {}, "newPassword": "Nowe hasło", "@newPassword": {}, "thisDevice": "To urządzenie:", @@ -2646,8 +2321,6 @@ "@discover": {}, "restricted": "Ograniczone", "@restricted": {}, - "decline": "Odmów", - "@decline": {}, "nothingFound": "Nic nie odnaleziono...", "@nothingFound": {}, "stickers": "Naklejki", @@ -2656,17 +2329,8 @@ "@noChatsFoundHere": {}, "hideRedactedMessagesBody": "Usunięte wiadomości nie będą widoczne w czacie.", "@hideRedactedMessagesBody": {}, - "hideMemberChangesInPublicChats": "Ukryj zmiany członkostwa w publicznych czatach", - "@hideMemberChangesInPublicChats": {}, "passwordRecoverySettings": "Ustawienia odzyskiwania hasła", "@passwordRecoverySettings": {}, - "hideMemberChangesInPublicChatsBody": "W celu poprawienia czytelności, nie pokazuj w historii publicznego czatu, czy ktoś do niego dołączył lub go opuścił.", - "@hideMemberChangesInPublicChatsBody": {}, - "presenceStyle": "Obecność:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "invitedBy": "Zaproszony/-a przez {user}", "@invitedBy": { "placeholders": { @@ -2713,8 +2377,6 @@ "@formattedMessages": {}, "banUserDescription": "Użytkownik zostanie zbanowany w czacie i nie będzie w stanie dołączyć do czatu do momentu odbanowania.", "@banUserDescription": {}, - "subspace": "Podprzestrzeń", - "@subspace": {}, "sendReadReceipts": "Wysyłaj powiadomienia o przeczytaniu wiadomości", "@sendReadReceipts": {}, "verifyOtherDevice": "🔐 Zweryfikuj inne urządzenie", @@ -2760,22 +2422,8 @@ } } }, - "noPublicLinkHasBeenCreatedYet": "Nie utworzono jeszcze żadnego publicznego linku", - "@noPublicLinkHasBeenCreatedYet": {}, "knock": "Zapukaj", "@knock": {}, - "databaseBuildErrorBody": "Nie udało się utworzyć bazy danych SQLite. Aplikacja na razie spróbuje korzystać ze starej bazy. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "restoreSessionBody": "Aplikacja spróbuje teraz odzyskać Twoją sesję z kopii zapasowej. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", "@restoreSessionBody": { "type": "String", @@ -2843,8 +2491,6 @@ "@changeTheDescriptionOfTheGroup": {}, "sendCanceled": "Anulowano wysyłanie", "@sendCanceled": {}, - "homeserverDescription": "Wszystkie Twoje dane trzymane są na serwerze domowym, jak u dostawców usług e-mail. Możesz wybrać swój serwer domowy i nadal rozmawiać ze wszystkimi. Dowiedz się więcej na https://matrix.org.", - "@homeserverDescription": {}, "doesNotSeemToBeAValidHomeserver": "Wydaje się nie być kompatybilnym serwerem domowym. Niepoprawny adres URL?", "@doesNotSeemToBeAValidHomeserver": {}, "calculatingFileSize": "Obliczanie rozmiaru pliku...", @@ -2948,8 +2594,6 @@ "@hideRedactedMessages": {}, "hideInvalidOrUnknownMessageFormats": "Ukryj niepoprawne lub nieznane typy wiadomości", "@hideInvalidOrUnknownMessageFormats": {}, - "notifyMeFor": "Powiadom mnie o", - "@notifyMeFor": {}, "pushNotificationsNotAvailable": "Powiadomienia push nie są dostępne", "@pushNotificationsNotAvailable": {}, "noUsersFoundWithQuery": "Niestety nie udało się nikogo znaleźć poprzez \"{query}\". Proszę sprawdzić, czy w zapytaniu nie ma literówek.", @@ -3023,21 +2667,10 @@ } } }, - "forwardMessageTo": "Przekazać wiadomość do {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "publicChatAddresses": "Adresy publicznych czatów", "@publicChatAddresses": {}, "createNewAddress": "Utwórz nowy adres", "@createNewAddress": {}, - "userRole": "Rola użytkownika/-czki", - "@userRole": {}, "completedKeyVerification": "{sender} zakończył/-a weryfikację kluczy", "@completedKeyVerification": { "type": "String", @@ -3055,10 +2688,6 @@ "@strikeThrough": {}, "incomingMessages": "Wiadomości przychodzące", "@incomingMessages": {}, - "discoverHomeservers": "Odkrywaj serwery domowe", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "Czym jest serwer domowy?", - "@whatIsAHomeserver": {}, "loginWithMatrixId": "Zaloguj się identyfikatorem Matrix", "@loginWithMatrixId": {}, "passwordsDoNotMatch": "Hasła się nie zgadzają", @@ -3067,14 +2696,6 @@ "@unbanUserDescription": {}, "roomUpgradeDescription": "Czat zostanie przeniesiony do pokoju w nowej wersji. Wszyscy użytkownicy zostaną powiadomieni o konieczności dołączenia do nowego czatu. Możesz dowiedzieć się więcej o wersjach pokojów na https://spec.matrix.org/latest/rooms/", "@roomUpgradeDescription": {}, - "userWouldLikeToChangeTheChat": "{user} chce dołączyć do czatu.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "requestedKeyVerification": "{sender} poprosił/-a o weryfikację kluczy", "@requestedKeyVerification": { "type": "String", @@ -3086,14 +2707,6 @@ }, "changeGeneralChatSettings": "Zmień ogólne ustawienia czatu", "@changeGeneralChatSettings": {}, - "youInvitedToBy": "Otrzymałeś/-aś link z zaproszeniem do:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "verifyOtherUserDescription": "Jeśli zweryfikujesz innego użytkownika, możesz być pewien/-na z kim naprawdę piszesz. 💪\n\nKiedy rozpoczniesz weryfikację, Ty i ta druga osoba zobaczycie okienko dialogowe. Zobaczycie w nim serię emotikonów lub numery do porównania.\n\nNajlepiej potwierdzić ich zgodność osobiście lub przez wideorozmowę. 👭", "@verifyOtherUserDescription": {}, "verifyOtherDeviceDescription": "Jeśli zweryfikujesz inne urządzenie, będzie mogło ono wymienić klucze z dotychczasowym, zwiększając ogólne bezpieczeństwo. 💪 Kiedy rozpoczniesz weryfikację, na obu urządzeniach wyświetli się okno dialogowe. Zobaczysz w nim serię emotikonów lub numery do porównania. Najlepiej mieć oba urządzenia pod ręką przed rozpoczęciem weryfikacji. 🤳", @@ -3118,22 +2731,8 @@ "@space": {}, "spaces": "Przestrzenie", "@spaces": {}, - "countChatsAndCountParticipants": "{participants}{chats} czatów i {participants} uczestników", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Nie znaleziono więcej czatów...", "@noMoreChatsFound": {}, - "joinedChats": "Czaty, do których dołączono", - "@joinedChats": {}, "removeDevicesDescription": "Nastąpi wylogowanie z tego urządzenia. Nie będziesz w stanie odbierać na nim wiadomości.", "@removeDevicesDescription": {}, "makeAdminDescription": "Kiedy użytkownik zostanie adminem, nie będziesz móc tego cofnąć, bo nabierze takich samych uprawnień, jak Ty.", @@ -3158,15 +2757,6 @@ "@addChatOrSubSpace": {}, "initAppError": "Wystąpił błąd podczas inicjalizacji aplikacji", "@initAppError": {}, - "minimumPowerLevel": "{level} jest minimalnym poziomem uprawnień.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchIn": "Szukaj w czacie \"{chat}\"...", "@searchIn": { "type": "String", @@ -3303,8 +2893,6 @@ }, "waitingForServer": "Oczekiwanie na serwer...", "@waitingForServer": {}, - "appIntroduction": "FluffyChat umożliwia czatowanie ze znajomymi za pośrednictwem różnych komunikatorów. Dowiedz się więcej na stronie https://matrix.org lub kliknij na *Kontynuuj*.", - "@appIntroduction": {}, "previous": "Poprzedni", "@previous": {}, "otherPartyNotLoggedIn": "Druga strona nie jest obecnie zalogowana i dlatego nie może odbierać wiadomości!", @@ -3360,14 +2948,8 @@ }, "checkList": "Lista kontrolna", "@checkList": {}, - "setCustomPermissionLevel": "Ustaw własny poziom uprawnień", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Proszę wybrać predefiniowaną rolę poniżej, lub wprowadzić własny poziom uprawnień pomiędzy 0 a 100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Ignoruj użytkownika", "@ignoreUser": {}, - "normalUser": "Zwykły użytkownik", - "@normalUser": {}, "approve": "Zaakceptuj", "@approve": {}, "youHaveKnocked": "Zapukałeś/-aś", @@ -3386,4 +2968,4 @@ "@moreEvents": {}, "declineInvitation": "Odrzuć zaproszenie", "@declineInvitation": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_pt.arb b/lib/l10n/intl_pt.arb index 22ba7e66..c0b2dd21 100644 --- a/lib/l10n/intl_pt.arb +++ b/lib/l10n/intl_pt.arb @@ -57,21 +57,6 @@ } } }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "help": "Ajuda", "@help": { "type": "String", @@ -119,18 +104,6 @@ "type": "String", "placeholders": {} }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "alwaysUse24HourFormat": "true", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." @@ -138,9 +111,5 @@ "repeatPassword": "Repita a senha", "@repeatPassword": {}, "notAnImage": "Não é um arquivo de imagem.", - "@notAnImage": {}, - "setCustomPermissionLevel": "Definir nível de permissão personalizado", - "@setCustomPermissionLevel": {}, - "addChatDescription": "Adicionar uma descrição de chat...", - "@addChatDescription": {} -} + "@notAnImage": {} +} \ No newline at end of file diff --git a/lib/l10n/intl_pt_BR.arb b/lib/l10n/intl_pt_BR.arb index ab690300..e5be40fa 100644 --- a/lib/l10n/intl_pt_BR.arb +++ b/lib/l10n/intl_pt_BR.arb @@ -128,18 +128,6 @@ } } }, - "badServerVersionsException": "O servidor suporta as versões de especificação:\n{serverVersions}\nMas este app suporta apenas {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Banir da conversa", "@banFromChat": { "type": "String", @@ -172,11 +160,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Mensagens de bots", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Cancelar", "@cancel": { "type": "String", @@ -505,31 +488,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Confirmar", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Conectar", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "O contato foi convidado ao grupo", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Contém nome de exibição", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Contém nome de usuário", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "O conteúdo foi denunciado para os administradores do servidor", "@contentHasBeenReported": { "type": "String", @@ -609,33 +572,6 @@ } } }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Isto desativará a sua conta. Isto é irreversível! Tem certeza?", "@deactivateAccountWarning": { "type": "String", @@ -741,11 +677,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Você tem que escolher um código emoji e uma imagem!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Conversa vazia", "@emptyChat": { "type": "String", @@ -795,11 +726,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Digite o seu servidor", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Erro ao obter localização: {error}", "@errorObtainingLocation": { "type": "String", @@ -849,11 +775,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Ir para a sala nova", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grupo", "@group": { "type": "String", @@ -925,11 +846,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identidade", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorar", "@ignore": { "type": "String", @@ -991,11 +907,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Convite para mim", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} convidou você para o FluffyChat.\n1. Visite fluffychat.im e instale o aplicativo\n2. Entre ou crie uma conta\n3. Abra o link do convite:\n{link}", "@inviteText": { "type": "String", @@ -1075,11 +986,6 @@ "type": "String", "placeholders": {} }, - "license": "Licença", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Claro", "@lightTheme": { "type": "String", @@ -1133,11 +1039,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Alterações de membros", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Mencionar", "@mention": { "type": "String", @@ -1245,11 +1146,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notificações ativadas para esta conta", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} usuários estão digitando…", "@numUsersTyping": { "type": "String", @@ -1349,11 +1245,6 @@ "type": "String", "placeholders": {} }, - "people": "Pessoas", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Selecione uma imagem", "@pickImage": { "type": "String", @@ -1373,11 +1264,6 @@ } } }, - "pleaseChoose": "Selecione", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Escolha um código", "@pleaseChooseAPasscode": { "type": "String", @@ -1471,11 +1357,6 @@ } } }, - "rejoin": "Entrar novamente", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Remover", "@remove": { "type": "String", @@ -1495,11 +1376,6 @@ } } }, - "removeDevice": "Remover dispositivo", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Desbanir da conversa", "@unbanFromChat": { "type": "String", @@ -1555,15 +1431,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Visto por {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Enviar", "@send": { "type": "String", @@ -1598,16 +1465,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Enviar original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Enviar figurinha", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Enviar vídeo", "@sendVideo": { "type": "String", @@ -1672,21 +1529,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Implantar emojis personalizados", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Enviar link de convite", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Configurar níveis de permissão", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Alterar estado", "@setStatus": { "type": "String", @@ -1721,11 +1563,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Entrada única", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Pular", "@skip": { "type": "String", @@ -1796,21 +1633,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Alternar favorito", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Alternar Silenciado", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Marcar lido/não lido", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Demasiadas requisições. Por favor, tente novamente mais tarde!", "@tooManyRequestsWarning": { "type": "String", @@ -1877,15 +1699,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 conversa não lida} other{{unreadCount} conversas não lidas}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} e mais {count} pessoas estão digitando…", "@userAndOthersAreTyping": { "type": "String", @@ -2010,11 +1823,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Plano de fundo:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Atenção!", "@warning": { "type": "String", @@ -2088,7 +1896,6 @@ "serverRequiresEmail": "Este servidor precisa validar seu e-mail para efetuar o cadastro.", "messageInfo": "Informações da mensagem", "sender": "Remetente", - "publish": "Publicar", "removeFromSpace": "Remover do espaço", "link": "Link", "start": "Iniciar", @@ -2096,7 +1903,6 @@ "addToSpace": "Adicionar ao espaço", "sendOnEnter": "Enviar ao pressionar enter", "homeserver": "Servidor", - "chatHasBeenAddedToThisSpace": "A conversa foi adicionada a este espaço", "commandHint_clearcache": "Limpar dados temporários", "@commandHint_clearcache": { "type": "String", @@ -2118,11 +1924,6 @@ "description": "Usage hint for the command /dm" }, "scanQrCode": "Ler código QR", - "openVideoCamera": "Abrir a câmera para um vídeo", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "addToBundle": "Adicionar à coleção", "removeFromBundle": "Remover desta coleção", "bundleName": "Nome da coleção", @@ -2130,23 +1931,8 @@ "time": "Horário", "messageType": "Tipo da mensagem", "openGallery": "Abrir galeria", - "addToSpaceDescription": "Selecione um espaço para adicionar esta conversa.", - "videoWithSize": "Vídeo ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "markAsRead": "Marcar como lido", "dismiss": "Descartar", - "separateChatTypes": "Separar conversas diretas e grupos", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "openChat": "Abrir conversa", "reportUser": "Denunciar usuário", "emojis": "Emojis", @@ -2167,30 +1953,9 @@ "pinMessage": "Fixar na sala", "voiceCall": "Chamada de voz", "unsupportedAndroidVersion": "Versão Android sem suporte", - "widgetNameError": "Forneça um nome de exibição.", "unsupportedAndroidVersionLong": "Esta funcionalidade requer uma versão mais nova do Android. Verifique se há atualizações ou suporte ao LineageOS.", - "emailOrUsername": "E-mail ou nome de usuário", "videoCallsBetaWarning": "Observe que chamadas de vídeo estão atualmente em teste. Podem não funcionar como esperado ou sequer funcionar em algumas plataformas.", "experimentalVideoCalls": "Vídeo chamadas experimentais", - "widgetVideo": "Vídeo", - "errorAddingWidget": "Erro ao adicionar o widget.", - "addWidget": "Adicionar widget", - "widgetEtherpad": "Anotação de texto", - "widgetUrlError": "Isto não é uma URL válida.", - "widgetJitsi": "Jitsi Meet", - "widgetCustom": "Personalizado", - "widgetName": "Nome", - "switchToAccount": "Alternar para a conta {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Próxima conta", - "previousAccount": "Conta anterior", "youRejectedTheInvitation": "Você rejeitou o convite", "youBannedUser": "Você baniu {user}", "@youBannedUser": { @@ -2260,7 +2025,6 @@ } }, "pleaseEnterRecoveryKeyDescription": "Para desbloquear as suas mensagens antigas, digite a sua chave de recuperação gerada numa sessão prévia. Sua chave de recuperação NÃO é sua senha.", - "indexedDbErrorLong": "Infelizmente, o armazenamento de mensagens não é ativado por padrão no modo privado.\nVisite\n- about:config\n- atribua \"true\" a \"dom.indexedDB.privateBrowsing.enabled\"\nSe não fizer isto, não será possível executar o FluffyChat.", "users": "Usuários", "confirmMatrixId": "Confirme seu ID Matrix para apagar sua conta.", "supposedMxid": "Isto deveria ser {mxid}", @@ -2272,7 +2036,6 @@ } } }, - "dehydrateTor": "Usuários TOR: Exportar sessão", "recoveryKey": "Chave de recuperação", "recoveryKeyLost": "Perdeu a chave de recuperação?", "commandHint_cuddle": "Enviar um afago", @@ -2298,11 +2061,7 @@ }, "commandHint_markasdm": "Marcar como sala de mensagens diretas para o ID Matrix fornecido", "commandHint_markasgroup": "Marcar como grupo", - "hydrateTor": "Usuários TOR: Importar sessão", - "hydrateTorLong": "Você exportou sua última sessão no TOR? Importe ela rapidamente e continue conversando.", "hydrate": "Restaurar a partir de um arquivo de backup", - "pleaseEnterRecoveryKey": "Digite sua chave de recuperação:", - "indexedDbErrorTitle": "Problemas no modo privado", "storeInSecureStorageDescription": "Guardar a chave de recuperação no armazenamento seguro deste dispositivo.", "saveKeyManuallyDescription": "Salvar esta chave manualmente via compartilhamento do sistema ou área de transferência.", "storeInAndroidKeystore": "Guardar no cofre do Android (KeyStore)", @@ -2311,18 +2070,9 @@ "user": "Usuário", "custom": "Personalizado", "foregroundServiceRunning": "Esta notificação aparece quando o serviço de primeiro plano está sendo executado.", - "callingPermissions": "Permissões de chamada", - "callingAccount": "Conta para chamadas", - "callingAccountDetails": "Permitir que o FluffyChat use o app de chamadas nativo do Android.", - "appearOnTop": "Aparecer no topo", - "appearOnTopDetails": "Permite que o app apareça no topo (desnecessário caso o FluffyChat já esteja configurado como conta para chamadas)", - "otherCallingPermissions": "Microfone, câmera e outras permissões do FluffyChat", "newGroup": "Novo grupo", "newSpace": "Novo espaço", - "enterSpace": "Abrir espaço", - "enterRoom": "Abrir sala", "allSpaces": "Todos os espaços", - "hideUnimportantStateEvents": "Ocultar eventos de estado desimportantes", "countFiles": "{count} arquivos", "@countFiles": { "placeholders": { @@ -2335,31 +2085,15 @@ "unlockOldMessages": "Desbloquear mensagens antigas", "dehydrate": "Exportar sessão e apagar dispositivo", "dehydrateWarning": "Esta ação não pode ser desfeita. Certifique-se de que o arquivo de backup está guardado e seguro.", - "dehydrateTorLong": "Para usuários TOR, é recomendado exportar a sessão antes de fechar a janela.", "whyIsThisMessageEncrypted": "Por que não consigo ler esta mensagem?", "screenSharingTitle": "compartilhamento de tela", "screenSharingDetail": "Você está compartilhando sua tela no FluffyChat", - "numChats": "{number} conversas", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "noKeyForThisMessage": "Isto pode ocorrer caso a mensagem tenha sido enviada antes de você ter se conectado à sua conta com este dispositivo.\n\nTambém é possível que o remetente tenha bloqueado o seu dispositivo ou ocorreu algum problema com a conexão.\n\nVocê consegue ler as mensagens em outra sessão? Então, pode transferir as mensagens de lá! Vá em Configurações > Dispositivos e confira se os dispositivos verificaram um ao outro. Quando abrir a sala da próxima vez e ambas as sessões estiverem abertas, as chaves serão transmitidas automaticamente.\n\nNão gostaria de perder suas chaves ao desconectar ou trocar de dispositivos? Certifique-se que o backup de conversas esteja ativado nas configurações.", - "allRooms": "Todas as conversas em grupo", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "notAnImage": "Não é um arquivo de imagem.", "importNow": "Importar agora", "importEmojis": "Importar emojis", "importFromZipFile": "Importar de arquivo .zip", "sendTypingNotifications": "Enviar indicadores de digitação", - "startFirstChat": "Inicie sua primeira conversa", "exportEmotePack": "Exportar pacote de emojis como .zip", "replace": "Substituir", "jumpToLastReadMessage": "Pular para a última mensagem lida", @@ -2377,7 +2111,6 @@ "pushNotificationsNotAvailable": "Notificações push não estão disponíveis", "invalidServerName": "Nome do servidor inválido", "chatPermissions": "Permissões da conversa", - "signInWithPassword": "Conectar com senha", "makeAdminDescription": "Assim que promover este usuário a administrador, não poderá desfazer isto e ele terá as mesmas permissões que você.", "setChatDescription": "Configurar descrição da conversa", "noOtherDevicesFound": "Nenhum outro dispositivo encontrado", @@ -2390,20 +2123,10 @@ } } }, - "signInWith": "Conectar com {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "fileIsTooBigForServer": "Não foi possível enviar! O servidor suporta anexos somente até {max}.", "readUpToHere": "Lido até aqui", "optionalRedactReason": "(Opcional) Motivo para apagar esta mensagem.", "archiveRoomDescription": "A conversa será movida para o arquivo. Outros usuários verão que você deixou a conversa.", - "inviteContactToGroupQuestion": "Deseja convidar {contact} para a conversa \"{groupName}\"?", "redactedByBecause": "Apagado por {username}, pois: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2428,7 +2151,6 @@ "redactMessageDescription": "A mensagem será apagada para todos os participantes desta conversa. Isto não poderá ser desfeito.", "invalidInput": "Entrada inválida!", "report": "relatar", - "addChatDescription": "Adicionar uma descrição à conversa...", "hasKnocked": "🚪 {user} bateu na porta", "@hasKnocked": { "placeholders": { @@ -2450,7 +2172,6 @@ } }, "inviteGroupChat": "📨 Convite para conversa em grupo", - "invitePrivateChat": "📨 Convite para conversa privada", "wasDirectChatDisplayName": "Conversa vazia (era {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2465,7 +2186,6 @@ "chatDescriptionHasBeenChanged": "Descrição da conversa alterada", "roomUpgradeDescription": "A conversa será recriada com a nova versão de sala. Todos participantes será notificados e terão que migrar para a nova sala. Você pode encontrar mais informações sobre versões de sala em https://spec.matrix.org/latest/room/", "pleaseEnterANumber": "Digite um número maior que 0", - "profileNotFound": "O usuário não foi encontrado neste servidor. Talvez um problema de conexão ou o usuário não existe.", "jump": "Pular", "sorryThatsNotPossible": "Desculpe... isto não é possível", "shareInviteLink": "Compartilhar link de convite", @@ -2475,8 +2195,6 @@ "type": "String", "placeholders": {} }, - "setTheme": "Aplicar tema:", - "pleaseTryAgainLaterOrChooseDifferentServer": "Tente novamente mais tarde ou escolha um servidor diferente.", "createGroup": "Criar grupo", "noBackupWarning": "Atenção! Se não ativar o backup de conversas, você perderá acesso a suas mensagens criptografadas. É altamente recomendável ativar o backup antes de sair.", "kickUserDescription": "O usuário foi expulso da conversa, mas não banido. Em conversas públicas, o usuário pode entrar novamente a qualquer momento.", @@ -2484,13 +2202,11 @@ "blockListDescription": "Você pode bloquear usuários que estejam te perturbando. Você não receberá mensagens ou convites de usuários na sua lista pessoal de bloqueios.", "createGroupAndInviteUsers": "Criar um grupo e convidar pessoas", "thisDevice": "Este dispositivo:", - "startConversation": "Iniciar uma conversa", "publicSpaces": "Espaços públicos", "blockedUsers": "Usuários bloqueados", "passwordIsWrong": "A senha digitada está incorreta", "pleaseEnterYourCurrentPassword": "Digite sua senha atual", "groupCanBeFoundViaSearch": "Grupos podem ser encontrados por pesquisa", - "publicLink": "Link público", "noUsersFoundWithQuery": "Infelizmente, não foi encontrado usuário com \"{query}\". Verifique se digitou corretamente.", "@noUsersFoundWithQuery": { "type": "String", @@ -2503,12 +2219,10 @@ "block": "Bloquear", "nothingFound": "Nada foi encontrado...", "yourGlobalUserIdIs": "Seu ID global de usuário é: ", - "decline": "Rejeitar", "newPassword": "Nova senha", "passwordsDoNotMatch": "As senhas não correspondem", "commandHint_sendraw": "Enviar JSON puro", "wrongRecoveryKey": "Desculpe... esta não parece ser a chave de recuperação correta.", - "subspace": "Subespaço", "select": "Selecionar", "pleaseChooseAStrongPassword": "Escolha uma senha forte", "blockUsername": "Ignorar nome de usuário", @@ -2520,23 +2234,6 @@ "databaseMigrationTitle": "O banco de dados está otimizado", "searchChatsRooms": "Pesquisar por #conversas, @usuários...", "databaseMigrationBody": "Aguarde. Isto pode demorar um pouco.", - "youInvitedToBy": "📩 Você foi convidado através do link para:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "forwardMessageTo": "Encaminhar mensagem para {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "formattedMessagesDescription": "Exibir conteúdo de mensagem rico, como texto em negrito usando markdown.", "verifyOtherUser": "🔐 Verificar outro usuário", "verifyOtherDevice": "🔐 Verificar outro dispositivo", @@ -2559,18 +2256,6 @@ } }, "transparent": "Transparente", - "databaseBuildErrorBody": "Não foi possível construir o banco de dados SQLite. O app tentará utilizar o banco de dados legado por enquanto. Relate este erro aos desenvolvedores em {url}. A mensagem de erro é: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "initAppError": "Ocorreu um erro enquanto o app era iniciado", "restoreSessionBody": "O app tentará agora restaurar sua sessão a partir do backup. Relate isto ao desenvolvedor em {url}. A mensagem de erro é: {error}", "@restoreSessionBody": { @@ -2587,11 +2272,6 @@ "sendReadReceipts": "Enviar recibos de leitura", "sendTypingNotificationsDescription": "Outros participantes nesta conversa podem ver quando você está digitando uma nova mensagem.", "formattedMessages": "Mensagens formatadas", - "presenceStyle": "Presença:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Mostrar as mensagens de estado de outros usuários", "@presencesToggle": { "type": "String", @@ -2674,10 +2354,7 @@ "hideRedactedMessages": "Ocultar mensagens apagadas", "hideRedactedMessagesBody": "Se alguém apagar uma mensagem, esta mensagem não será mais visível na conversa.", "hideInvalidOrUnknownMessageFormats": "Ocultar formatos de mensagem inválidos ou desconhecidos", - "hideMemberChangesInPublicChats": "Ocultar mudanças de membro em conversas públicas", - "hideMemberChangesInPublicChatsBody": "Não mostre se alguém entrou ou saiu da conversa para melhorar a legibilidade.", "overview": "Visão geral", - "notifyMeFor": "Notificar me para", "usersMustKnock": "Usuários devem bater na porta", "noOneCanJoin": "Ninguém pode entrar", "knocking": "Batendo na porta", @@ -2699,25 +2376,6 @@ "globalChatId": "ID global de conversa", "accessAndVisibility": "Acesso e visibilidade", "passwordRecoverySettings": "Configurações de recuperação de senha", - "userWouldLikeToChangeTheChat": "{user} gostaria de entrar na conversa.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Nenhum link público foi criado ainda", - "userRole": "Cargo do usuário", - "minimumPowerLevel": "{level} é o nível mínimo de poder.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "noDatabaseEncryption": "A criptografia do banco de dados não é suportada nesta plataforma", "createNewAddress": "Criar um novo endereço", "knock": "Bater na porta", @@ -2741,9 +2399,7 @@ "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, - "setPermissionsLevelDescription": "Selecione um cargo pré-definido abaixo ou digite um nível de permissão personalizado entre 0 e 100.", "shareKeysWith": "Compartilhar chaves com...", - "setCustomPermissionLevel": "Configurar nível personalizado de permissão", "ignoreUser": "Ignorar usuário", "contentNotificationSettings": "Configurações de notificações de conteúdo", "generalNotificationSettings": "Configurações de notificações gerais", @@ -2820,7 +2476,6 @@ "changelog": "Registro de mudanças", "sendCanceled": "Envio cancelado", "unableToJoinChat": "Não foi possível entrar na conversa. Talvez a outra pessoa já fechou a conversa.", - "whatIsAHomeserver": "O que é um servidor?", "prepareSendingAttachment": "Preparando o envio do anexo...", "sendingAttachment": "Enviando o anexo...", "noticeChatBackupDeviceVerification": "Observação: Quando você conecta todos os seus dispositivos ao backup de conversas, eles são verificados automaticamente.", @@ -2896,7 +2551,6 @@ "type": "String", "space": {} }, - "discoverHomeservers": "Explorar servidores", "loginWithMatrixId": "Conectar com ID Matrix", "calculatingFileSize": "Calculando o tamanho do arquivo...", "compressVideo": "Comprimindo o vídeo...", @@ -2926,7 +2580,6 @@ "notificationRuleSuppressNoticesDescription": "Omite notificações de clientes automatizados, como bots.", "notificationRuleInviteForMeDescription": "Notifica o usuário quando for convidado para uma sala.", "approve": "Aprovar", - "homeserverDescription": "Todos os seus dados são armazenados no servidor, parecido como um provedor de e-mail. Pode escolher qual servidor quer usar, enquanto ainda conversa com todo mundo. Aprenda mais em https://matrix.org.", "notificationRuleEncryptedRoomOneToOne": "Sala criptografada de 2 pessoas", "pleaseWaitUntilInvited": "Aguarde até que alguém da sala te convide.", "waitingForServer": "Aguardando o servidor...", @@ -2946,7 +2599,6 @@ }, "welcomeText": "Olá! 👋 Este é o FluffyChat. Você pode se conectar com qualquer servidor que é compatível com o https://matrix.org. E então conversar com qualquer um. É uma rede gigante e descentralizada de conversa!", "notificationRuleRoomServerAclDescription": "Omite notificações de listas de controle de acesso de servidor de uma sala (ACL).", - "appIntroduction": "O FluffyChat permite que você converse com os seus amigos entre mensageiros diferentes. Aprenda mais em https://matrix.org ou toque em *Continuar*.", "notificationRuleIsUserMentionDescription": "Notifica o usuário quando é mencionado diretamente em uma mensagem.", "notificationRuleSuppressEdits": "Omitir edições", "shareKeysWithDescription": "Quais dispositivos devem ser confiados para que possam ler suas mensagens em conversas criptografas?", @@ -2965,22 +2617,8 @@ "boldText": "Texto em negrito", "recordAVideo": "Gravar um vídeo", "optionalMessage": "(Opcional) mensagem...", - "joinedChats": "Conversas que entrou", "notSupportedOnThisDevice": "Não há suporte neste dispositivo", - "normalUser": "Usuário normal", "commandHint_roomupgrade": "Atualizar esta sala para a versão de sala especificada", - "countChatsAndCountParticipants": "{chats} conversas e {participants} participantes", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Mais nenhuma conversa foi encontrada...", "noChatsFoundHere": "Nenhuma conversa encontrada aqui ainda. Inicie uma nova conversa com alguém usando o botão abaixo. ⤵️", "space": "Espaço", @@ -3023,10 +2661,6 @@ "longPressToRecordVoiceMessage": "Segure para gravar uma mensagem de voz.", "pause": "Pausar", "resume": "Retomar", - "newSubSpace": "Novo sub espaço", - "moveToDifferentSpace": "Mover para espaço diferente", - "moveUp": "Mover para cima", - "moveDown": "Mover para baixo", "removeFromSpaceDescription": "A conversa será removida do espaço mas ainda aparecerá na sua lista de conversas.", "countChats": "{chats} conversas", "@countChats": { @@ -3069,7 +2703,6 @@ "startPoll": "Abrir enquete", "endPoll": "Fechar enquete", "answersVisible": "Respostas visíveis", - "answersHidden": "Respostas ocultas", "pollQuestion": "Questão da enquete", "answerOption": "Opção de resposta", "addAnswerOption": "Adicionar opção de resposta", @@ -3122,4 +2755,4 @@ }, "advancedConfigs": "", "theProcessWasCanceled": "" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_pt_PT.arb b/lib/l10n/intl_pt_PT.arb index c6a01d35..3a766fd1 100644 --- a/lib/l10n/intl_pt_PT.arb +++ b/lib/l10n/intl_pt_PT.arb @@ -116,18 +116,6 @@ }, "sendOnEnter": "Enviar com Enter", "@sendOnEnter": {}, - "badServerVersionsException": "O servidor suporta as versões Spec:\n{serverVersions}\nMas esta aplicação apenas suporta {suportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "badServerLoginTypesException": "O servidor suporta os tipos de início de sessão:\n{serverVersions}\nMas esta aplicação apenas suporta:\n{suportedVersions}", "@badServerLoginTypesException": { "type": "String", @@ -172,11 +160,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Mensagens de robôs", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Cancelar", "@cancel": { "type": "String", @@ -329,8 +312,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "A conversa foi adicionada a este espaço", - "@chatHasBeenAddedToThisSpace": {}, "chats": "Conversas", "@chats": { "type": "String", @@ -447,31 +428,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Confirmar", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Ligar", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "O contacto foi convidado para o grupo", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Contém nome de exibição", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Contém nome de utilizador", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "O conteúdo foi denunciado aos admins do servidor", "@contentHasBeenReported": { "type": "String", @@ -551,33 +512,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Isto irá desativar a tua conta. Não é reversível! Tens a certeza?", "@deactivateAccountWarning": { "type": "String", @@ -683,11 +617,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Precisas de escolher um código de emote e uma imagem!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Conversa vazia", "@emptyChat": { "type": "String", @@ -739,11 +668,6 @@ }, "homeserver": "Servidor", "@homeserver": {}, - "enterYourHomeserver": "Insere o teu servidor", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Erro ao obter localização: {error}", "@errorObtainingLocation": { "type": "String", @@ -783,11 +707,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Ir para a nova sala", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grupo", "@group": { "type": "String", @@ -859,11 +778,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identidade", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorar", "@ignore": { "type": "String", @@ -925,11 +839,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Convite para mim", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} convidou-te para o FluffyChat.\n1. Instala o FluffyChat: https://fluffychat.im\n2. Regista-te ou inicia sessão.\n3. Abre a ligação de convite: {link}", "@inviteText": { "type": "String", @@ -1009,11 +918,6 @@ "type": "String", "placeholders": {} }, - "license": "Licença", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Claro", "@lightTheme": { "type": "String", @@ -1067,11 +971,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Alterações de membros", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Mencionar", "@mention": { "type": "String", @@ -1266,11 +1165,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notificações ativadas para esta conta", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "Estão {count} utilizadores(as) a escrever…", "@numUsersTyping": { "type": "String", @@ -1388,11 +1282,6 @@ "type": "String", "placeholders": {} }, - "people": "Pessoas", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Escolher uma imagem", "@pickImage": { "type": "String", @@ -1412,11 +1301,6 @@ } } }, - "pleaseChoose": "Por favor, escolhe", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Por favor, escolhe um código-passe", "@pleaseChooseAPasscode": { "type": "String", @@ -1505,11 +1389,6 @@ } } }, - "rejoin": "Reentrar", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Remover", "@remove": { "type": "String", @@ -1529,11 +1408,6 @@ } } }, - "removeDevice": "Remover dispositivo", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Perdoar nesta conversa", "@unbanFromChat": { "type": "String", @@ -1589,15 +1463,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Visto por {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "sendFile": "Enviar ficheiro", "@sendFile": { "type": "String", @@ -1613,16 +1478,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Enviar original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Enviar autocolante", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Enviar vídeo", "@sendVideo": { "type": "String", @@ -1697,14 +1552,6 @@ "@dehydrate": {}, "dehydrateWarning": "Esta ação não pode ser revertida. Assegura-te que guardas bem a cópia de segurança.", "@dehydrateWarning": {}, - "hydrateTorLong": "Exportaste a tua sessão na última vez que estiveste no TOR? Importa-a rapidamente e continua a conversar.", - "@hydrateTorLong": {}, - "dehydrateTor": "Utilizadores do TOR: Exportar sessão", - "@dehydrateTor": {}, "hydrate": "Restaurar a partir de cópia de segurança", - "@hydrate": {}, - "hydrateTor": "Utilizadores do TOR: Importar sessão", - "@hydrateTor": {}, - "dehydrateTorLong": "Para utilizadores do TOR, é recomendado exportar a sessão antes de fechar a janela.", - "@dehydrateTorLong": {} -} + "@hydrate": {} +} \ No newline at end of file diff --git a/lib/l10n/intl_ro.arb b/lib/l10n/intl_ro.arb index 4fde7117..99522e52 100644 --- a/lib/l10n/intl_ro.arb +++ b/lib/l10n/intl_ro.arb @@ -197,11 +197,6 @@ } } }, - "enterYourHomeserver": "Introduceți homeserverul vostru", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "groupWith": "Grup cu {displayname}", "@groupWith": { "type": "String", @@ -221,11 +216,6 @@ "type": "String", "placeholders": {} }, - "rejoin": "Reintrați", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "sentCallInformations": "{senderName} a trimis informație de apel", "@sentCallInformations": { "type": "String", @@ -255,15 +245,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{Un chat necitit} other{{unreadCount} chaturi necitite}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "verifySuccess": "A reușit verificarea!", "@verifySuccess": { "type": "String", @@ -274,11 +255,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Imagine de fundal", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "reactedWith": "{sender} a reacționat cu {reaction}", "@reactedWith": { "type": "String", @@ -316,11 +292,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "Deschideți camera pentru video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "openAppToReadMessages": "Deschideți aplicația să citiți mesajele", "@openAppToReadMessages": { "type": "String", @@ -340,11 +311,6 @@ } } }, - "removeDevice": "Eliminați dispozitivul", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "share": "Partajați", "@share": { "type": "String", @@ -375,11 +341,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Comutați favoritul", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "unblockDevice": "Debloca dispozitiv", "@unblockDevice": { "type": "String", @@ -410,16 +371,12 @@ "type": "String", "placeholders": {} }, - "addToSpaceDescription": "Alegeți un spațiu în care să adăugați acest chat.", - "@addToSpaceDescription": {}, "placeCall": "Faceți apel", "@placeCall": {}, "voiceCall": "Apel vocal", "@voiceCall": {}, "unsupportedAndroidVersion": "Versiune de Android nesuportat", "@unsupportedAndroidVersion": {}, - "previousAccount": "Contul anterior", - "@previousAccount": {}, "userIsTyping": "{username} tastează…", "@userIsTyping": { "type": "String", @@ -429,8 +386,6 @@ } } }, - "widgetCustom": "Personalizat", - "@widgetCustom": {}, "screenSharingTitle": "partajarea de ecran", "@screenSharingTitle": {}, "newGroup": "Grup nou", @@ -543,11 +498,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Invitați pentru mine", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "fluffychat": "FluffyChat", "@fluffychat": { "type": "String", @@ -599,8 +549,6 @@ }, "openChat": "Deschideți Chat", "@openChat": {}, - "emailOrUsername": "Email sau nume de utilizator", - "@emailOrUsername": {}, "youBannedUser": "Ați interzis pe {user}", "@youBannedUser": { "placeholders": { @@ -611,8 +559,6 @@ }, "fileIsTooBigForServer": "Serverul reportează că fișierul este prea mare să fie trimis.", "@fileIsTooBigForServer": {}, - "widgetName": "Nume", - "@widgetName": {}, "sorryThatsNotPossible": "Scuze... acest nu este posibil", "@sorryThatsNotPossible": {}, "enableEncryptionWarning": "Activând criptare, nu mai puteți să o dezactivați în viitor. Sunteți sigur?", @@ -635,11 +581,6 @@ "type": "String", "placeholders": {} }, - "connect": "Conectați", - "@connect": { - "type": "String", - "placeholders": {} - }, "you": "Voi", "@you": { "type": "String", @@ -689,18 +630,6 @@ "type": "String", "placeholders": {} }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "theyMatch": "Sunt asemănători", "@theyMatch": { "type": "String", @@ -712,11 +641,6 @@ "type": "String", "placeholders": {} }, - "toggleMuted": "Comutați amuțeștarea", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "scanQrCode": "Scanați cod QR", "@scanQrCode": {}, "addAccount": "Adăugați cont", @@ -727,45 +651,15 @@ "@confirmEventUnpin": {}, "emojis": "Emoji-uri", "@emojis": {}, - "switchToAccount": "Schimbați la contul {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Contul următor", - "@nextAccount": {}, - "indexedDbErrorTitle": "Probleme cu modul privat", - "@indexedDbErrorTitle": {}, "users": "Utilizatori", "@users": {}, - "startFirstChat": "Începeți primul chatul vostru", - "@startFirstChat": {}, - "callingPermissions": "Permisiuni de apel", - "@callingPermissions": {}, - "callingAccount": "Cont de apel", - "@callingAccount": {}, "foregroundServiceRunning": "Această notificare apare când serviciul de foreground rulează.", "@foregroundServiceRunning": {}, - "callingAccountDetails": "Permite FluffyChat să folosească aplicația de apeluri nativă android.", - "@callingAccountDetails": {}, - "appearOnTop": "Apare deasupra", - "@appearOnTop": {}, - "appearOnTopDetails": "Permite aplicația să apare deasupra (nu este necesar dacă aveți FluffyChat stabilit ca cont de apeluri)", - "@appearOnTopDetails": {}, "currentlyActive": "Activ acum", "@currentlyActive": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Conține displayname", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "isTyping": "tastează…", "@isTyping": { "type": "String", @@ -783,8 +677,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Chatul a fost adăugat la acest spațiu", - "@chatHasBeenAddedToThisSpace": {}, "clearArchive": "Ștergeți arhiva", "@clearArchive": {}, "commandHint_markasdm": "Marcați ca cameră de mesaje directe", @@ -893,26 +785,6 @@ "type": "String", "placeholders": {} }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "allRooms": "Toate chaturi de grup", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "forward": "Înainte", "@forward": { "type": "String", @@ -933,11 +805,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identitate", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorați", "@ignore": { "type": "String", @@ -1029,11 +896,6 @@ "type": "String", "placeholders": {} }, - "license": "Permis", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Luminat", "@lightTheme": { "type": "String", @@ -1050,14 +912,6 @@ }, "dehydrate": "Exportați sesiunea și ștergeți dispozitivul", "@dehydrate": {}, - "dehydrateTor": "Utilizatori de TOR: Exportați sesiunea", - "@dehydrateTor": {}, - "dehydrateTorLong": "Pentru utilizatori de TOR, este recomandat să exportați sesiunea înainte de a închideți fereastra.", - "@dehydrateTorLong": {}, - "hydrateTor": "Utilizatori TOR: Importați sesiune exportată", - "@hydrateTor": {}, - "hydrateTorLong": "Ați exportat sesiunea vostră ultima dată pe TOR? Importați-o repede și continuați să conversați.", - "@hydrateTorLong": {}, "hydrate": "Restaurați din fișier backup", "@hydrate": {}, "loadMore": "Încarcă mai multe…", @@ -1110,11 +964,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Notificări activate pentru acest cont", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "obtainingLocation": "Obținând locație…", "@obtainingLocation": { "type": "String", @@ -1145,21 +994,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Stabiliți emoji-uri personalizate", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Stabiliți nivelul de permisii", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, - "singlesignon": "Autentificare unică", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "startedACall": "{senderName} a început un apel", "@startedACall": { "type": "String", @@ -1270,33 +1104,10 @@ "@openGallery": {}, "removeFromSpace": "Eliminați din spațiu", "@removeFromSpace": {}, - "publish": "Publicați", - "@publish": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "unsupportedAndroidVersionLong": "Această funcție are nevoie de o versiune de Android mai nouă. Vă rugăm să verificați dacă sunt actualizări sau suport de la Lineage OS.", "@unsupportedAndroidVersionLong": {}, "dismiss": "Respingeți", "@dismiss": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "widgetEtherpad": "Notiță text", - "@widgetEtherpad": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetUrlError": "Acest URL nu este valibil.", - "@widgetUrlError": {}, - "widgetNameError": "Vă rugăm să introduceți un nume de afișare.", - "@widgetNameError": {}, - "errorAddingWidget": "Adăugarea widget-ului a eșuat.", - "@errorAddingWidget": {}, "youRejectedTheInvitation": "Ați respins invitația", "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Va-ți alăturat la chat", @@ -1355,29 +1166,12 @@ "@screenSharingDetail": {}, "storeSecurlyOnThisDevice": "Stoca sigur pe acest dispozitiv", "@storeSecurlyOnThisDevice": {}, - "otherCallingPermissions": "Microfon, cameră și alte permisiuni lui FluffyChat", - "@otherCallingPermissions": {}, "whyIsThisMessageEncrypted": "De ce este acest mesaj ilizibil?", "@whyIsThisMessageEncrypted": {}, "newSpace": "Spațiu nou", "@newSpace": {}, - "enterSpace": "Intrați în spațiu", - "@enterSpace": {}, - "enterRoom": "Intrați în cameră", - "@enterRoom": {}, "allSpaces": "Toate spațiile", "@allSpaces": {}, - "numChats": "{number} chaturi", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Ascundeți evenimente de stare neimportante", - "@hideUnimportantStateEvents": {}, "doNotShowAgain": "Nu se mai apară din nou", "@doNotShowAgain": {}, "newSpaceDescription": "Spațiile vă permit să vă consolidați chaturile și să stabiliți comunități private sau publice.", @@ -1405,11 +1199,6 @@ "@report": {}, "jumpToLastReadMessage": "Săriți la ultimul citit mesaj", "@jumpToLastReadMessage": {}, - "memberChanges": "Schimbări de membri", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "guestsCanJoin": "Musafiri pot să se alăture", "@guestsCanJoin": { "type": "String", @@ -1435,11 +1224,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Mergeți la camera nouă", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grup", "@group": { "type": "String", @@ -1519,11 +1303,6 @@ "type": "String", "placeholders": {} }, - "confirm": "Confirmați", - "@confirm": { - "type": "String", - "placeholders": {} - }, "or": "Sau", "@or": { "type": "String", @@ -1550,11 +1329,6 @@ } } }, - "setInvitationLink": "Stabiliți linkul de invitație", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "transferFromAnotherDevice": "Transfera de la alt dispozitiv", "@transferFromAnotherDevice": { "type": "String", @@ -1570,11 +1344,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "Marcați Citit/Necitit", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tryToSendAgain": "Încercați să trimiteți din nou", "@tryToSendAgain": { "type": "String", @@ -1706,10 +1475,6 @@ } } }, - "indexedDbErrorLong": "Stocarea de mesaje nu este activat implicit în modul privat.\nVă rugăm să vizitați\n- about:config\n- stabiliți dom.indexedDB.privateBrowsing.enabled la true\nAstfel, nu este posibil să folosiți FluffyChat.", - "@indexedDbErrorLong": {}, - "addWidget": "Adăugați widget", - "@addWidget": {}, "locationPermissionDeniedNotice": "Permisiunea locației blocată. Vă rugăm să o dezblocați să împărțiți locația voastră.", "@locationPermissionDeniedNotice": { "type": "String", @@ -1809,18 +1574,6 @@ "@addToSpace": {}, "commandHint_hug": "Trimiteți o îmbrățișare", "@commandHint_hug": {}, - "badServerVersionsException": "Homeserver-ul suportă versiunele de Spec următoare:\n{serverVersions}\nDar această aplicație suportă numai {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "badServerLoginTypesException": "Homeserver-ul suportă următoarele feluri de login:\n{serverVersions}\nDar această aplicație suportă numai:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "String", @@ -1924,11 +1677,6 @@ "type": "String", "placeholders": {} }, - "containsUserName": "Conține nume de utilizator", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "copyToClipboard": "Copiați în clipboard", "@copyToClipboard": { "type": "String", @@ -2048,11 +1796,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Trebuie să alegeți shortcode pentru emote și o imagine!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "encryption": "Criptare", "@encryption": { "type": "String", @@ -2112,11 +1855,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Trimiteți original", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Trimiteți video", "@sendVideo": { "type": "String", @@ -2127,18 +1865,8 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Trimiteți sticker", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "pleaseEnterRecoveryKeyDescription": "Să vă deblocați mesajele vechi, vă rugăm să introduceți cheia de recuperare creată de o seșiune anterioră. Cheia de recuperare NU este parola voastră.", "@pleaseEnterRecoveryKeyDescription": {}, - "separateChatTypes": "Afișați chaturi directe și grupuri separat", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Stabiliți ca pseudonimul primar", "@setAsCanonicalAlias": { "type": "String", @@ -2194,21 +1922,11 @@ "type": "String", "placeholders": {} }, - "people": "Persoane", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Alegeți o imagine", "@pickImage": { "type": "String", "placeholders": {} }, - "pleaseChoose": "Vă rugăm să alegeți", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pin": "Fixați", "@pin": { "type": "String", @@ -2306,15 +2024,6 @@ "@recoveryKey": {}, "recoveryKeyLost": "Cheia de recuperare pierdută?", "@recoveryKeyLost": {}, - "seenByUser": "Văzut de {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "muteChat": "Amuțați chatul", "@muteChat": { "type": "String", @@ -2365,8 +2074,6 @@ }, "deviceKeys": "Cheile dispozitivului:", "@deviceKeys": {}, - "pleaseEnterRecoveryKey": "Vă rugăm să introduceți cheia voastră de recuperare:", - "@pleaseEnterRecoveryKey": {}, "newVerificationRequest": "Cerere de verificare nouă!", "@newVerificationRequest": { "type": "String", @@ -2448,11 +2155,6 @@ }, "commandHint_googly": "Trimiteți câțiva ochi googly", "@commandHint_googly": {}, - "botMessages": "Mesaje Bot", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "all": "Toate", "@all": { "type": "String", @@ -2504,9 +2206,5 @@ "placeholders": {} }, "reopenChat": "Deschide din nou chatul", - "@reopenChat": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Vă rugăm să încercați din nou mai târziu sau să alegeți un server diferit.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "signInWithPassword": "Conectați-vă cu parolă", - "@signInWithPassword": {} -} + "@reopenChat": {} +} \ No newline at end of file diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 710b1c2c..aad8890b 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -129,18 +129,6 @@ } } }, - "badServerVersionsException": "Домашний сервер поддерживает следующие версии спецификации:\n{serverVersions}\nНо это приложение поддерживает только {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Заблокировать в чате", "@banFromChat": { "type": "String", @@ -173,11 +161,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Сообщения ботов", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Отмена", "@cancel": { "type": "String", @@ -506,31 +489,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Подтвердить", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Присоединиться", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Контакт был приглашен в группу", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Содержит отображаемое имя", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Содержит имя пользователя", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "О контенте было сообщено администраторам сервера", "@contentHasBeenReported": { "type": "String", @@ -610,33 +573,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Это деактивирует вашу учётную запись пользователя. Данное действие не может быть отменено! Вы уверены?", "@deactivateAccountWarning": { "type": "String", @@ -742,11 +678,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Вам нужно задать код эмодзи и изображение!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Пустой чат", "@emptyChat": { "type": "String", @@ -796,11 +727,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Введите адрес вашего домашнего сервера", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Ошибка получения местоположения: {error}", "@errorObtainingLocation": { "type": "String", @@ -850,11 +776,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "В новую комнату", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Группа", "@group": { "type": "String", @@ -926,11 +847,6 @@ "type": "String", "placeholders": {} }, - "identity": "Идентификация", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Игнорировать", "@ignore": { "type": "String", @@ -992,11 +908,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Приглашение для меня", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} пригласил(а) вас в FluffyChat. \n1. Посетите https://fluffychat.im и установите приложение \n2. Зарегистрируйтесь или войдите \n3. Откройте ссылку приглашения: \n {link}", "@inviteText": { "type": "String", @@ -1076,11 +987,6 @@ "type": "String", "placeholders": {} }, - "license": "Лицензия", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Светлая", "@lightTheme": { "type": "String", @@ -1125,11 +1031,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Изменения участников", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Упомянуть", "@mention": { "type": "String", @@ -1237,11 +1138,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Уведомления включены для этой учётной записи", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} пользователей печатают…", "@numUsersTyping": { "type": "String", @@ -1341,11 +1237,6 @@ "type": "String", "placeholders": {} }, - "people": "Люди", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Выбрать изображение", "@pickImage": { "type": "String", @@ -1365,11 +1256,6 @@ } } }, - "pleaseChoose": "Пожалуйста, выберите", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Пожалуйста, выберите код доступа", "@pleaseChooseAPasscode": { "type": "String", @@ -1463,11 +1349,6 @@ } } }, - "rejoin": "Зайти повторно", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Удалить", "@remove": { "type": "String", @@ -1487,11 +1368,6 @@ } } }, - "removeDevice": "Удалить устройство", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Разблокировать в чате", "@unbanFromChat": { "type": "String", @@ -1547,15 +1423,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Просмотрено пользователем {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Прислать", "@send": { "type": "String", @@ -1590,16 +1457,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Отправить оригинал", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Отправить стикер", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Отправить видео", "@sendVideo": { "type": "String", @@ -1664,21 +1521,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Установить пользовательские эмодзи", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Установить ссылку для приглашения", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Установить уровень разрешений", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Задать статус", "@setStatus": { "type": "String", @@ -1713,11 +1555,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Единая точка входа", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Пропустить", "@skip": { "type": "String", @@ -1788,21 +1625,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Переключить избранное", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Переключить без звука", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Отметить как прочитанное/непрочитанное", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Слишком много запросов. Пожалуйста, повторите попытку позже!", "@tooManyRequestsWarning": { "type": "String", @@ -1993,11 +1815,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Обои:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Предупреждение!", "@warning": { "type": "String", @@ -2063,7 +1880,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Чат был добавлен в это пространство", "addToSpace": "Добавить в пространство", "scanQrCode": "Сканировать QR-код", "sendOnEnter": "Отправлять по Enter", @@ -2103,26 +1919,10 @@ "description": "Usage hint for the command /create" }, "sender": "Отправитель", - "addToSpaceDescription": "Выберите пространство, чтобы добавить к нему этот чат.", "start": "Начать", "time": "Время", "messageType": "Тип сообщения", "repeatPassword": "Повторите пароль", - "openVideoCamera": "Открыть камеру для видео", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "videoWithSize": "Видео ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "publish": "Опубликовать", "dismiss": "Отклонить", "markAsRead": "Отметить как прочитанное", "reportUser": "Сообщить о пользователе", @@ -2146,34 +1946,8 @@ "placeCall": "Совершить звонок", "videoCallsBetaWarning": "Обратите внимание, что видеозвонки в настоящее время находятся в бета-версии. Они могут работать не так, как ожидалось, или вообще не работать на всех платформах.", "experimentalVideoCalls": "Экспериментальные видеозвонки", - "emailOrUsername": "Адрес электронной почты или имя пользователя", "pinMessage": "Прикрепить к комнате", "confirmEventUnpin": "Вы уверены, что хотите навсегда открепить событие?", - "switchToAccount": "Переключиться на учётную запись {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Следующая учётная запись", - "previousAccount": "Предыдущая учётная запись", - "addWidget": "Добавить виджет", - "widgetVideo": "Видео", - "widgetEtherpad": "Текстовая записка", - "widgetCustom": "Пользовательский", - "widgetJitsi": "Совещание Jitsi", - "widgetName": "Имя", - "widgetUrlError": "Этот URL не действителен.", - "widgetNameError": "Пожалуйста, укажите отображаемое имя.", - "errorAddingWidget": "Ошибка при добавлении виджета.", - "separateChatTypes": "Разделять личные чаты и группы", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "youRejectedTheInvitation": "Вы отклонили приглашение", "youAcceptedTheInvitation": "👍 Вы приняли приглашение", "youUnbannedUser": "Вы разблокировали {user}", @@ -2240,7 +2014,6 @@ "storeSecurlyOnThisDevice": "Сохранить на этом устройстве", "saveKeyManuallyDescription": "Сохраните этот ключ вручную, вызвав диалог общего доступа системы или буфера обмена.", "recoveryKey": "Ключ восстановления", - "pleaseEnterRecoveryKey": "Введите ключ восстановления:", "pleaseEnterRecoveryKeyDescription": "Чтобы разблокировать старые сообщения, введите ключ восстановления, сгенерированный в предыдущем сеансе. Ваш ключ восстановления НЕ является вашим паролем.", "storeInAndroidKeystore": "Сохранить в Android KeyStore", "storeInAppleKeyChain": "Сохранить в Apple KeyChain", @@ -2255,45 +2028,21 @@ } } }, - "dehydrateTor": "Пользователи TOR: Экспорт сеанса", - "indexedDbErrorLong": "К сожалению, по умолчанию хранилище сообщений не включено в приватном режиме.\nПожалуйста, посетите\n- about:config\n- установите для dom.indexedDB.privateBrowsing.enabled значение true\nВ противном случае запуск FluffyChat будет невозможен.", "custom": "Пользовательское", "hydrate": "Восстановить из файла резервной копии", - "hydrateTor": "Пользователи TOR: Импорт экспорта сессии", - "hydrateTorLong": "В прошлый раз вы экспортировали свою сессию в TOR? Быстро импортируйте его и продолжайте общение.", - "dehydrateTorLong": "Для пользователей TOR рекомендуется экспортировать сессию перед закрытием окна.", "dehydrate": "Экспорт сеанса и очистка устройства", "dehydrateWarning": "Это действие не может быть отменено. Убедитесь, что вы безопасно сохранили файл резервной копии.", - "indexedDbErrorTitle": "Проблемы с приватным режимом", - "otherCallingPermissions": "Микрофон, камера и другие разрешения FluffyChat", - "enterSpace": "Войти в пространство", "screenSharingDetail": "Вы делитесь своим экраном в FuffyChat", - "callingAccountDetails": "Позволяет FluffyChat использовать родное android приложение для звонков.", "newSpace": "Новое пространство", - "appearOnTop": "Появляться сверху", "commandHint_markasdm": "Пометить как комнату личных сообщений", - "appearOnTopDetails": "Позволяет приложению отображаться сверху (не требуется, если у вас уже настроен Fluffychat как аккаунт для звонков)", "foregroundServiceRunning": "Это уведомление появляется, когда запущена основная служба.", "newGroup": "Новая группа", - "enterRoom": "Войти в комнату", "allSpaces": "Все пространства", - "callingPermissions": "Разрешения на звонки", - "callingAccount": "Аккаунт для звонков", "commandHint_markasgroup": "Пометить как группу", "whyIsThisMessageEncrypted": "Почему это сообщение нечитаемо?", "noKeyForThisMessage": "Это может произойти, если сообщение было отправлено до того, как вы вошли в свою учетную запись на данном устройстве.\n\nТакже возможно, что отправитель заблокировал ваше устройство или что-то пошло не так с интернет-соединением.\n\nВы можете прочитать сообщение на другой сессии? Тогда вы можете перенести сообщение с неё! Перейдите в Настройки > Устройства и убедитесь, что ваши устройства проверили друг друга. Когда вы откроете комнату в следующий раз и обе сессии будут открыты, ключи будут переданы автоматически.\n\nВы не хотите потерять ключи при выходе из системы или переключении устройств? Убедитесь, что вы включили резервное копирование чата в настройках.", "screenSharingTitle": "общий доступ к экрану", - "numChats": "{number} чатов", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "fileIsTooBigForServer": "Отправка не удалась! Сервер поддерживает только вложения размером до {max}.", - "hideUnimportantStateEvents": "Скрыть необязательные события статуса", "sorryThatsNotPossible": "Извините... это невозможно", "openLinkInBrowser": "Открыть ссылку в браузере", "fileHasBeenSavedAt": "Файл сохранён в {path}", @@ -2335,12 +2084,6 @@ "noOtherDevicesFound": "Другие устройства не найдены", "reportErrorDescription": "😭 О, нет. Что-то пошло не так. При желании вы можете сообщить об этой ошибке разработчикам.", "report": "пожаловаться", - "allRooms": "Все группы", - "@allRooms": { - "type": "String", - "placeholders": {} - }, - "startFirstChat": "Начните Ваш первый чат", "jumpToLastReadMessage": "Последнее прочитанное сообщение", "wasDirectChatDisplayName": "Пустой чат (был {oldDisplayName})", "@wasDirectChatDisplayName": { @@ -2354,15 +2097,6 @@ "encryptThisChat": "Зашифровать этот чат", "reopenChat": "Открыть чат заново", "commandHint_googly": "Отправить выпученные глаза", - "signInWith": "Войти с {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "notAnImage": "Это не картинка.", "importNow": "Импортировать сейчас", "importEmojis": "Импортировать эмодзи", @@ -2378,13 +2112,9 @@ } } }, - "signInWithPassword": "Войти с помощью пароля", - "pleaseTryAgainLaterOrChooseDifferentServer": "Повторите попытку позже или выберите другой сервер.", "sendTypingNotifications": "Отправлять уведомления о наборе текста", "createGroup": "Создать группу", - "inviteContactToGroupQuestion": "Вы хотите пригласить {contact} в чат \"{groupName}\"?", "tryAgain": "Повторите попытку", - "addChatDescription": "Добавить описание чата...", "chatPermissions": "Права в чате", "chatDescription": "Описание чата", "chatDescriptionHasBeenChanged": "Описание чата изменено", @@ -2404,8 +2134,6 @@ } }, "directChat": "Личный чат", - "profileNotFound": "Пользователь не найден на сервере. Это может быть проблемой подключения или пользователь не существует.", - "setTheme": "Тема:", "redactedByBecause": "{username} отредактировал это событие. Причина: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2421,7 +2149,6 @@ "setChatDescription": "Установить описание чата", "setColorTheme": "Цветовая тема:", "invite": "Пригласить", - "invitePrivateChat": "📨 Вас пригласили в приватный чат", "inviteGroupChat": "📨 Вас пригласили в групповой чат", "invalidInput": "Недопустимый ввод!", "wrongPinEntered": "Wrong pin entered! Try again in {seconds} seconds...", @@ -2461,7 +2188,6 @@ "block": "Заглушить", "blockUsername": "Игнорировать имя пользователя", "createGroupAndInviteUsers": "Создать и начать приглашать", - "startConversation": "Начать общение", "groupCanBeFoundViaSearch": "Группа может быть найдена поиском", "noUsersFoundWithQuery": "К сожалению пользователей с именем \"{query}\" не найдено. Убедитесь, что вы не совершили опечатку.", "@noUsersFoundWithQuery": { @@ -2482,7 +2208,6 @@ "publicSpaces": "Публичные пространства", "passwordIsWrong": "Вы ввели неверный пароль", "pleaseEnterYourCurrentPassword": "Пожалуйста, введите свой текущий пароль", - "publicLink": "Публичная ссылка", "nothingFound": "Ничего не найдено...", "newPassword": "Новый пароль", "passwordsDoNotMatch": "Пароли не совпадают", @@ -2492,19 +2217,6 @@ "joinSpace": "Присоединиться к пространству", "searchForUsers": "Поиск @пользователей...", "thisDevice": "Данное устройство:", - "decline": "Отклонить", - "databaseBuildErrorBody": "Невозможно собрать базу данных SQlite. Приложение пытается использовать старую базу данных. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "initAppError": "Произошла ошибка при запуске приложения", "sessionLostBody": "Ваш сеанс утерян. Пожалуйста, сообщите об этой ошибке разработчикам по адресу {url}. Сообщение об ошибке: {error}", "@sessionLostBody": { @@ -2530,28 +2242,10 @@ } } }, - "subspace": "Субпространство", "addChatOrSubSpace": "Добавить чат или субпространство", - "youInvitedToBy": "📩 Вы были приглашены по ссылке на:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "sendReadReceipts": "Отправка квитанций о прочтении", "verifyOtherUser": "🔐 Подтвердить другого пользователя", "verifyOtherDevice": "🔐 Подтвердить другое устройство", - "forwardMessageTo": "Переслать сообщение в {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceiptsDescription": "Другие участники чата могут видеть, когда вы прочитали сообщение.", "transparent": "Прозрачный", "verifyOtherUserDescription": "Если вы подтвердите другого пользователя, то вы можете быть уверены зная, кому вы действительно пишете. 💪\n\nКогда вы начинаете подтверждение, вы и другой пользователь увидите всплывающее окно в приложении. Там вы увидите ряд чисел или эмодзи, которые вы должны сравнить друг с другом.\n\nЛучший способ сделать это - встретиться в реальной жизни или по видео звонку. 👭", @@ -2619,22 +2313,15 @@ "type": "String", "placeholders": {} }, - "presenceStyle": "Представление:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "hidePresences": "Скрыть список статусов?", "stickers": "Стикеры", "discover": "Исследовать", "globalChatId": "ID глобального чата", "customEmojisAndStickersBody": "Добавить или поделиться пользовательскими эмодзи или стикерами, которые могут быть применены в любом чате.", - "hideMemberChangesInPublicChatsBody": "Для улучшения читаемости не показывать на временной шкале входы и выходы из чата.", "knocking": "Стучаться", "accessAndVisibility": "Доступность и видимость", "publicChatAddresses": "Адресы публичного чата", "accessAndVisibilityDescription": "Кому разрешено войти в этот чат и как этот чат может быть обнаружен.", - "userRole": "Роль пользователя", "noDatabaseEncryption": "Шифрование базы данных не поддерживается на этой платформе", "appLockDescription": "Заблокировать приложение когда не используется пин код", "calls": "Звонки", @@ -2642,22 +2329,11 @@ "hideRedactedMessages": "Скрыть редактированные сообщения", "hideInvalidOrUnknownMessageFormats": "Скрыть неправильные или неизвестные форматы сообщения", "hideRedactedMessagesBody": "Если кто-то редактирует сообщение, оно будет скрыто в чате.", - "hideMemberChangesInPublicChats": "Скрыть изменения участников в публичных чатах", "overview": "Обзор", - "notifyMeFor": "Уведомлять меня о", "passwordRecoverySettings": "Настройки восстановления пароля", - "userWouldLikeToChangeTheChat": "{user} желает присоединиться к чату.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "knock": "Постучаться", "usersMustKnock": "Пользователи должны постучаться", "noOneCanJoin": "Никто не может присоединиться", - "noPublicLinkHasBeenCreatedYet": "Публичная ссылка еще не была создана", "chatCanBeDiscoveredViaSearchOnServer": "Чат может быть обнаружен через поиск в {server}", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2668,15 +2344,6 @@ } }, "createNewAddress": "Создать новый адрес", - "minimumPowerLevel": "{level} является минимальным уровнем.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "commandHint_ignore": "Игнорировать данный matrix ID", "commandHint_unignore": "Не игнорировать данный matrix ID", "restricted": "Запрещено", @@ -2772,10 +2439,6 @@ "noticeChatBackupDeviceVerification": "Примечание: Если вы подключите все свои устройства к резервному копированию чатов, то они автоматически станут подтверждёнными.", "changeTheCanonicalRoomAlias": "Изменить основной общедоступный адрес чата", "loginWithMatrixId": "Войти через Matrix ID", - "whatIsAHomeserver": "Для чего нужен домашний сервер?", - "homeserverDescription": "Все ваши данные хранятся на домашнем сервере, прямо как у вашего провайдера электронной почты. Вы можете выбрать, какому серверу вы их доверите, при этом сохраняя возможность общаться со всеми. Узнайте больше на https://matrix.org.", - "discoverHomeservers": "Список домашних серверов", - "joinedChats": "Вступленные чаты", "serverInformation": "Информация о сервере:", "sendingAttachmentCountOfCount": "Отправляется вложение {index} из {length}...", "@sendingAttachmentCountOfCount": { @@ -2878,16 +2541,12 @@ "otherPartyNotLoggedIn": "Другая сторона в настоящее время не вошла в систему и поэтому не может получать сообщения!", "open": "Открыть", "waitingForServer": "Ожидание сервера...", - "appIntroduction": "FluffyChat позволяет вам общаться с друзьями с разными мессенджерами. Узнайте больше на https://matrix.org или просто нажмите *Продолжить*.", "previous": "Предыдущий", "notificationRuleCallDescription": "Уведомляет пользователя про звонки.", "notificationRuleEncryptedRoomOneToOne": "Шифрованная комната «Один на один»", "notificationRuleEncryptedRoomOneToOneDescription": "Уведомляет пользователя про сообщение в зашифрованных комнатах «Один на один».", "notificationRuleRoomOneToOne": "Комната «Один на один»", - "setCustomPermissionLevel": "Установить уровень пользовательских разрешений", - "setPermissionsLevelDescription": "Выберите одну из стандартных ролей ниже или введите произвольный уровень прав от 0 до 100.", "ignoreUser": "Заглушить пользователя", - "normalUser": "Обычный пользователь", "commandHint_roomupgrade": "Обновить комнату до указанной версии", "notificationRuleInviteForMeDescription": "Уведомляет пользователя, когда его приглашают в комнату.", "unknownPushRule": "Неизвестное правило оповещения '{rule}'", @@ -2953,10 +2612,6 @@ "longPressToRecordVoiceMessage": "Нажмите длиннее, чтобы записать голосовое сообщение.", "pause": "Пауза", "resume": "Продолжить", - "newSubSpace": "Новое подпространство", - "moveToDifferentSpace": "Переместить в другое пространство", - "moveUp": "Переместить вверх", - "moveDown": "Переместить вниз", "removeFromSpaceDescription": "Чат будет удален из пространства, но все равно появится в вашем списке чатов.", "countChats": "{chats} чатов", "@countChats": { @@ -2999,7 +2654,6 @@ "startPoll": "Начать опрос", "endPoll": "Завершить опрос", "answersVisible": "Ответы видны", - "answersHidden": "Ответы скрыты", "pollQuestion": "Вопрос по опросу", "answerOption": "Вариант ответа", "addAnswerOption": "Добавить вариант ответа", @@ -3024,18 +2678,6 @@ "createNewAccount": "Создать новый аккаунт", "theProcessWasCanceled": "Процесс был отменен.", "noMoreResultsFound": "Ничего не найдено", - "countChatsAndCountParticipants": "{chats} чатов и {participants} участников", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "countInvited": "{count} приглашенных", "@countInvited": { "type": "String", @@ -3054,4 +2696,4 @@ } } } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_sk.arb b/lib/l10n/intl_sk.arb index 4645b333..59769a2c 100644 --- a/lib/l10n/intl_sk.arb +++ b/lib/l10n/intl_sk.arb @@ -304,16 +304,6 @@ "type": "String", "placeholders": {} }, - "confirm": "Potvrdiť", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Pripojiť", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt bol pozvaný do skupiny", "@contactHasBeenInvitedToTheGroup": { "type": "String", @@ -383,33 +373,6 @@ } } }, - "dateWithoutYear": "{day}.{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}.{month}.{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "delete": "Odstrániť", "@delete": { "type": "String", @@ -465,11 +428,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Musíte zvoliť kód emotikonu a obrázok!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Prázdny chat", "@emptyChat": { "type": "String", @@ -490,11 +448,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Zadajte svoj homeserver", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "fileName": "Názov súboru", "@fileName": { "type": "String", @@ -571,11 +524,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identita", - "@identity": { - "type": "String", - "placeholders": {} - }, "incorrectPassphraseOrKey": "Nesprávna prístupová fráza alebo kľúč na obnovenie", "@incorrectPassphraseOrKey": { "type": "String", @@ -691,11 +639,6 @@ "type": "String", "placeholders": {} }, - "license": "Licencia", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Svetlá", "@lightTheme": { "type": "String", @@ -881,11 +824,6 @@ } } }, - "rejoin": "Vrátiť sa", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Odstrániť", "@remove": { "type": "String", @@ -905,11 +843,6 @@ } } }, - "removeDevice": "Odstráňiť zariadenie", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Odblokovať", "@unbanFromChat": { "type": "String", @@ -930,15 +863,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Videné užívateľom {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Odoslať", "@send": { "type": "String", @@ -1004,11 +928,6 @@ } } }, - "setInvitationLink": "Nastaviť odkaz pre pozvánku", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "setStatus": "Nastaviť status", "@setStatus": { "type": "String", @@ -1120,15 +1039,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, other{{unreadCount} neprečítaných chatov}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} a {count} dalších píšu…", "@userAndOthersAreTyping": { "type": "String", @@ -1248,11 +1158,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Pozadie", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "whoIsAllowedToJoinThisGroup": "Kto môže vstúpiť do tejto skupiny", "@whoIsAllowedToJoinThisGroup": { "type": "String", @@ -1283,11 +1188,6 @@ "type": "String", "placeholders": {} }, - "people": "Ľudia", - "@people": { - "type": "String", - "placeholders": {} - }, "chats": "Čety", "@chats": { "type": "String", @@ -1303,18 +1203,6 @@ "type": "String", "placeholders": {} }, - "badServerVersionsException": "Domovský server podporuje verzie špecifikácie:\n{serverVersions}\nAle táto aplikácie podporuje iba {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "answeredTheCall": "{senderName} prevzal hovor", "@answeredTheCall": { "type": "String", @@ -1349,11 +1237,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Poslať nálepku", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "roomVersion": "Verzia miestnosti", "@roomVersion": { "type": "String", @@ -1369,11 +1252,6 @@ "type": "String", "placeholders": {} }, - "setPermissionsLevel": "Nastaviť úroveň oprávnení", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "badServerLoginTypesException": "Server podporuje tieto typy prihlásenia:\n{serverVersions}\nAle táto aplikácia podporuje iba:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "String", @@ -1442,11 +1320,6 @@ "@sendAsText": { "type": "String" }, - "sendOriginal": "Poslať originál", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Poslať video", "@sendVideo": { "type": "String", @@ -1454,4 +1327,4 @@ }, "importNow": "Importovať teraz", "@importNow": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_sl.arb b/lib/l10n/intl_sl.arb index 4bf5f58a..4c139819 100644 --- a/lib/l10n/intl_sl.arb +++ b/lib/l10n/intl_sl.arb @@ -131,11 +131,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Botova sporočila", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Prekliči", "@cancel": { "type": "String", @@ -303,8 +298,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Klepet je bil dodan v ta prostor", - "@chatHasBeenAddedToThisSpace": {}, "chats": "Klepeti", "@chats": { "type": "String", @@ -406,21 +399,6 @@ "type": "String", "placeholders": {} }, - "confirm": "Potrdi", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "Vsebuje prikazno ime", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Vsebuje uporabniško ime", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "archive": "Arhiv", "@archive": { "type": "String", @@ -467,18 +445,6 @@ "type": "String", "placeholders": {} }, - "badServerVersionsException": "Domači strežnik podpira različice Spec:\n{serverVersions}\nToda ta aplikacija podpira samo {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "changedTheChatNameTo": "{username} je spremenil ime klepeta v: '{chatname}'", "@changedTheChatNameTo": { "type": "String", @@ -525,11 +491,6 @@ "type": "String", "description": "Usage hint for the command /myroomnick" }, - "connect": "Povežite se", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt je bil povabljen v skupino", "@contactHasBeenInvitedToTheGroup": { "type": "String", @@ -603,33 +564,6 @@ "type": "String", "placeholders": {} }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "createdTheChat": "{username} je ustvaril klepet", "@createdTheChat": { "type": "String", @@ -656,4 +590,4 @@ "type": "String", "placeholders": {} } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_sq.arb b/lib/l10n/intl_sq.arb index 0967ef42..9e26dfee 100644 --- a/lib/l10n/intl_sq.arb +++ b/lib/l10n/intl_sq.arb @@ -1 +1 @@ -{} +{} \ No newline at end of file diff --git a/lib/l10n/intl_sr.arb b/lib/l10n/intl_sr.arb index 126b07a0..c78c2ec3 100644 --- a/lib/l10n/intl_sr.arb +++ b/lib/l10n/intl_sr.arb @@ -118,18 +118,6 @@ } } }, - "badServerVersionsException": "Домаћи сервер подржава верзије:\n{serverVersions}\nали ова апликација подржава само {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Забрани у ћаскању", "@banFromChat": { "type": "String", @@ -162,11 +150,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Поруке Бота", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Откажи", "@cancel": { "type": "String", @@ -468,31 +451,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Потврди", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Повежи се", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Особа је позвана у групу", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Садржи приказно име", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Садржи корисничко име", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Садржај је пријављен администраторима сервера", "@contentHasBeenReported": { "type": "String", @@ -567,33 +530,6 @@ } } }, - "dateWithoutYear": "{day} {month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day} {month} {year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Ово ће деактивирати ваш кориснички налог. Не може се повратити! Сигурни сте?", "@deactivateAccountWarning": { "type": "String", @@ -699,11 +635,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Морате да изаберете скраћеницу и слику за емоти!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "празно ћаскање", "@emptyChat": { "type": "String", @@ -753,11 +684,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Унесите свој домаћи сервер", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "Све је спремно!", "@everythingReady": { "type": "String", @@ -798,11 +724,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Иди у нову собу", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Група", "@group": { "type": "String", @@ -874,11 +795,6 @@ "type": "String", "placeholders": {} }, - "identity": "Идентитет", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Игнориши", "@ignore": { "type": "String", @@ -940,11 +856,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Позивнице за мене", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} вас позива у FluffyChat. \n1. Инсталирајте FluffyChat: https://fluffychat.im \n2. Региструјте се или пријавите \n3. Отворите везу позивнице: {link}", "@inviteText": { "type": "String", @@ -1024,11 +935,6 @@ "type": "String", "placeholders": {} }, - "license": "Лиценца", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "светли", "@lightTheme": { "type": "String", @@ -1072,11 +978,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Измене чланова", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Спомени", "@mention": { "type": "String", @@ -1172,11 +1073,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Обавештења укључена за овај налог", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} корисника куца…", "@numUsersTyping": { "type": "String", @@ -1266,11 +1162,6 @@ "type": "String", "placeholders": {} }, - "people": "Људи", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Избор слике", "@pickImage": { "type": "String", @@ -1290,11 +1181,6 @@ } } }, - "pleaseChoose": "Изаберите", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Изаберите код за пролаз", "@pleaseChooseAPasscode": { "type": "String", @@ -1388,11 +1274,6 @@ } } }, - "rejoin": "Поново се придружи", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Уклони", "@remove": { "type": "String", @@ -1412,11 +1293,6 @@ } } }, - "removeDevice": "Уклони уређај", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Уклони изгнанство", "@unbanFromChat": { "type": "String", @@ -1467,15 +1343,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "{username} прегледа", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Пошаљи", "@send": { "type": "String", @@ -1506,11 +1373,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Пошаљи оригинал", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Пошаљи видео", "@sendVideo": { "type": "String", @@ -1575,21 +1437,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "постави посебне емотије", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Поставља везу позивнице", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Одреди ниво дозволе", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Постави статус", "@setStatus": { "type": "String", @@ -1619,11 +1466,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Јединствена пријава", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Прескочи", "@skip": { "type": "String", @@ -1679,21 +1521,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Мењај омиљеност", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Мењај ућутканост", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Означи не/прочитано", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Превише упита. Покушајте касније!", "@tooManyRequestsWarning": { "type": "String", @@ -1760,15 +1587,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, other{непрочитаних ћаскања: {unreadCount}}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} и {count} корисника куцају…", "@userAndOthersAreTyping": { "type": "String", @@ -1893,11 +1711,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Тапета", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Упозорење!", "@warning": { "type": "String", @@ -1967,4 +1780,4 @@ "@repeatPassword": {}, "commandHint_cuddle": "Pošalji zagrljaj", "@commandHint_cuddle": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_sv.arb b/lib/l10n/intl_sv.arb index 1256a644..87f9ebd4 100644 --- a/lib/l10n/intl_sv.arb +++ b/lib/l10n/intl_sv.arb @@ -101,18 +101,6 @@ } } }, - "badServerVersionsException": "Hemservern stöjder Spec-versionen:\n{serverVersions}\nMen denna app stödjer enbart {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Bannlys från chatt", "@banFromChat": { "type": "String", @@ -140,11 +128,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Bot meddelanden", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Avbryt", "@cancel": { "type": "String", @@ -359,31 +342,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Bekräfta", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Anslut", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakten har blivit inbjuden till gruppen", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Innehåller visningsnamn", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Innehåller användarnamn", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Innehållet har rapporterats till server-admins", "@contentHasBeenReported": { "type": "String", @@ -453,33 +416,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Detta kommer att avaktivera ditt konto. Det här går inte att ångra! Är du säker?", "@deactivateAccountWarning": { "type": "String", @@ -580,11 +516,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Du måste välja en dekal-kod och en bild!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Tom chatt", "@emptyChat": { "type": "String", @@ -634,11 +565,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Ange din hemserver", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "extremeOffensive": "Extremt stötande", "@extremeOffensive": { "type": "String", @@ -740,11 +666,6 @@ "type": "String", "placeholders": {} }, - "identity": "Identitet", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Ignorera", "@ignore": { "type": "String", @@ -806,11 +727,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Inbjudning till mig", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} bjöd in dig till FluffyChat.\n1. Besök fluffychat.im och installera appen\n2. Registrera dig eller logga in\n3. Öppna inbjudningslänk:\n {link}", "@inviteText": { "type": "String", @@ -890,11 +806,6 @@ "type": "String", "placeholders": {} }, - "license": "Licens", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Ljust", "@lightTheme": { "type": "String", @@ -938,11 +849,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Medlemsändringar", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Nämn", "@mention": { "type": "String", @@ -1033,11 +939,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Aviseringar är påslaget för detta konto", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} användare skriver…", "@numUsersTyping": { "type": "String", @@ -1219,11 +1120,6 @@ } } }, - "rejoin": "Återanslut", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Ta bort", "@remove": { "type": "String", @@ -1243,11 +1139,6 @@ } } }, - "removeDevice": "Ta bort enhet", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Ta bort chatt-blockering", "@unbanFromChat": { "type": "String", @@ -1288,15 +1179,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Sedd av {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Skicka", "@send": { "type": "String", @@ -1327,11 +1209,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Skicka orginal", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Skicka video", "@sendVideo": { "type": "String", @@ -1391,21 +1268,6 @@ } } }, - "setCustomEmotes": "Ställ in anpassade dekaler", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Ställ in inbjudningslänk", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Ställ in behörighetsnivå", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Ställ in status", "@setStatus": { "type": "String", @@ -1485,21 +1347,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Växla favorit", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Växla tystad", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Markera läst/oläst", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "För många förfrågningar. Vänligen försök senare!", "@tooManyRequestsWarning": { "type": "String", @@ -1561,15 +1408,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{en oläst chatt} other{{unreadCount} olästa chattar}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} och {count} andra skriver…", "@userAndOthersAreTyping": { "type": "String", @@ -1689,11 +1527,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Bakgrund:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Varning!", "@warning": { "type": "String", @@ -1770,7 +1603,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Chatt har lagts till i detta utrymme", "chatBackup": "Chatt backup", "@chatBackup": { "type": "String", @@ -1863,11 +1695,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Gå till det nya rummet", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "fontSize": "Textstorlek", "@fontSize": { "type": "String", @@ -1968,16 +1795,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Var god välj", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, - "people": "Människor", - "@people": { - "type": "String", - "placeholders": {} - }, "or": "Eller", "@or": { "type": "String", @@ -2023,11 +1840,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Skicka klistermärke", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendAsText": "Skicka som text", "@sendAsText": { "type": "String" @@ -2099,18 +1911,12 @@ "addToBundle": "Utöka paket", "bundleName": "Paketnamn", "serverRequiresEmail": "Servern behöver validera din e-postadress för registrering.", - "singlesignon": "Single Sign On", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "unverified": "Ej verifierad", "messageInfo": "Meddelandeinformation", "messageType": "Meddelandetyp", "time": "Tid", "sender": "Avsändare", "removeFromSpace": "Ta bort från utrymme", - "addToSpaceDescription": "Välj ett utrymme som chatten skall läggas till i.", "start": "Starta", "openGallery": "Öppna galleri", "repeatPassword": "Upprepa lösenord", @@ -2120,22 +1926,7 @@ "type": "String", "description": "Usage hint for the command /clearcache" }, - "openVideoCamera": "Aktivera kamera för video", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "link": "Länk", - "publish": "Publicera", - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "reportUser": "Rapportera användare", "openChat": "Öppna Chatt", "sendOnEnter": "Skicka med Enter", @@ -2165,27 +1956,6 @@ "pinMessage": "Fäst i rum", "confirmEventUnpin": "Är du säker på att händelsen inte längre skall vara fastnålad?", "experimentalVideoCalls": "Experimentella videosamtal", - "switchToAccount": "Byt till konto {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Nästa konto", - "previousAccount": "Föregående konto", - "emailOrUsername": "Användarnamn eller e-postadress", - "addWidget": "Lägg till widget", - "widgetVideo": "Video", - "widgetEtherpad": "Anteckning", - "widgetCustom": "Anpassad", - "widgetName": "Namn", - "widgetUrlError": "Detta är inte en giltig URL.", - "errorAddingWidget": "Ett fel uppstod när widgeten skulle läggas till.", - "widgetJitsi": "Jitsi-möte", - "widgetNameError": "Vänligen ange ett visningsnamn.", "storeSecurlyOnThisDevice": "Lagra säkert på denna enhet", "youJoinedTheChat": "Du gick med i chatten", "youAcceptedTheInvitation": "👍 Du accepterade inbjudan", @@ -2208,7 +1978,6 @@ }, "commandHint_markasgroup": "Märk som grupp", "recoveryKeyLost": "Borttappad återställningsnyckel?", - "indexedDbErrorTitle": "Problem med privat läge", "youHaveWithdrawnTheInvitationFor": "Du har återkallat inbjudan till {user}", "@youHaveWithdrawnTheInvitationFor": { "placeholders": { @@ -2238,19 +2007,9 @@ }, "dehydrate": "Exportera sessionen och rensa enheten", "dehydrateWarning": "Denna åtgärd kan inte ångras. Försäkra dig om att backupen är i säkert förvar.", - "dehydrateTor": "TOR-användare: Exportera session", - "hydrateTor": "TOR-användare: Importera session från tidigare export", - "hydrateTorLong": "Exporterade du sessionen när du senast använde TOR? Importera den enkelt och fortsätt chatta.", "recoveryKey": "Återställningsnyckel", - "separateChatTypes": "Separata direktchattar och grupper", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, - "startFirstChat": "Starta din första chatt", "pleaseEnterRecoveryKeyDescription": "Ange din återställningsnyckel från en tidigare session för att låsa upp äldre meddelanden. Din återställningsnyckel är INTE ditt lösenord.", "encryptThisChat": "Kryptera denna chatt", - "dehydrateTorLong": "TOR-användare rekommenderas att exportera sessionen innan fönstret stängs.", "noBackupWarning": "Varning! Om du inte aktiverar säkerhetskopiering av chattar så tappar du åtkomst till krypterade meddelanden. Det är rekommenderat att du aktiverar säkerhetskopiering innan du loggar ut.", "noOtherDevicesFound": "Inga andra enheter hittades", "disableEncryptionWarning": "Av säkerhetsskäl kan du inte stänga av kryptering i en chatt där det tidigare aktiverats.", @@ -2265,10 +2024,8 @@ } } }, - "pleaseEnterRecoveryKey": "Ange din återställningsnyckel:", "commandHint_markasdm": "Märk som rum för direktmeddelanden för det givante Matrix ID", "user": "Användare", - "indexedDbErrorLong": "Meddelandelagring är tyvärr inte aktiverat i privat läge som standard.\nGå till\n - about:config\n - sätt dom.indexedDB.privateBrowsing.enabled till true\nAnnars går det inte att använda FluffyChat.", "storeInSecureStorageDescription": "Lagra återställningsnyckeln på säker plats på denna enhet.", "storeInAppleKeyChain": "Lagra i Apples nyckelkedja (KeyChain)", "foregroundServiceRunning": "Denna avisering visas när förgrundstjänsten körs.", @@ -2285,7 +2042,6 @@ "noKeyForThisMessage": "Detta kan hända om meddelandet skickades innan du loggade in på ditt konto i den här enheten.\n\nDet kan också vara så att avsändaren har blockerat din enhet eller att något gick fel med internetanslutningen.\n\nKan du läsa meddelandet i en annan session? I sådana fall kan du överföra meddelandet från den sessionen! Gå till Inställningar > Enhet och säkerställ att dina enheter har verifierat varandra. När du öppnar rummet nästa gång och båda sessionerna är i förgrunden, så kommer nycklarna att överföras automatiskt.\n\nVill du inte förlora nycklarna vid utloggning eller när du byter enhet? Säkerställ att du har aktiverat säkerhetskopiering för chatten i inställningarna.", "fileIsTooBigForServer": "Gick inte att skicka! Servern stödjer endast bilagor upp till{max}.", "deviceKeys": "Enhetsnycklar:", - "enterSpace": "Gå till utrymme", "commandHint_googly": "Skicka några googly ögon", "commandHint_cuddle": "Skicka en omfamning", "commandHint_hug": "Skicka en kram", @@ -2336,26 +2092,9 @@ }, "saveKeyManuallyDescription": "Spara nyckeln manuellt genom att aktivera dela-funktionen eller urklippshanteraren på enheten.", "storeInAndroidKeystore": "Lagra i Androids nyckellagring (KeyStore)", - "callingPermissions": "Samtalsbehörighet", - "callingAccount": "Samtalskonto", - "callingAccountDetails": "Tillåt FluffyChat att använda Androids ring-app.", - "appearOnTop": "Visa ovanpå", - "appearOnTopDetails": "Tillåt att appen visas ovanpå (behövs inte om du redan har FluffyChat konfigurerat som ett samtalskonto)", - "otherCallingPermissions": "Mikrofon, kamera och andra behörigheter för FluffyChat", "whyIsThisMessageEncrypted": "Varför kan inte detta meddelande läsas?", "newGroup": "Ny grupp", - "enterRoom": "Gå till rummet", "allSpaces": "Alla utrymmen", - "numChats": "{number} chattar", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Göm oviktiga tillståndshändelser", "doNotShowAgain": "Visa inte igen", "wasDirectChatDisplayName": "Tom chatt (var {oldDisplayName})", "@wasDirectChatDisplayName": { @@ -2379,11 +2118,6 @@ } } }, - "allRooms": "Alla gruppchattar", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "reportErrorDescription": "😭 Åh nej. Något gick fel. Om du vill ian du rapportera denna bugg till utvecklarna.", "setColorTheme": "Välj färgtema:", "banUserDescription": "Användaren kommer bannlysas från chatten och kommer inte kunna gå med i chatten igen tills bannlysningen avslutas.", @@ -2395,7 +2129,6 @@ "pushNotificationsNotAvailable": "Aviseringar är inte tillgängligt", "invalidServerName": "Ogiltigt servernamn", "chatPermissions": "Chatt-behörigheter", - "signInWithPassword": "Logga in med lösenord", "makeAdminDescription": "När du gör denna användare till administratör kommer du inte kunna ångra det eftersom de kommer ha samma behörigheter som du.", "setChatDescription": "Ändra chattens beskrivning", "importFromZipFile": "Importera från .zip-fil", @@ -2408,19 +2141,9 @@ } } }, - "signInWith": "Logga in med {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "optionalRedactReason": "(Frivilligt) Anledning till att ta bort det här meddelandet…", "archiveRoomDescription": "Den här chatten kommer flyttas till arkivet. Andra användare kommer kunna se att du har lämnat chatten.", "exportEmotePack": "Exportera Emote-pack som .zip", - "inviteContactToGroupQuestion": "Vill du bjuda in {contact} till chatten ”{groupName}”?", "redactedByBecause": "Borttaget av {username} på grund av: ”{reason}”", "@redactedByBecause": { "type": "String", @@ -2436,7 +2159,6 @@ "redactMessageDescription": "Meddelandet kommer tas bort för alla medlemmar i denna konversation. Detta kan inte ångras.", "invalidInput": "Ogiltig input!", "report": "rapportera", - "addChatDescription": "Lägg till en chattbeskrivning…", "hasKnocked": "{user} har knackat", "@hasKnocked": { "placeholders": { @@ -2458,7 +2180,6 @@ }, "sendTypingNotifications": "Skicka skrivnotifikationer", "inviteGroupChat": "📨 Gruppchattsinbjudan", - "invitePrivateChat": "📨 Privat chattinbjudan", "importEmojis": "Importera emojier", "noChatDescriptionYet": "Ingen chatt-beskrivning än.", "learnMore": "Lär dig mer", @@ -2466,7 +2187,6 @@ "chatDescriptionHasBeenChanged": "Chattbeskrivningen ändrades", "roomUpgradeDescription": "Chatten kommer då att återskapas med den nya rumversionen. Alla medlemmar kommer bli påminda om att de måste byta till den nya chatten. Du kan läsa mer om rumversioner på https://spec.matrix.org/latest/rooms/", "pleaseEnterANumber": "Vänligen ange ett nummer större än 0", - "profileNotFound": "Användaren kunde onte hittas på servern. Kanske är det ett anslutningsproblem eller så finns inte användaren.", "jump": "Hoppa", "shareInviteLink": "Dela inbjudningslänk", "emoteKeyboardNoRecents": "Nyligen använda emotes kommer dyka upp här…", @@ -2474,36 +2194,20 @@ "type": "String", "placeholders": {} }, - "setTheme": "Välj tema:", "replace": "Ersätt", - "pleaseTryAgainLaterOrChooseDifferentServer": "Vänligen försök igen eller välj en annan server.", "createGroup": "Skapa grupp", "kickUserDescription": "Användaren sparkas ut ur chatten men bannlyses inte. I offentliga chattar kan användaren gå med igen när som helst.", "importNow": "Importera nu", "invite": "Bjud in", - "databaseBuildErrorBody": "Kan inte bygga SQlite-databasen. Appen försöker använda den gamla databasen för nu. Vänligen rapportera problemet till utvecklarna här: {url}. Felmeddelandet är: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "blockListDescription": "Du kan blockera användare som stör dig. Du kommer inte få några meddelanden eller rum-inbjudningar från användarna på din personliga blocklista.", "createGroupAndInviteUsers": "Skapa en grupp och bjud in användare", "initAppError": "Ett problem skedde när appen initierades", "thisDevice": "Denna enhet:", - "startConversation": "Starta konversation", "publicSpaces": "Offentliga utrymmen", "blockedUsers": "Blockerade användare", "passwordIsWrong": "Det angivna lösenordet är fel", "pleaseEnterYourCurrentPassword": "Vänligen skriv ditt nuvarande lösenord", "groupCanBeFoundViaSearch": "Gruppen kan hittas genom sökning", - "publicLink": "Offentlig länk", "noUsersFoundWithQuery": "Tyvärr kunde ingen användare hittas med ”{query}”. Vänligen kontrollera om du gjort ett stavfel.", "@noUsersFoundWithQuery": { "type": "String", @@ -2516,12 +2220,10 @@ "block": "blockera", "nothingFound": "Inget hittades…", "yourGlobalUserIdIs": "Ditt globala användar-ID är: ", - "decline": "Neka", "newPassword": "Nytt lösenord", "passwordsDoNotMatch": "Lösenorden passar inte", "commandHint_sendraw": "Skicka rå json", "wrongRecoveryKey": "Tyvärr verkar detta inte vara den korrekta återställningsnyckeln.", - "subspace": "Underutrymme", "select": "Ange val", "sessionLostBody": "Din session är förlorad. Vänligen rapportera detta fel till utvecklarna här: {url}. Felmeddelandet är: {error}", "@sessionLostBody": { @@ -2557,14 +2259,6 @@ "databaseMigrationTitle": "Databasen är optimerad", "searchChatsRooms": "Sök efter #chattar, @användare…", "databaseMigrationBody": "Var vänlig vänta. Detta kan ta en stund.", - "youInvitedToBy": "📩 Du har blivit inbjuden via länk till:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "sendTypingNotificationsDescription": "Andra deltagare i en diskussion kan se när du skriver.", "formattedMessagesDescription": "Visa formaterat meddelandeinnehåll som fet stil med markdown.", "verifyOtherUser": "🔐 Verifiera användaren", @@ -2606,11 +2300,6 @@ } } }, - "presenceStyle": "Närvaro:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Visa statusmeddelanden från andra användare", "@presencesToggle": { "type": "String", @@ -2629,15 +2318,6 @@ } }, "incomingMessages": "Inkommande meddelanden", - "forwardMessageTo": "Vidarebefordra meddelandet till {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "verifyOtherUserDescription": "Om du verifierar en användare så kan du vara säker på vem du verkligen skriver till. 💪\n\nNär du påbörjar en verifiering så ser du och den andra användaren en popup-ruta i appen. I den rutan ser du ett antal tecken som du jämför med vad den andra användaren ser.\n\nDet bästa sättet att göra detta är att träffas fysiskt, eller genom att starta ett videosamtal. 👭", "verifyOtherDeviceDescription": "När du verifierar en enhet så kan era enheter utväxla nycklar, vilket förbättrar säkerheten. 💪 När du påbörjar en verifiering så ser du en popup-ruta på båda enheterna. I den rutan ser du ett antal tecken som du jämför med det som visas på den andra enheten. Det är bäst att ha båda enheterna till hands innan du påbörjar verifieringen. 🤳", "isReadyForKeyVerification": "{sender} är redo för nyckelverifiering", @@ -2653,7 +2333,6 @@ "stickers": "Klistermärken", "discover": "Upptäck", "ignoreUser": "Ignorera användare", - "normalUser": "Normal användare", "aboutHomeserver": "Om{homeserver}", "@aboutHomeserver": { "type": "String", @@ -2666,18 +2345,6 @@ "commandHint_roomupgrade": "Uppgradera detta rum till den givna rumsversionen", "appLockDescription": "Lås appen när den inte används med en pin-kod", "swipeRightToLeftToReply": "Svep från höger till vänster för att svara", - "countChatsAndCountParticipants": "{chats} chattar och {participants} deltagare", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Inga fler chattar hittades...", "noChatsFoundHere": "Inga chattar kunde hittas här ännu. Starta en ny chatt med någon genom att använda knappen nedan. ⤵️", "unread": "Olästa", @@ -2701,20 +2368,14 @@ "calls": "Samtal", "customEmojisAndStickers": "Egna emojis och klistermärken", "customEmojisAndStickersBody": "Lägg till eller dela egna emojis eller klistermärken som kan användas i alla chattar.", - "setCustomPermissionLevel": "Ställ in särskild behörighetsnivå", "alwaysUse24HourFormat": "falskt", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, - "setPermissionsLevelDescription": "Välj en fördefinierad roll nedan eller skriv in en särskild behörighetsnivå mellan 0 och 100.", - "joinedChats": "Anslutna chattar", "hideRedactedMessages": "Dölj tillbakatagna meddelanden", "hideRedactedMessagesBody": "Om någon tar tillbaka ett meddelande, kommer meddelandet inte längre vara synligt i chatten.", "hideInvalidOrUnknownMessageFormats": "Dölj ogiltiga eller okända meddelande-format", - "hideMemberChangesInPublicChats": "Dölj användarändringar i offentliga chattar", - "hideMemberChangesInPublicChatsBody": "Visar inte om någon går med eller lämnar ett offentligt rum i chattens tidslinje för att öka läsbarheten.", "overview": "Översikt", - "notifyMeFor": "Avisera mig för", "passwordRecoverySettings": "Lösenordsåterställnings-inställningar", "sendImages": "Skicka {count} bild", "@sendImages": { @@ -2744,15 +2405,6 @@ }, "usersMustKnock": "Användare måste knacka", "noOneCanJoin": "Ingen kan gå med", - "userWouldLikeToChangeTheChat": "{user}vill gå med i chatten.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Ingen offentlig länk har skapats ännu", "knock": "Knacka", "knocking": "Knackar", "chatCanBeDiscoveredViaSearchOnServer": "Chatten kan upptäckas via sökfunktionen på {server}", @@ -2766,7 +2418,6 @@ }, "publicChatAddresses": "Offentlig chatt-adress", "createNewAddress": "Skapa ny adress", - "userRole": "Användarroll", "searchIn": "Sök i chatten \"{chat}\"...", "@searchIn": { "type": "String", @@ -2854,9 +2505,6 @@ "changelog": "Ändringslogg", "sendCanceled": "Skickande avbröts", "loginWithMatrixId": "Logga in med Matrix-ID", - "discoverHomeservers": "Upptäck hemservrar", - "whatIsAHomeserver": "Vad är en hemserver?", - "homeserverDescription": "All din data lagras på hemservern, precis som en mailtjänst. Du kan välja vilken hemserver du vill använda, medans du fortfarande kan kommunicera med vemsomhelst. Lär dig met på https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "Verkar inte vara en kompatibel hemserver. Fel URL?", "calculatingFileSize": "Beräknar filstorlek...", "prepareSendingAttachment": "Förbered skickar bilaga...", @@ -2922,7 +2570,6 @@ "appWantsToUseForLoginDescription": "Du tillåter härmed appen och hemsidan att dela information om dig.", "open": "Öppna", "waitingForServer": "Väntar på server...", - "appIntroduction": "FluffyChat låter dig chatta med vänner över olika tjänster. Lär dig mer på https://matrix.org eller tryck *Fortsätt*.", "newChatRequest": "📩 Ny chatt förfrågan", "contentNotificationSettings": "Innehållsnotis-inställningar", "generalNotificationSettings": "Allmänna notis-inställningar", @@ -2998,4 +2645,4 @@ "logs": "Loggar", "signIn": "Logga in", "createNewAccount": "Skapa nytt konto" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_ta.arb b/lib/l10n/intl_ta.arb index 3484d7bc..7c667352 100644 --- a/lib/l10n/intl_ta.arb +++ b/lib/l10n/intl_ta.arb @@ -30,11 +30,6 @@ "@globalChatId": {}, "accessAndVisibility": "அணுகல் மற்றும் தெரிவுநிலை", "@accessAndVisibility": {}, - "enterYourHomeserver": "உங்கள் ஓம்சர்வரை உள்ளிடவும்", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "onlineKeyBackupEnabled": "நிகழ்நிலை விசை காப்புப்பிரதி இயக்கப்பட்டது", "@onlineKeyBackupEnabled": { "type": "String", @@ -73,23 +68,10 @@ } } }, - "startConversation": "உரையாடலைத் தொடங்குங்கள்", - "@startConversation": {}, "commandHint_sendraw": "மூல சாதொபொகு ஐ அனுப்புங்கள்", "@commandHint_sendraw": {}, "passwordIsWrong": "நீங்கள் உள்ளிட்ட கடவுச்சொல் தவறு", "@passwordIsWrong": {}, - "publicLink": "பொது இணைப்பு", - "@publicLink": {}, - "forwardMessageTo": "செய்தியை {roomName}க்கு அனுப்பவா?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "completedKeyVerification": "{sender} நிறைவு செய்யப்பட்ட விசை சரிபார்ப்பு", "@completedKeyVerification": { "type": "String", @@ -132,8 +114,6 @@ } } }, - "widgetName": "பெயர்", - "@widgetName": {}, "chooseAStrongPassword": "வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க", "@chooseAStrongPassword": { "type": "String", @@ -180,11 +160,6 @@ } } }, - "identity": "முற்றொருமை", - "@identity": { - "type": "String", - "placeholders": {} - }, "removedBy": "{username} ஆல் அகற்றப்பட்டது", "@removedBy": { "type": "String", @@ -208,11 +183,6 @@ "type": "String", "placeholders": {} }, - "license": "உரிமம்", - "@license": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "குழுவிற்கு தொடர்பு அழைக்கப்பட்டுள்ளது", "@contactHasBeenInvitedToTheGroup": { "type": "String", @@ -223,8 +193,6 @@ "type": "String", "placeholders": {} }, - "widgetNameError": "காட்சி பெயரை வழங்கவும்.", - "@widgetNameError": {}, "select": "தேர்ந்தெடு", "@select": {}, "compareEmojiMatch": "தயவுசெய்து ஈமோசிகளை ஒப்பிடுக", @@ -232,18 +200,6 @@ "type": "String", "placeholders": {} }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "fromTheInvitation": "அழைப்பிலிருந்து", "@fromTheInvitation": { "type": "String", @@ -400,8 +356,6 @@ "@commandHint_googly": {}, "commandHint_cuddle": "ஒரு கசப்பு அனுப்பவும்", "@commandHint_cuddle": {}, - "startFirstChat": "உங்கள் முதல் அரட்டையைத் தொடங்கவும்", - "@startFirstChat": {}, "importEmojis": "ஈமோசிகளை இறக்குமதி செய்யுங்கள்", "@importEmojis": {}, "exportEmotePack": "எமோட் பேக் .zip என ஏற்றுமதி செய்யுங்கள்", @@ -468,15 +422,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 unread chat} other{{unreadCount} unread chats}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "verifyTitle": "பிற கணக்கை சரிபார்க்கிறது", "@verifyTitle": { "type": "String", @@ -516,8 +461,6 @@ "type": "String", "placeholders": {} }, - "widgetUrlError": "இது சரியான முகவரி அல்ல.", - "@widgetUrlError": {}, "commandHint_invite": "கொடுக்கப்பட்ட பயனரை இந்த அறைக்கு அழைக்கவும்", "@commandHint_invite": { "type": "String", @@ -543,11 +486,6 @@ }, "description": "State that {command} is not a valid /command." }, - "inviteForMe": "எனக்கு அழைக்கவும்", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "moderator": "மதிப்பீட்டாளர்", "@moderator": { "type": "String", @@ -580,8 +518,6 @@ }, "sendOnEnter": "Enter ஐ அனுப்பவும்", "@sendOnEnter": {}, - "pleaseEnterRecoveryKey": "உங்கள் மீட்பு விசையை உள்ளிடவும்:", - "@pleaseEnterRecoveryKey": {}, "dehydrate": "ஏற்றுமதி அமர்வு மற்றும் சாதனத்தை துடைக்கவும்", "@dehydrate": {}, "ok": "சரி", @@ -674,8 +610,6 @@ "type": "String", "placeholders": {} }, - "enterRoom": "அறையை உள்ளிடவும்", - "@enterRoom": {}, "report": "அறிக்கை", "@report": {}, "verifyOtherDevice": "Sevice பிற சாதனத்தை சரிபார்க்கவும்", @@ -689,11 +623,6 @@ } } }, - "toggleFavorite": "பிடித்ததை மாற்றவும்", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "userSentUnknownEvent": "{username} ஒரு {type} நிகழ்வை அனுப்பியது", "@userSentUnknownEvent": { "type": "String", @@ -728,16 +657,8 @@ }, "pinMessage": "அறைக்கு முள்", "@pinMessage": {}, - "addWidget": "விட்செட்டைச் சேர்க்கவும்", - "@addWidget": {}, - "widgetEtherpad": "உரை குறிப்பு", - "@widgetEtherpad": {}, - "widgetCustom": "தனிப்பயன்", - "@widgetCustom": {}, "unlockOldMessages": "பழைய செய்திகளைத் திறக்கவும்", "@unlockOldMessages": {}, - "appearOnTop": "மேலே தோன்றும்", - "@appearOnTop": {}, "serverLimitReached": "சேவையக வரம்பு அடைந்தது! {seconds} விநாடிகள் காத்திருக்கிறது ...", "@serverLimitReached": { "type": "integer", @@ -765,15 +686,6 @@ "@createGroup": {}, "editBundlesForAccount": "இந்த கணக்கிற்கான மூட்டைகளைத் திருத்தவும்", "@editBundlesForAccount": {}, - "seenByUser": "{username} ஆல் பார்த்தது", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "unpin": "மூள்நீக்கு", "@unpin": { "type": "String", @@ -781,8 +693,6 @@ }, "emojis": "ஈமோசிகள்", "@emojis": {}, - "indexedDbErrorTitle": "தனியார் பயன்முறை சிக்கல்கள்", - "@indexedDbErrorTitle": {}, "jumpToLastReadMessage": "கடைசி வாசிப்பு செய்திக்கு செல்லவும்", "@jumpToLastReadMessage": {}, "commandHint_markasgroup": "குழுவாக குறி", @@ -813,15 +723,6 @@ } } }, - "videoWithSize": "வீடியோ ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "readUpToHere": "இங்கே படிக்கவும்", "@readUpToHere": {}, "chatDescriptionHasBeenChanged": "அரட்டை விளக்கம் மாற்றப்பட்டது", @@ -836,8 +737,6 @@ "type": "String", "placeholders": {} }, - "widgetVideo": "ஒளிதோற்றம்", - "@widgetVideo": {}, "redactedAnEvent": "{username} ஒரு நிகழ்வை மறுவடிவமைத்தது", "@redactedAnEvent": { "type": "String", @@ -858,11 +757,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "மார்க் படிக்க/படிக்கவில்லை", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "பல கோரிக்கைகள். தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும்!", "@tooManyRequestsWarning": { "type": "String", @@ -878,24 +772,10 @@ "type": "String", "placeholders": {} }, - "addToSpaceDescription": "இந்த அரட்டையைச் சேர்க்க ஒரு இடத்தைத் தேர்ந்தெடுக்கவும்.", - "@addToSpaceDescription": {}, - "errorAddingWidget": "விட்செட்டைச் சேர்ப்பதில் பிழை.", - "@errorAddingWidget": {}, - "youInvitedToBy": "In இணைப்பு வழியாக நீங்கள் அழைக்கப்பட்டுள்ளீர்கள்:\n {alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "storeSecurlyOnThisDevice": "இந்த சாதனத்தில் பாதுகாப்பாக சேமிக்கவும்", "@storeSecurlyOnThisDevice": {}, "screenSharingTitle": "திரை பகிர்வு", "@screenSharingTitle": {}, - "appearOnTopDetails": "பயன்பாடு மேலே தோன்ற அனுமதிக்கிறது (நீங்கள் ஏற்கனவே ஒரு அழைப்பு கணக்காக பஞ்சுபோன்ற அமைப்பைக் கொண்டிருந்தால் தேவையில்லை)", - "@appearOnTopDetails": {}, "newGroup": "புதிய குழு", "@newGroup": {}, "noOtherDevicesFound": "வேறு சாதனங்கள் எதுவும் கிடைக்கவில்லை", @@ -1024,8 +904,6 @@ }, "time": "நேரம்", "@time": {}, - "publish": "வெளியிடுங்கள்", - "@publish": {}, "openChat": "திறந்த அரட்டை", "@openChat": {}, "markAsRead": "படித்தபடி குறி", @@ -1052,24 +930,10 @@ "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "சோதனை வீடியோ அழைப்புகள்", "@experimentalVideoCalls": {}, - "emailOrUsername": "மின்னஞ்சல் அல்லது பயனர்பெயர்", - "@emailOrUsername": {}, - "previousAccount": "முந்தைய கணக்கு", - "@previousAccount": {}, "noOneCanJoin": "யாரும் சேர முடியாது", "@noOneCanJoin": {}, - "userWouldLikeToChangeTheChat": "{user} அரட்டையில் சேர விரும்புகிறார்.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "newSpace": "புதிய இடம்", "@newSpace": {}, - "enterSpace": "இடத்தை உள்ளிடவும்", - "@enterSpace": {}, "wasDirectChatDisplayName": "வெற்று அரட்டை ({oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -1083,8 +947,6 @@ "@openLinkInBrowser": {}, "reportErrorDescription": "😭 ஓ இல்லை. ஏதோ தவறு நடந்தது. நீங்கள் விரும்பினால், இந்த பிழையை டெவலப்பர்களிடம் புகாரளிக்கலாம்.", "@reportErrorDescription": {}, - "setTheme": "கருப்பொருள் அமைக்கவும்:", - "@setTheme": {}, "invite": "அழைக்கவும்", "@invite": {}, "wrongPinEntered": "தவறான முள் நுழைந்தது! {seconds} விநாடிகளில் மீண்டும் முயற்சிக்கவும் ...", @@ -1206,16 +1068,6 @@ "type": "String", "placeholders": {} }, - "connect": "இணை", - "@connect": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "பயனர்பெயர் உள்ளது", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "copiedToClipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்டது", "@copiedToClipboard": { "type": "String", @@ -1327,10 +1179,6 @@ }, "dehydrateWarning": "இந்த செயலை செயல்தவிர்க்க முடியாது. காப்புப்பிரதி கோப்பை பாதுகாப்பாக சேமித்து வைக்கவும்.", "@dehydrateWarning": {}, - "dehydrateTor": "டோர் பயனர்கள்: ஏற்றுமதி அமர்வு", - "@dehydrateTor": {}, - "hydrateTor": "டோர் பயனர்கள்: இறக்குமதி அமர்வு ஏற்றுமதி", - "@hydrateTor": {}, "loadMore": "மேலும் ஏற்றவும்…", "@loadMore": { "type": "String", @@ -1341,11 +1189,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "உறுப்பினர் மாற்றங்கள்", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "messagesStyle": "செய்திகள்:", "@messagesStyle": {}, "needPantalaimonWarning": "இப்போதைக்கு இறுதி முதல் இறுதி குறியாக்கத்தைப் பயன்படுத்த உங்களுக்கு பாண்டலாயமன் தேவை என்பதை நினைவில் கொள்க.", @@ -1385,11 +1228,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "இந்த கணக்கிற்கு அறிவிப்புகள் இயக்கப்பட்டன", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} பயனர்கள் தட்டச்சு செய்கிறார்கள்…", "@numUsersTyping": { "type": "String", @@ -1409,11 +1247,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "வீடியோவுக்கு கேமரா திறக்கவும்", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "addAccount": "கணக்கைச் சேர்க்கவும்", "@addAccount": {}, "openInMaps": "வரைபடங்களில் திறந்திருக்கும்", @@ -1492,11 +1325,6 @@ } } }, - "setPermissionsLevel": "இசைவு அளவை அமைக்கவும்", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "settings": "அமைப்புகள்", "@settings": { "type": "String", @@ -1550,11 +1378,6 @@ "type": "String", "placeholders": {} }, - "people": "மக்கள்", - "@people": { - "type": "String", - "placeholders": {} - }, "youHaveBeenBannedFromThisChat": "இந்த அரட்டையிலிருந்து உங்களுக்கு தடை விதிக்கப்பட்டுள்ளது", "@youHaveBeenBannedFromThisChat": { "type": "String", @@ -1579,8 +1402,6 @@ } } }, - "addChatDescription": "அரட்டை விளக்கத்தைச் சேர்க்கவும் ...", - "@addChatDescription": {}, "addToSpace": "விண்வெளியில் சேர்க்கவும்", "@addToSpace": {}, "commandHint_hug": "கட்டிப்பிடிக்கவும்", @@ -1650,18 +1471,6 @@ } } }, - "badServerVersionsException": "ஓம்சர்வர் ச்பெக் பதிப்புகளை ஆதரிக்கிறது:\n {serverVersions}\n ஆனால் இந்த பயன்பாடு {supportedVersions} மட்டுமே ஆதரிக்கிறது", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "noChatsFoundHere": "இங்கே அரட்டைகள் எதுவும் காணப்படவில்லை. கீழே உள்ள பொத்தானைப் பயன்படுத்தி ஒருவருடன் புதிய அரட்டையைத் தொடங்கவும். ⤵️", "@noChatsFoundHere": {}, "space": "இடைவெளி", @@ -1671,11 +1480,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "போட் செய்திகள்", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "changedTheChatNameTo": "{username} அரட்டை பெயரை மாற்றியது: '{chatname}'", "@changedTheChatNameTo": { "type": "String", @@ -1762,8 +1566,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "இந்த இடத்தில் அரட்டை சேர்க்கப்பட்டுள்ளது", - "@chatHasBeenAddedToThisSpace": {}, "commandHint_markasdm": "கொடுக்கப்பட்ட மேட்ரிக்சிற்கான நேரடி செய்தி அறையாக குறிக்கவும்", "@commandHint_markasdm": {}, "commandHint_ban": "கொடுக்கப்பட்ட பயனரை இந்த அறையிலிருந்து தடை செய்யுங்கள்", @@ -1795,11 +1597,6 @@ "@commandInvalid": { "type": "String" }, - "confirm": "உறுதிப்படுத்தவும்", - "@confirm": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "உள்ளடக்கம் சேவையக நிர்வாகிகளுக்கு தெரிவிக்கப்பட்டுள்ளது", "@contentHasBeenReported": { "type": "String", @@ -1819,21 +1616,6 @@ "type": "String", "placeholders": {} }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "இது உங்கள் பயனர் கணக்கை செயலிழக்கச் செய்யும். இதை செயல்தவிர்க்க முடியாது! நீங்கள் உறுதியாக இருக்கிறீர்களா?", "@deactivateAccountWarning": { "type": "String", @@ -1859,11 +1641,6 @@ "type": "String", "placeholders": {} }, - "allRooms": "அனைத்து குழு அரட்டைகளும்", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "displaynameHasBeenChanged": "காட்சி பெயர் மாற்றப்பட்டுள்ளது", "@displaynameHasBeenChanged": { "type": "String", @@ -1912,11 +1689,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "நீங்கள் ஒரு எமோட் சார்ட்கோட் மற்றும் ஒரு படத்தை எடுக்க வேண்டும்!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "enableEmotesGlobally": "உலகளவில் எமோட் பேக்கை இயக்கவும்", "@enableEmotesGlobally": { "type": "String", @@ -1972,11 +1744,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "புதிய அறைக்குச் செல்லுங்கள்", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "குழு", "@group": { "type": "String", @@ -2003,8 +1770,6 @@ }, "block": "தொகுதி", "@block": {}, - "inviteContactToGroupQuestion": "\"{groupName}\" அரட்டைக்கு {contact} ஐ அழைக்க விரும்புகிறீர்களா?", - "@inviteContactToGroupQuestion": {}, "inviteContactToGroup": "{groupName} க்கு தொடர்பை அழை", "@inviteContactToGroup": { "type": "String", @@ -2054,10 +1819,6 @@ "type": "String", "placeholders": {} }, - "dehydrateTorLong": "TOR பயனர்களுக்கு, சாளரத்தை மூடுவதற்கு முன் அமர்வை ஏற்றுமதி செய்ய பரிந்துரைக்கப்படுகிறது.", - "@dehydrateTorLong": {}, - "hydrateTorLong": "உங்கள் அமர்வை கடைசியாக டோரில் ஏற்றுமதி செய்தீர்களா? விரைவாக அதை இறக்குமதி செய்து அரட்டையடிக்கவும்.", - "@hydrateTorLong": {}, "hydrate": "காப்பு கோப்பிலிருந்து மீட்டமைக்கவும்", "@hydrate": {}, "locationDisabledNotice": "இருப்பிட சேவைகள் முடக்கப்பட்டுள்ளன. தயவுசெய்து உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள அவர்களுக்கு உதவவும்.", @@ -2128,14 +1889,8 @@ "type": "String", "placeholders": {} }, - "hideMemberChangesInPublicChats": "பொது அரட்டைகளில் உறுப்பினர் மாற்றங்களை மறைக்கவும்", - "@hideMemberChangesInPublicChats": {}, - "hideMemberChangesInPublicChatsBody": "வாசிப்புத்திறனை மேம்படுத்த யாராவது ஒரு பொது அரட்டையில் சேர்ந்தால் அல்லது விட்டுவிட்டால் அரட்டை காலவரிசையில் காட்ட வேண்டாம்.", - "@hideMemberChangesInPublicChatsBody": {}, "overview": "கண்ணோட்டம்", "@overview": {}, - "notifyMeFor": "எனக்கு அறிவிக்கவும்", - "@notifyMeFor": {}, "passwordRecoverySettings": "கடவுச்சொல் மீட்பு அமைப்புகள்", "@passwordRecoverySettings": {}, "passwordRecovery": "கடவுச்சொல் மீட்பு", @@ -2143,11 +1898,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "தயவுசெய்து தேர்வு செய்யவும்", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "play": "{fileName} இயக்கு", "@play": { "type": "String", @@ -2218,11 +1968,6 @@ } } }, - "rejoin": "மீண்டும் சேரவும்", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "அரட்டையிலிருந்து தடையின்றி", "@unbanFromChat": { "type": "String", @@ -2261,16 +2006,6 @@ } } }, - "sendOriginal": "அசல் அனுப்பு", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "ச்டிக்கரை அனுப்பவும்", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "வீடியோ அனுப்பவும்", "@sendVideo": { "type": "String", @@ -2294,48 +2029,23 @@ } } }, - "separateChatTypes": "நேரடி அரட்டைகள் மற்றும் குழுக்களை பிரிக்கவும்", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "முதன்மையான மாற்றுப்பெயராக அமைக்கவும்", "@setAsCanonicalAlias": { "type": "String", "placeholders": {} }, - "setCustomEmotes": "தனிப்பயன் உணர்ச்சிகளை அமைக்கவும்", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "setChatDescription": "அரட்டை விளக்கத்தை அமைக்கவும்", "@setChatDescription": {}, - "setInvitationLink": "அழைப்பிதழ் இணைப்பை அமைக்கவும்", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "share": "பங்கு", "@share": { "type": "String", "placeholders": {} }, - "presenceStyle": "இருப்பு:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "பிற பயனர்களிடமிருந்து நிலை செய்திகளைக் காட்டு", "@presencesToggle": { "type": "String", "placeholders": {} }, - "singlesignon": "ஒற்றை அடையாளம்", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "தவிர்", "@skip": { "type": "String", @@ -2422,11 +2132,6 @@ "@sender": {}, "openGallery": "திறந்த கேலரி", "@openGallery": {}, - "wallpaper": "வால்பேப்பர்:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "whyDoYouWantToReportThis": "இதை ஏன் புகாரளிக்க விரும்புகிறீர்கள்?", "@whyDoYouWantToReportThis": { "type": "String", @@ -2458,21 +2163,8 @@ "@pleaseEnterRecoveryKeyDescription": {}, "confirmEventUnpin": "நிகழ்வை நிரந்தரமாக அவிழ்ப்பது உறுதி?", "@confirmEventUnpin": {}, - "switchToAccount": "கணக்குக்கு மாறவும் {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "அடுத்த கணக்கு", - "@nextAccount": {}, "youJoinedTheChat": "நீங்கள் அரட்டையில் சேர்ந்தீர்கள்", "@youJoinedTheChat": {}, - "indexedDbErrorLong": "செய்தி சேமிப்பு துரதிர்ச்டவசமாக இயல்புநிலையாக தனிப்பட்ட பயன்முறையில் இயக்கப்படவில்லை.\n தயவுசெய்து பார்வையிடவும்\n - பற்றி: கட்டமைப்பு\n - கணம் dom.indexedDB.privateBrowsing.enabled பெறுநர் true\n இல்லையெனில், பஞ்சுபோன்றவை இயக்க முடியாது.", - "@indexedDbErrorLong": {}, "youAcceptedTheInvitation": "👍 நீங்கள் அழைப்பை ஏற்றுக்கொண்டீர்கள்", "@youAcceptedTheInvitation": {}, "youBannedUser": "நீங்கள் {user} தடை செய்தீர்கள்", @@ -2523,8 +2215,6 @@ } } }, - "noPublicLinkHasBeenCreatedYet": "பொது இணைப்பு இதுவரை உருவாக்கப்படவில்லை", - "@noPublicLinkHasBeenCreatedYet": {}, "knock": "தட்டவும்", "@knock": {}, "users": "பயனர்கள்", @@ -2549,25 +2239,6 @@ "@foregroundServiceRunning": {}, "screenSharingDetail": "உங்கள் திரையை FUFFYCHAT இல் பகிர்கிறீர்கள்", "@screenSharingDetail": {}, - "callingPermissions": "அழைப்பு அனுமதிகள்", - "@callingPermissions": {}, - "callingAccount": "அழைப்பு கணக்கு", - "@callingAccount": {}, - "callingAccountDetails": "சொந்த ஆண்ட்ராய்டு டயலர் பயன்பாட்டைப் பயன்படுத்த பஞ்சுபோன்றது அனுமதிக்கிறது.", - "@callingAccountDetails": {}, - "otherCallingPermissions": "மைக்ரோஃபோன், கேமரா மற்றும் பிற பஞ்சுபோன்ற அனுமதிகள்", - "@otherCallingPermissions": {}, - "numChats": "{number} அரட்டைகள்", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "முக்கியமற்ற மாநில நிகழ்வுகளை மறைக்கவும்", - "@hideUnimportantStateEvents": {}, "whyIsThisMessageEncrypted": "இந்த செய்தி ஏன் படிக்க முடியாதது?", "@whyIsThisMessageEncrypted": {}, "noKeyForThisMessage": "இந்த சாதனத்தில் உங்கள் கணக்கில் கையொப்பமிடுவதற்கு முன்பு செய்தி அனுப்பப்பட்டால் இது நிகழலாம்.\n\n அனுப்புநர் உங்கள் சாதனத்தைத் தடுத்துள்ளார் அல்லது இணைய இணைப்பில் ஏதேனும் தவறு ஏற்பட்டுள்ளது.\n\n மற்றொரு அமர்வில் செய்தியைப் படிக்க முடியுமா? அதிலிருந்து செய்தியை மாற்றலாம்! அமைப்புகள்> சாதனங்களுக்குச் சென்று, உங்கள் சாதனங்கள் ஒருவருக்கொருவர் சரிபார்த்துள்ளன என்பதை உறுதிப்படுத்தவும். அடுத்த முறை நீங்கள் அறையைத் திறக்கும்போது, இரண்டு அமர்வுகளும் முன்னணியில் இருக்கும்போது, விசைகள் தானாகவே அனுப்பப்படும்.\n\n வெளியேறும்போது அல்லது சாதனங்களை மாற்றும்போது விசைகளை இழக்க நீங்கள் விரும்பவில்லையா? அமைப்புகளில் அரட்டை காப்புப்பிரதியை நீங்கள் இயக்கியுள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.", @@ -2602,23 +2273,8 @@ } } }, - "pleaseTryAgainLaterOrChooseDifferentServer": "தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும் அல்லது வேறு சேவையகத்தைத் தேர்வுசெய்க.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "signInWith": "{provider} மூலம் உள்நுழையவும்", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "profileNotFound": "பயனரை சேவையகத்தில் காண முடியவில்லை. ஒரு இணைப்பு சிக்கல் இருக்கலாம் அல்லது பயனர் இல்லை.", - "@profileNotFound": {}, "inviteGroupChat": "📨 குழு அரட்டை அழைப்பு", "@inviteGroupChat": {}, - "invitePrivateChat": "Sative தனியார் அரட்டை அழைப்பு", - "@invitePrivateChat": {}, "invalidInput": "தவறான உள்ளீடு!", "@invalidInput": {}, "archiveRoomDescription": "அரட்டை காப்பகத்திற்கு நகர்த்தப்படும். மற்ற பயனர்கள் நீங்கள் அரட்டையை விட்டுவிட்டீர்கள் என்பதைக் காண முடியும்.", @@ -2657,18 +2313,6 @@ "@addChatOrSubSpace": {}, "initAppError": "பயன்பாட்டைத் தொடங்கும்போது பிழை ஏற்பட்டது", "@initAppError": {}, - "databaseBuildErrorBody": "SQlite தரவுத்தளத்தை உருவாக்க முடியவில்லை. ஆப்ஸ் தற்போதைக்கு மரபு தரவுத்தளத்தைப் பயன்படுத்த முயற்சிக்கிறது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "உங்கள் அமர்வு தொலைந்துவிட்டது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", "@sessionLostBody": { "type": "String", @@ -2788,8 +2432,6 @@ }, "changelog": "மாற்றபதிவு", "@changelog": {}, - "homeserverDescription": "உங்கள் எல்லா தரவுகளும் ஒரு மின்னஞ்சல் வழங்குநரைப் போலவே ஓம்சர்வரில் சேமிக்கப்படுகின்றன. நீங்கள் எந்த ஓம்சர்வரை பயன்படுத்த விரும்புகிறீர்கள் என்பதை நீங்கள் தேர்வு செய்யலாம், அதே நேரத்தில் நீங்கள் எல்லோரிடமும் தொடர்பு கொள்ளலாம். Https://matrix.org இல் மேலும் அறிக.", - "@homeserverDescription": {}, "calculatingFileSize": "கோப்பு அளவைக் கணக்கிடுகிறது ...", "@calculatingFileSize": {}, "compressVideo": "அமைக்கும் வீடியோ ...", @@ -2861,11 +2503,6 @@ "type": "String", "description": "Usage hint for the command /send" }, - "containsDisplayName": "காட்சி பெயரைக் கொண்டுள்ளது", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "removeFromBundle": "இந்த மூட்டையிலிருந்து அகற்றவும்", "@removeFromBundle": {}, "pushRules": "தள்ளி விதிகள்", @@ -2927,10 +2564,6 @@ }, "unsupportedAndroidVersionLong": "இந்த அம்சத்திற்கு புதிய ஆண்ட்ராய்டு பதிப்பு தேவைப்படுகிறது. புதுப்பிப்புகள் அல்லது பரம்பரை OS ஆதரவை சரிபார்க்கவும்.", "@unsupportedAndroidVersionLong": {}, - "widgetJitsi": "சிட்சி சந்திக்கிறார்", - "@widgetJitsi": {}, - "signInWithPassword": "கடவுச்சொல்லுடன் உள்நுழைக", - "@signInWithPassword": {}, "setColorTheme": "வண்ண கருப்பொருள் அமைக்கவும்:", "@setColorTheme": {}, "roomUpgradeDescription": "அரட்டை பின்னர் புதிய அறை பதிப்பில் மீண்டும் உருவாக்கப்படும். பங்கேற்பாளர்கள் அனைவருக்கும் புதிய அரட்டைக்கு மாற வேண்டும் என்று அறிவிக்கப்படும். அறை பதிப்புகள் பற்றி மேலும் அறிய https://spec.matrix.org/latest/rooms/", @@ -2949,21 +2582,8 @@ "@blockedUsers": {}, "leaveEmptyToClearStatus": "உங்கள் நிலையை அழிக்க காலியாக விடவும்.", "@leaveEmptyToClearStatus": {}, - "subspace": "துணை", - "@subspace": {}, - "decline": "வீழ்ச்சி", - "@decline": {}, "thisDevice": "இந்த சாதனம்:", "@thisDevice": {}, - "minimumPowerLevel": "{level} என்பது குறைந்தபட்ச ஆற்றல் நிலை.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "gallery": "கேலரி", "@gallery": {}, "files": "கோப்புகள்", @@ -2990,8 +2610,6 @@ "@notAnImage": {}, "encryptThisChat": "இந்த அரட்டையை குறியாக்கவும்", "@encryptThisChat": {}, - "userRole": "பயனர் பங்கு", - "@userRole": {}, "publicChatAddresses": "பொது அரட்டை முகவரிகள்", "@publicChatAddresses": {}, "createNewAddress": "புதிய முகவரியை உருவாக்கவும்", @@ -3030,28 +2648,10 @@ }, "loginWithMatrixId": "மேட்ரிக்ச்-ஐடியுடன் உள்நுழைக", "@loginWithMatrixId": {}, - "discoverHomeservers": "ஓம்சர்சர்களைக் கண்டறியவும்", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "ஓம்சர்வர் என்றால் என்ன?", - "@whatIsAHomeserver": {}, "doesNotSeemToBeAValidHomeserver": "இணக்கமான ஓம்சர்வர் என்று தெரியவில்லை. தவறான URL?", "@doesNotSeemToBeAValidHomeserver": {}, - "countChatsAndCountParticipants": "{chats} அரட்டைகள் மற்றும் {participants} பங்கேற்பாளர்கள்", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "இனி அரட்டைகள் கிடைக்கவில்லை ...", "@noMoreChatsFound": {}, - "joinedChats": "இணைந்த அரட்டைகள்", - "@joinedChats": {}, "spaces": "இடங்கள்", "@spaces": {}, "changedTheChatPermissions": "{username} அரட்டை அனுமதிகளை மாற்றியுள்ளார்", @@ -3099,11 +2699,6 @@ "type": "String", "description": "Usage hint for the command /leave" }, - "toggleMuted": "முடக்கியது", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "unbanUserDescription": "அவர்கள் முயற்சித்தால் பயனர் மீண்டும் அரட்டையை உள்ளிட முடியும்.", "@unbanUserDescription": {}, "restoreSessionBody": "ஆப்ஸ் இப்போது உங்கள் அமர்வை காப்புப்பிரதியிலிருந்து மீட்டெடுக்க முயற்சிக்கிறது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", @@ -3149,11 +2744,6 @@ "type": "String", "placeholders": {} }, - "removeDevice": "சாதனத்தை அகற்று", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "search": "தேடல்", "@search": { "type": "String", @@ -3169,14 +2759,8 @@ "type": "String", "placeholders": {} }, - "setCustomPermissionLevel": "தனிப்பயன் இசைவு அளவை அமைக்கவும்", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "தயவுசெய்து கீழே ஒரு முன் வரையறுக்கப்பட்ட பாத்திரத்தைத் தேர்வுசெய்க அல்லது 0 மற்றும் 100 க்கு இடையில் தனிப்பயன் இசைவு நிலையை உள்ளிடவும்.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "பயனரை புறக்கணிக்கவும்", "@ignoreUser": {}, - "normalUser": "சாதாரண பயனர்", - "@normalUser": {}, "commandHint_roomupgrade": "கொடுக்கப்பட்ட அறை பதிப்பிற்கு இந்த அறையை மேம்படுத்தவும்", "@commandHint_roomupgrade": {}, "checkList": "சரிபார்ப்பு பட்டியல்", @@ -3218,8 +2802,6 @@ "@open": {}, "waitingForServer": "சேவையகத்திற்காக காத்திருக்கிறது ...", "@waitingForServer": {}, - "appIntroduction": "வெவ்வேறு தூதர்களில் உங்கள் நண்பர்களுடன் அரட்டையடிக்க உங்களை பஞ்சுபோன்றது உங்களை அனுமதிக்கிறது. Https://matrix.org இல் மேலும் அறிக அல்லது *தொடரவும் *தட்டவும்.", - "@appIntroduction": {}, "newChatRequest": "அரட்டை கோரிக்கை", "@newChatRequest": {}, "contentNotificationSettings": "உள்ளடக்க அறிவிப்பு அமைப்புகள்", @@ -3377,4 +2959,4 @@ "@moreEvents": {}, "declineInvitation": "அழைப்பை நிராகரிக்கவும்", "@declineInvitation": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_te.arb b/lib/l10n/intl_te.arb index 21289814..c896417e 100644 --- a/lib/l10n/intl_te.arb +++ b/lib/l10n/intl_te.arb @@ -12,4 +12,4 @@ "type": "String", "placeholders": {} } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_th.arb b/lib/l10n/intl_th.arb index 1d4371f2..0a283aad 100644 --- a/lib/l10n/intl_th.arb +++ b/lib/l10n/intl_th.arb @@ -172,8 +172,6 @@ } } }, - "addChatDescription": "เพิ่มคำอธิบายการแชท", - "@addChatDescription": {}, "appLock": "ล็อคแอป", "@appLock": { "type": "String", @@ -263,15 +261,7 @@ "type": "String", "placeholders": {} }, - "@connect": { - "type": "String", - "placeholders": {} - }, "@jumpToLastReadMessage": {}, - "@allRooms": { - "type": "String", - "placeholders": {} - }, "@obtainingLocation": { "type": "String", "placeholders": {} @@ -280,7 +270,6 @@ "type": "String", "placeholders": {} }, - "@widgetVideo": {}, "@dismiss": {}, "@unknownDevice": { "type": "String", @@ -299,10 +288,6 @@ "type": "String", "placeholders": {} }, - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "@inviteContactToGroup": { "type": "String", "placeholders": { @@ -320,7 +305,6 @@ "type": "String", "placeholders": {} }, - "@chatHasBeenAddedToThisSpace": {}, "@reply": { "type": "String", "placeholders": {} @@ -346,7 +330,6 @@ "type": "String", "description": "Usage hint for the command /html" }, - "@widgetJitsi": {}, "@youAreNoLongerParticipatingInThisChat": { "type": "String", "placeholders": {} @@ -356,12 +339,7 @@ "placeholders": {} }, "@messageType": {}, - "@indexedDbErrorLong": {}, "@oneClientLoggedOut": {}, - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "@unsupportedAndroidVersionLong": {}, "@kicked": { "type": "String", @@ -403,8 +381,6 @@ "type": "String", "placeholders": {} }, - "@startFirstChat": {}, - "@callingAccount": {}, "@requestPermission": { "type": "String", "placeholders": {} @@ -433,15 +409,10 @@ } }, "@setColorTheme": {}, - "@nextAccount": {}, "@commandHint_create": { "type": "String", "description": "Usage hint for the command /create" }, - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "@warning": { "type": "String", "placeholders": {} @@ -531,7 +502,6 @@ "type": "String", "placeholders": {} }, - "@widgetEtherpad": {}, "@waitingPartnerAcceptRequest": { "type": "String", "placeholders": {} @@ -568,10 +538,6 @@ } } }, - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "@tryAgain": {}, "@blocked": { "type": "String", @@ -584,21 +550,6 @@ } } }, - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "@unbanUserDescription": {}, "@userAndUserAreTyping": { "type": "String", @@ -624,7 +575,6 @@ "placeholders": {} }, "@youRejectedTheInvitation": {}, - "@otherCallingPermissions": {}, "@messagesStyle": {}, "@couldNotDecryptMessage": { "type": "String", @@ -639,11 +589,8 @@ "placeholders": {} }, "@link": {}, - "@widgetUrlError": {}, - "@emailOrUsername": {}, "@newSpaceDescription": {}, "@chatDescription": {}, - "@callingAccountDetails": {}, "@next": { "type": "String", "placeholders": {} @@ -660,25 +607,10 @@ } } }, - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "@editRoomAliases": { "type": "String", "placeholders": {} }, - "@enterSpace": {}, "@encryptThisChat": {}, "@fileName": { "type": "String", @@ -688,7 +620,6 @@ "type": "String", "placeholders": {} }, - "@previousAccount": {}, "@publicRooms": { "type": "String", "placeholders": {} @@ -705,25 +636,15 @@ "type": "String", "placeholders": {} }, - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "@reopenChat": {}, - "@pleaseEnterRecoveryKey": {}, "@create": { "type": "String", "placeholders": {} }, - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "@no": { "type": "String", "placeholders": {} }, - "@widgetNameError": {}, "@inoffensive": { "type": "String", "placeholders": {} @@ -741,7 +662,6 @@ "type": "String", "placeholders": {} }, - "@addWidget": {}, "@removeAllOtherDevices": { "type": "String", "placeholders": {} @@ -790,7 +710,6 @@ } } }, - "@hydrateTor": {}, "@pushNotificationsNotAvailable": {}, "@passwordRecovery": { "type": "String", @@ -830,7 +749,6 @@ "type": "String", "placeholders": {} }, - "@signInWithPassword": {}, "@ignoredUsers": { "type": "String", "placeholders": {} @@ -891,10 +809,6 @@ "type": "String", "placeholders": {} }, - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "@commandHint_clearcache": { "type": "String", "description": "Usage hint for the command /clearcache" @@ -914,14 +828,6 @@ "placeholders": {} }, "@whyIsThisMessageEncrypted": {}, - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "@rejectedTheInvitation": { "type": "String", "placeholders": { @@ -943,19 +849,11 @@ "type": "String", "placeholders": {} }, - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "@or": { "type": "String", "placeholders": {} }, "@dehydrateWarning": {}, - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "@noOtherDevicesFound": {}, "@whoIsAllowedToJoinThisGroup": { "type": "String", @@ -965,14 +863,6 @@ "type": "String", "placeholders": {} }, - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "@storeSecurlyOnThisDevice": {}, "@yourChatBackupHasBeenSetUp": {}, "@chatBackup": { @@ -1032,18 +922,6 @@ "type": "String", "placeholders": {} }, - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "@username": { "type": "String", "placeholders": {} @@ -1058,10 +936,6 @@ }, "@fileIsTooBigForServer": {}, "@homeserver": {}, - "@people": { - "type": "String", - "placeholders": {} - }, "@changedTheHistoryVisibilityTo": { "type": "String", "placeholders": { @@ -1093,7 +967,6 @@ } } }, - "@callingPermissions": {}, "@newMessageInFluffyChat": { "type": "String", "placeholders": {} @@ -1113,18 +986,6 @@ "placeholders": {} }, "@unlockOldMessages": {}, - "@identity": { - "type": "String", - "placeholders": {} - }, - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "@changedTheJoinRulesTo": { "type": "String", "placeholders": { @@ -1212,10 +1073,6 @@ "@sendAsText": { "type": "String" }, - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "@archiveRoomDescription": {}, "@changedTheChatNameTo": { "type": "String", @@ -1228,18 +1085,6 @@ } } }, - "@sendSticker": { - "type": "String", - "placeholders": {} - }, - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "@commandInvalid": { "type": "String" }, @@ -1310,7 +1155,6 @@ "type": "String", "placeholders": {} }, - "@inviteContactToGroupQuestion": {}, "@emoteExists": { "type": "String", "placeholders": {} @@ -1349,12 +1193,10 @@ "type": "String", "placeholders": {} }, - "@appearOnTopDetails": {}, "@roomHasBeenUpgraded": { "type": "String", "placeholders": {} }, - "@enterRoom": {}, "@enableEmotesGlobally": { "type": "String", "placeholders": {} @@ -1404,17 +1246,6 @@ } }, "@confirmEventUnpin": {}, - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "@youInvitedUser": { "placeholders": { "user": { @@ -1445,10 +1276,6 @@ } } }, - "@license": { - "type": "String", - "placeholders": {} - }, "@unbanFromChat": { "type": "String", "placeholders": {} @@ -1463,10 +1290,6 @@ "description": "State that {command} is not a valid /command." }, "@redactMessageDescription": {}, - "@rejoin": { - "type": "String", - "placeholders": {} - }, "@recoveryKey": {}, "@redactMessage": { "type": "String", @@ -1489,7 +1312,6 @@ "type": "String", "placeholders": {} }, - "@dehydrateTorLong": {}, "@yourPublicKey": { "type": "String", "placeholders": {} @@ -1543,10 +1365,6 @@ "type": "String", "placeholders": {} }, - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "@joinRoom": { "type": "String", "placeholders": {} @@ -1557,9 +1375,7 @@ "placeholders": {} }, "@serverRequiresEmail": {}, - "@hideUnimportantStateEvents": {}, "@screenSharingTitle": {}, - "@widgetCustom": {}, "@sentCallInformations": { "type": "String", "placeholders": { @@ -1568,7 +1384,6 @@ } } }, - "@addToSpaceDescription": {}, "@youBannedUser": { "placeholders": { "user": { @@ -1623,7 +1438,6 @@ } } }, - "@publish": {}, "@openLinkInBrowser": {}, "@clearArchive": {}, "@commandHint_react": { @@ -1666,8 +1480,6 @@ "placeholders": {} }, "@inviteGroupChat": {}, - "@appearOnTop": {}, - "@invitePrivateChat": {}, "@verifyTitle": { "type": "String", "placeholders": {} @@ -1702,10 +1514,6 @@ "type": "String", "description": "Usage hint for the command /ban" }, - "@confirm": { - "type": "String", - "placeholders": {} - }, "@wasDirectChatDisplayName": { "type": "String", "placeholders": { @@ -1754,7 +1562,6 @@ }, "@newGroup": {}, "@bundleName": {}, - "@dehydrateTor": {}, "@removeFromSpace": {}, "@dateAndTimeOfDay": { "type": "String", @@ -1820,7 +1627,6 @@ } } }, - "@profileNotFound": {}, "@jump": {}, "@groups": { "type": "String", @@ -1849,14 +1655,6 @@ } }, "@sorryThatsNotPossible": {}, - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "@oopsSomethingWentWrong": { "type": "String", "placeholders": {} @@ -1872,10 +1670,6 @@ "@shareInviteLink": {}, "@commandHint_markasdm": {}, "@recoveryKeyLost": {}, - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "@messages": { "type": "String", "placeholders": {} @@ -1901,10 +1695,6 @@ "type": "String", "placeholders": {} }, - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "@startedACall": { "type": "String", "placeholders": { @@ -1921,10 +1711,6 @@ "type": "String", "placeholders": {} }, - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "@deleteMessage": { "type": "String", "placeholders": {} @@ -1937,20 +1723,11 @@ "type": "String", "placeholders": {} }, - "@setTheme": {}, "@changeTheHomeserver": { "type": "String", "placeholders": {} }, "@youJoinedTheChat": {}, - "@wallpaper": { - "type": "String", - "placeholders": {} - }, - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "@play": { "type": "String", "placeholders": { @@ -1984,7 +1761,6 @@ "type": "String", "placeholders": {} }, - "@widgetName": {}, "@sentASticker": { "type": "String", "placeholders": { @@ -1993,7 +1769,6 @@ } } }, - "@errorAddingWidget": {}, "@commandHint_dm": { "type": "String", "description": "Usage hint for the command /dm" @@ -2063,15 +1838,10 @@ "type": "String", "placeholders": {} }, - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "@share": { "type": "String", "placeholders": {} }, - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "@createGroup": {}, "@privacy": { "type": "String", @@ -2085,16 +1855,7 @@ "type": "String", "placeholders": {} }, - "@hydrateTorLong": {}, "@time": {}, - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, - "@botMessages": { - "type": "String", - "placeholders": {} - }, "@contentHasBeenReported": { "type": "String", "placeholders": {} @@ -2124,10 +1885,6 @@ "type": "String", "placeholders": {} }, - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "@pinMessage": {}, "@screenSharingDetail": {}, "@muteChat": { @@ -2140,7 +1897,6 @@ "type": "String", "placeholders": {} }, - "@indexedDbErrorTitle": {}, "@endedTheCall": { "type": "String", "placeholders": { @@ -2149,4 +1905,4 @@ } } } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_tr.arb b/lib/l10n/intl_tr.arb index a59752e0..f5fc04ef 100644 --- a/lib/l10n/intl_tr.arb +++ b/lib/l10n/intl_tr.arb @@ -131,18 +131,6 @@ } } }, - "badServerVersionsException": "Ana sunucu aşağıdaki Spec sürümlerini destekliyor:\n{serverVersions}\nAncak bu uygulama yalnızca {supportedVersions} destekliyor", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "Sohbetten engelle", "@banFromChat": { "type": "String", @@ -175,11 +163,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Bot mesajları", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "İptal", "@cancel": { "type": "String", @@ -393,8 +376,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Sohbet bu alana eklendi", - "@chatHasBeenAddedToThisSpace": {}, "chats": "Sohbetler", "@chats": { "type": "String", @@ -511,31 +492,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Onayla", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Bağlan", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kişi gruba davet edildi", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Görünen ad içerir", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Kullanıcı adı içerir", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "İçerik, sunucu yöneticilerine bildirildi", "@contentHasBeenReported": { "type": "String", @@ -615,33 +576,6 @@ } } }, - "dateWithoutYear": "{day} {month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Bu, kullanıcı hesabınızı devre dışı bırakacak. Bu geri alınamaz! Emin misiniz?", "@deactivateAccountWarning": { "type": "String", @@ -747,11 +681,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Bir ifade kısa kodu ve bir resim seçmeniz gerekiyor!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Boş sohbet", "@emptyChat": { "type": "String", @@ -801,11 +730,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "Ana sunucunuzu girin", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Konum alınırken hata oluştu: {error}", "@errorObtainingLocation": { "type": "String", @@ -855,11 +779,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Yeni odaya git", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Grup", "@group": { "type": "String", @@ -931,11 +850,6 @@ "type": "String", "placeholders": {} }, - "identity": "Kimlik", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "Yok say", "@ignore": { "type": "String", @@ -997,11 +911,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Benim için davet et", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} sizi FluffyChat'e davet etti.\n1. fluffychat.im adresini ziyaret edin ve uygulamayı kurun \n2. Kaydolun veya oturum açın \n3. Davet bağlantısını açın: \n {link}", "@inviteText": { "type": "String", @@ -1081,11 +990,6 @@ "type": "String", "placeholders": {} }, - "license": "Lisans", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Açık", "@lightTheme": { "type": "String", @@ -1139,11 +1043,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Üye değişiklikleri", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Bahset", "@mention": { "type": "String", @@ -1251,11 +1150,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Bu hesap için bildirimler etkinleştirildi", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} kullanıcı yazıyor…", "@numUsersTyping": { "type": "String", @@ -1355,11 +1249,6 @@ "type": "String", "placeholders": {} }, - "people": "İnsanlar", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Bir resim seç", "@pickImage": { "type": "String", @@ -1379,11 +1268,6 @@ } } }, - "pleaseChoose": "Lütfen seçin", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Lütfen bir geçiş kodu seçin", "@pleaseChooseAPasscode": { "type": "String", @@ -1477,11 +1361,6 @@ } } }, - "rejoin": "Yeniden katıl", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Kaldır", "@remove": { "type": "String", @@ -1501,11 +1380,6 @@ } } }, - "removeDevice": "Aygıtı kaldır", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Sohbet engelini kaldır", "@unbanFromChat": { "type": "String", @@ -1561,15 +1435,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "{username} tarafından görüldü", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Gönder", "@send": { "type": "String", @@ -1604,16 +1469,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Orijinali gönder", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Çıkartma gönder", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Video gönder", "@sendVideo": { "type": "String", @@ -1678,21 +1533,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Özel ifadeler ayarla", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "Davet bağlantısı ayarla", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "İzin seviyesini ayarla", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Durumu ayarla", "@setStatus": { "type": "String", @@ -1727,11 +1567,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "Tek oturum açma", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Atla", "@skip": { "type": "String", @@ -1802,21 +1637,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Sık Kullanılanlara Ekle/Çıkar", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "Sessize Al/Sessizden Çıkar", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "Okundu/Okunmadı Olarak İşaretle", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Çok fazla istek. Lütfen daha sonra tekrar deneyin!", "@tooManyRequestsWarning": { "type": "String", @@ -1883,15 +1703,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 okunmamış sohbet} other{{unreadCount} okunmamış sohbet}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} ve {count} diğer kişi yazıyor…", "@userAndOthersAreTyping": { "type": "String", @@ -2016,11 +1827,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Duvar kağıdı:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Uyarı!", "@warning": { "type": "String", @@ -2128,8 +1934,6 @@ "@openGallery": {}, "removeFromSpace": "Alandan kaldır", "@removeFromSpace": {}, - "addToSpaceDescription": "Bu sohbeti eklemek için bir alan seçin.", - "@addToSpaceDescription": {}, "start": "Başla", "@start": {}, "commandHint_clearcache": "Önbelleği temizleyin", @@ -2152,22 +1956,6 @@ "type": "String", "description": "Usage hint for the command /discardsession" }, - "openVideoCamera": "Bir video için kamerayı aç", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "publish": "Yayınla", - "@publish": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "dismiss": "Kapat", "@dismiss": {}, "markAsRead": "Okundu olarak işaretle", @@ -2206,44 +1994,6 @@ "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Deneysel görüntülü aramalar", "@experimentalVideoCalls": {}, - "emailOrUsername": "E-posta veya kullanıcı adı", - "@emailOrUsername": {}, - "switchToAccount": "{number}. hesaba geç", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Sonraki hesap", - "@nextAccount": {}, - "previousAccount": "Önceki hesap", - "@previousAccount": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, - "widgetCustom": "Özel", - "@widgetCustom": {}, - "widgetUrlError": "Bu geçerli bir URL değil.", - "@widgetUrlError": {}, - "widgetNameError": "Lütfen görünecek bir ad girin.", - "@widgetNameError": {}, - "errorAddingWidget": "Widget eklenirken hata oluştu.", - "@errorAddingWidget": {}, - "widgetVideo": "Video", - "@widgetVideo": {}, - "addWidget": "Widget ekle", - "@addWidget": {}, - "widgetEtherpad": "Metin notu", - "@widgetEtherpad": {}, - "widgetName": "Ad", - "@widgetName": {}, - "separateChatTypes": "Doğrudan Sohbetleri ve Grupları Ayır", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "youJoinedTheChat": "Sohbete katıldınız", "@youJoinedTheChat": {}, "youAcceptedTheInvitation": "👍 Daveti kabul ettiniz", @@ -2308,8 +2058,6 @@ }, "storeInAppleKeyChain": "Apple KeyChain'de sakla", "@storeInAppleKeyChain": {}, - "pleaseEnterRecoveryKey": "Lütfen kurtarma anahtarınızı girin:", - "@pleaseEnterRecoveryKey": {}, "recoveryKeyLost": "Kurtarma anahtarı kayıp mı?", "@recoveryKeyLost": {}, "pleaseEnterRecoveryKeyDescription": "Eski mesajlarınızın kilidini açmak için lütfen önceki bir oturumda oluşturulan kurtarma anahtarınızı girin. Kurtarma anahtarınız parolanız DEĞİLDİR.", @@ -2338,22 +2086,10 @@ }, "dehydrate": "Oturumu dışa aktar ve aygıtı sil", "@dehydrate": {}, - "dehydrateTorLong": "TOR kullanıcıları için, pencereyi kapatmadan önce oturumu dışa aktarmaları tavsiye edilir.", - "@dehydrateTorLong": {}, - "dehydrateTor": "TOR Kullanıcıları: Oturumu dışa aktar", - "@dehydrateTor": {}, - "hydrateTor": "TOR Kullanıcıları: Dışa aktarılan oturumu içe aktar", - "@hydrateTor": {}, "hydrate": "Yedekleme dosyasından geri yükle", "@hydrate": {}, - "indexedDbErrorTitle": "Gizli mod sorunları", - "@indexedDbErrorTitle": {}, "dehydrateWarning": "Bu eylem geri alınamaz. Yedekleme dosyasını güvenli bir şekilde sakladığınızdan emin olun.", "@dehydrateWarning": {}, - "hydrateTorLong": "TOR'da en son oturumunuzu dışa aktardınız mı? Hızlıca içe aktarın ve sohbete devam edin.", - "@hydrateTorLong": {}, - "indexedDbErrorLong": "Mesaj saklama özelliği ne yazık ki öntanımlı olarak gizli modda etkin değildir.\nLütfen\n - about:config sayfasına gidin ve\n - dom.indexedDB.privateBrowsing.enabled seçeneğini true olarak ayarlayın\nAksi takdirde FluffyChat çalıştırılamaz.", - "@indexedDbErrorLong": {}, "user": "Kullanıcı", "@user": {}, "custom": "Özel", @@ -2379,43 +2115,16 @@ "@noKeyForThisMessage": {}, "screenSharingTitle": "ekran paylaşımı", "@screenSharingTitle": {}, - "callingPermissions": "Arama izinleri", - "@callingPermissions": {}, - "callingAccountDetails": "FluffyChat'in yerel android telefon uygulamasını kullanmasına izin verir.", - "@callingAccountDetails": {}, - "appearOnTop": "Üstte görün", - "@appearOnTop": {}, - "enterSpace": "Alana gir", - "@enterSpace": {}, - "enterRoom": "Odaya gir", - "@enterRoom": {}, "allSpaces": "Tüm alanlar", "@allSpaces": {}, - "otherCallingPermissions": "Mikrofon, kamera ve diğer FluffyChat izinleri", - "@otherCallingPermissions": {}, "foregroundServiceRunning": "Bu bildirim, ön plan hizmeti çalışırken görünür.", "@foregroundServiceRunning": {}, - "callingAccount": "Arama hesabı", - "@callingAccount": {}, - "appearOnTopDetails": "Uygulamanın üstte görünmesine izin verir (Fluffychat'ı zaten bir arama hesabı olarak ayarladıysanız gerekli değildir)", - "@appearOnTopDetails": {}, "newGroup": "Yeni grup", "@newGroup": {}, "newSpace": "Yeni alan", "@newSpace": {}, "screenSharingDetail": "Ekranınızı FuffyChat'te paylaşıyorsunuz", "@screenSharingDetail": {}, - "numChats": "{number} sohbet", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Önemsiz durum etkinliklerini gizle", - "@hideUnimportantStateEvents": {}, "doNotShowAgain": "Tekrar gösterme", "@doNotShowAgain": {}, "googlyEyesContent": "{senderName} size şaşkın gözler gönderiyor", @@ -2460,8 +2169,6 @@ } } }, - "startFirstChat": "İlk sohbetinizi başlatın", - "@startFirstChat": {}, "newSpaceDescription": "Alanlar, sohbetlerinizi birleştirmenize ve özel veya genel topluluklar oluşturmanıza olanak tanır.", "@newSpaceDescription": {}, "encryptThisChat": "Bu sohbeti şifrele", @@ -2497,28 +2204,10 @@ "@jump": {}, "openLinkInBrowser": "Bağlantıyı tarayıcıda aç", "@openLinkInBrowser": {}, - "allRooms": "Tüm Grup Sohbetleri", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "reportErrorDescription": "😭 Olamaz. Bir şeyler yanlış gitti. İsterseniz bu hatayı geliştiricilere bildirebilirsiniz.", "@reportErrorDescription": {}, "report": "bildir", "@report": {}, - "signInWithPassword": "Parola ile oturum aç", - "@signInWithPassword": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Lütfen daha sonra tekrar deneyin veya farklı bir sunucu seçin.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "signInWith": "{provider} ile oturum aç", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "notAnImage": "Bir resim dosyası değil.", "@notAnImage": {}, "importNow": "Şimdi içe aktar", @@ -2539,14 +2228,8 @@ "@createGroup": {}, "shareInviteLink": "Davet bağlantısını paylaş", "@shareInviteLink": {}, - "profileNotFound": "Kullanıcı sunucuda bulunamadı. Belki bir bağlantı sorunu vardır veya kullanıcı mevcut değildir.", - "@profileNotFound": {}, - "setTheme": "Temayı ayarla:", - "@setTheme": {}, "setColorTheme": "Renk temasını ayarla:", "@setColorTheme": {}, - "inviteContactToGroupQuestion": "{contact} kişisini \"{groupName}\" sohbetine davet etmek istiyor musunuz?", - "@inviteContactToGroupQuestion": {}, "tryAgain": "Tekrar deneyin", "@tryAgain": {}, "redactMessageDescription": "Bu mesaj bu görüşmedeki herkes için düzenlenecek. Bu işlem geri alınamaz.", @@ -2555,8 +2238,6 @@ "@optionalRedactReason": {}, "invite": "Davet et", "@invite": {}, - "addChatDescription": "Sohbet açıklaması ekle...", - "@addChatDescription": {}, "chatPermissions": "Sohbet izinleri", "@chatPermissions": {}, "chatDescription": "Sohbet açıklaması", @@ -2594,8 +2275,6 @@ "@directChat": {}, "inviteGroupChat": "📨 Grup sohbetine davet et", "@inviteGroupChat": {}, - "invitePrivateChat": "📨 Gizli sohbete davet et", - "@invitePrivateChat": {}, "emoteKeyboardNoRecents": "Son kullanılan ifadeler burada görünecek...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2661,8 +2340,6 @@ "@searchChatsRooms": {}, "blockListDescription": "Sizi rahatsız eden kullanıcıları engelleyebilirsiniz. Kişisel engelleme listenizdeki kullanıcılardan herhangi bir mesaj veya oda daveti alamazsınız.", "@blockListDescription": {}, - "startConversation": "Görüşme başlat", - "@startConversation": {}, "blockedUsers": "Engellenen kullanıcılar", "@blockedUsers": {}, "block": "Engelle", @@ -2677,14 +2354,6 @@ "@databaseMigrationTitle": {}, "databaseMigrationBody": "Lütfen bekleyin. Bu biraz zaman alabilir.", "@databaseMigrationBody": {}, - "youInvitedToBy": "📩 Bağlantı aracılığıyla davet edildiniz:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "pleaseEnterYourCurrentPassword": "Lütfen geçerli parolanızı girin", "@pleaseEnterYourCurrentPassword": {}, "pleaseChooseAStrongPassword": "Lütfen güçlü bir parola seçin", @@ -2700,24 +2369,10 @@ } } }, - "publicLink": "Herkese açık bağlantı", - "@publicLink": {}, "joinSpace": "Alana katıl", "@joinSpace": {}, "newPassword": "Yeni parola", "@newPassword": {}, - "databaseBuildErrorBody": "SQlite veri tabanı oluşturulamadı. Uygulama şimdilik eski veri tabanını kullanmaya çalışıyor. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "Oturumunuz kayboldu. Lütfen bu hatayı {url} adresinde geliştiricilere bildirin. Hata mesajı: {error}", "@sessionLostBody": { "type": "String", @@ -2730,8 +2385,6 @@ } } }, - "subspace": "Alt alan", - "@subspace": {}, "thisDevice": "Bu aygıt:", "@thisDevice": {}, "formattedMessagesDescription": "Markdown kullanarak kalın metin gibi zengin mesaj içeriğini görüntüle.", @@ -2743,11 +2396,6 @@ "type": "String", "placeholders": {} }, - "presenceStyle": "Bulunma:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "searchForUsers": "@kullanıcıları ara...", "@searchForUsers": {}, "commandHint_ignore": "Verilen matrix kimliğini görmezden gel", @@ -2772,22 +2420,8 @@ "@hideRedactedMessages": {}, "hideRedactedMessagesBody": "Birisi bir mesajı düzenlerse, bu mesaj artık sohbette görünmeyecektir.", "@hideRedactedMessagesBody": {}, - "hideMemberChangesInPublicChats": "Herkese açık sohbetlerde üye değişikliklerini gizle", - "@hideMemberChangesInPublicChats": {}, - "hideMemberChangesInPublicChatsBody": "Okunabilirliği artırmak için birisi herkese açık bir sohbete katıldığında veya sohbetten ayrıldığında sohbet zaman çizelgesinde gösterme.", - "@hideMemberChangesInPublicChatsBody": {}, "passwordRecoverySettings": "Parola kurtarma ayarları", "@passwordRecoverySettings": {}, - "userWouldLikeToChangeTheChat": "{user} sohbete katılmak istiyor.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Henüz herkese açık bir bağlantı oluşturulmadı", - "@noPublicLinkHasBeenCreatedYet": {}, "knock": "Tıklat", "@knock": {}, "knocking": "Tıklat", @@ -2813,18 +2447,12 @@ "@publicSpaces": {}, "initAppError": "Uygulama başlatılırken bir hata oluştu", "@initAppError": {}, - "userRole": "Kullanıcı rolü", - "@userRole": {}, "hideInvalidOrUnknownMessageFormats": "Geçersiz veya bilinmeyen mesaj biçimlerini gizle", "@hideInvalidOrUnknownMessageFormats": {}, "hidePresences": "Durum listesi gizlensin mi?", "@hidePresences": {}, "overview": "Genel görünüm", "@overview": {}, - "decline": "Reddet", - "@decline": {}, - "notifyMeFor": "Beni bilgilendir", - "@notifyMeFor": {}, "chatCanBeDiscoveredViaSearchOnServer": "Sohbet {server} üzerinde aranarak keşfedilebilir", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", @@ -2838,15 +2466,6 @@ "@leaveEmptyToClearStatus": {}, "select": "Seç", "@select": {}, - "minimumPowerLevel": "{level} en düşük güç seviyesidir.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "passwordsDoNotMatch": "Parolalar eşleşmiyor", "@passwordsDoNotMatch": {}, "passwordIsWrong": "Girdiğiniz parola yanlış", @@ -2855,15 +2474,6 @@ "@publicChatAddresses": {}, "createNewAddress": "Yeni adres oluştur", "@createNewAddress": {}, - "forwardMessageTo": "Mesajlar {roomName} kişisine iletilsin mi?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "acceptedKeyVerification": "{sender} anahtar doğrulamayı kabul etti", "@acceptedKeyVerification": { "type": "String", @@ -2976,18 +2586,6 @@ "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, - "countChatsAndCountParticipants": "{chats} sohbet ve {participants} katılımcı", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Başka sohbet bulunamadı...", "@noMoreChatsFound": {}, "goToSpace": "Alana git: {space}", @@ -2995,8 +2593,6 @@ "type": "String", "space": {} }, - "joinedChats": "Katılınan sohbetler", - "@joinedChats": {}, "unread": "Okunmadı", "@unread": {}, "markAsUnread": "Okunmadı olarak işaretle", @@ -3073,12 +2669,6 @@ "@noChatsFoundHere": {}, "loginWithMatrixId": "Matrix kimliği ile oturum aç", "@loginWithMatrixId": {}, - "discoverHomeservers": "Ana sunucuları keşfet", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "Ana sunucu nedir?", - "@whatIsAHomeserver": {}, - "homeserverDescription": "Tüm verileriniz tıpkı bir e-posta sağlayıcısı gibi ana sunucuda saklanır. Hangi ana sunucuyu kullanmak istediğinizi seçebilir ve herkesle iletişim kurmaya devam edebilirsiniz. https://matrix.org adresinden daha fazla bilgi edinin.", - "@homeserverDescription": {}, "doesNotSeemToBeAValidHomeserver": "Uyumlu bir ana sunucu gibi görünmüyor. Yanlış URL mi?", "@doesNotSeemToBeAValidHomeserver": {}, "prepareSendingAttachment": "Ek gönderilmeye hazırlanıyor...", @@ -3178,14 +2768,8 @@ }, "welcomeText": "Hey Hey 👋 Karşınızda FluffyChat. https://matrix.org ile uyumlu herhangi bir homeserver'a giriş yapabilirsiniz. Ve herkesle konuşabilirsiniz. Bu koca bir merkeziyetsiz mesajlaşma ağı!", "@welcomeText": {}, - "setCustomPermissionLevel": "Özel izin düzeyi ayarla", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Lütfen aşağıdan önceden tanımlanmış bir rol seçin veya 0 ile 100 arasında bir özel izin seviyesi girin.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Kullanıcıyı yok say", "@ignoreUser": {}, - "normalUser": "Normal kullanıcı", - "@normalUser": {}, "commandHint_roomupgrade": "Bu odayı belirtilen oda sürümüne yükseltin", "@commandHint_roomupgrade": {}, "checkList": "Kontrol listesi", @@ -3208,4 +2792,4 @@ } } } -} +} \ No newline at end of file diff --git a/lib/l10n/intl_uk.arb b/lib/l10n/intl_uk.arb index fee0cf01..f7234515 100644 --- a/lib/l10n/intl_uk.arb +++ b/lib/l10n/intl_uk.arb @@ -313,16 +313,6 @@ "type": "String", "placeholders": {} }, - "confirm": "Підтвердити", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Під'єднатись", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Контакт був запрошений в групу", "@contactHasBeenInvitedToTheGroup": { "type": "String", @@ -392,33 +382,6 @@ } } }, - "dateWithoutYear": "{day}-{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{day}-{month}-{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "delete": "Видалити", "@delete": { "type": "String", @@ -474,11 +437,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Укажіть короткий код емодзі та зображення!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Порожня бесіда", "@emptyChat": { "type": "String", @@ -508,11 +466,6 @@ } } }, - "enterYourHomeserver": "Введіть адресу домашнього сервера", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "fileName": "Назва файлу", "@fileName": { "type": "String", @@ -589,11 +542,6 @@ "type": "String", "placeholders": {} }, - "identity": "Ідентифікація", - "@identity": { - "type": "String", - "placeholders": {} - }, "incorrectPassphraseOrKey": "Неправильна парольна фраза або ключ відновлення", "@incorrectPassphraseOrKey": { "type": "String", @@ -709,11 +657,6 @@ "type": "String", "placeholders": {} }, - "license": "Ліцензія", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Світлий", "@lightTheme": { "type": "String", @@ -899,11 +842,6 @@ } } }, - "rejoin": "Приєднатися знову", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "Вилучити", "@remove": { "type": "String", @@ -923,11 +861,6 @@ } } }, - "removeDevice": "Вилучити пристрій", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Розблокувати у бесіді", "@unbanFromChat": { "type": "String", @@ -948,15 +881,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "Переглянуто {username}", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Надіслати", "@send": { "type": "String", @@ -1022,11 +946,6 @@ } } }, - "setInvitationLink": "Указати посилання для запрошення", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, "setStatus": "Указати статус", "@setStatus": { "type": "String", @@ -1257,11 +1176,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Шпалери:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "whoIsAllowedToJoinThisGroup": "Кому дозволено приєднуватися до цієї групи", "@whoIsAllowedToJoinThisGroup": { "type": "String", @@ -1297,26 +1211,11 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Сповіщення ввімкнені для цього облікового запису", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "notifications": "Сповіщення", "@notifications": { "type": "String", "placeholders": {} }, - "memberChanges": "Зміни учасників", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, - "inviteForMe": "Запрошення для мене", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "enterAnEmailAddress": "Введіть адресу е-пошти", "@enterAnEmailAddress": { "type": "String", @@ -1362,16 +1261,6 @@ "type": "String", "placeholders": {} }, - "containsUserName": "Містить ім’я користувача", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, - "containsDisplayName": "Містить показуване ім’я", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, "changePassword": "Змінити пароль", "@changePassword": { "type": "String", @@ -1382,11 +1271,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Повідомлення ботів", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "or": "Або", "@or": { "type": "String", @@ -1508,11 +1392,6 @@ "type": "String", "placeholders": {} }, - "pleaseChoose": "Виберіть", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseEnter4Digits": "Введіть 4 цифри або залиште порожнім, щоб вимкнути блокування застосунку.", "@pleaseEnter4Digits": { "type": "String", @@ -1543,11 +1422,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "Встановити власні емодзі", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "weSentYouAnEmail": "Ми надіслали вам електронний лист", "@weSentYouAnEmail": { "type": "String", @@ -1617,18 +1491,6 @@ "type": "String", "placeholders": {} }, - "badServerVersionsException": "Домашній сервер підтримує такі версії специфікацій:\n{serverVersions}\nАле цей застосунок підтримує лише {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "areYouSureYouWantToLogout": "Ви впевнені, що хочете вийти?", "@areYouSureYouWantToLogout": { "type": "String", @@ -1677,11 +1539,6 @@ "type": "String", "placeholders": {} }, - "sendSticker": "Надіслати наліпку", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Помилка під час отримання розташування: {error}", "@errorObtainingLocation": { "type": "String", @@ -1747,11 +1604,6 @@ "type": "String", "placeholders": {} }, - "toggleUnread": "Позначити прочитаним/непрочитаним", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "transferFromAnotherDevice": "Перенесення з іншого пристрою", "@transferFromAnotherDevice": { "type": "String", @@ -1762,11 +1614,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Надіслати оригінал", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "whoCanPerformWhichAction": "Хто і яку дію може виконувати", "@whoCanPerformWhichAction": { "type": "String", @@ -1793,11 +1640,6 @@ "placeholders": {} }, "homeserver": "Домашній сервер", - "goToTheNewRoom": "Перейти до нової кімнати", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "groups": "Групи", "@groups": { "type": "String", @@ -1813,7 +1655,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Бесіду додано до цього простору", "chatBackupDescription": "Ваші повідомлення захищені ключем відновлення. Переконайтеся, що ви не втратите його.", "@chatBackupDescription": { "type": "String", @@ -1899,21 +1740,11 @@ "type": "String", "placeholders": {} }, - "setPermissionsLevel": "Указати рівні дозволів", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "shareLocation": "Поділитися місцеперебуванням", "@shareLocation": { "type": "String", "placeholders": {} }, - "singlesignon": "Єдиний вхід", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Забагато запитів. Спробуйте пізніше!", "@tooManyRequestsWarning": { "type": "String", @@ -1924,15 +1755,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 непрочитана бесіда} few{{unreadCount} непрочитані бесіди} many{{unreadCount} непрочитаних бесід} other{{unreadCount} непрочитані бесіди}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "withTheseAddressesRecoveryDescription": "За допомогою цих адрес ви можете відновити свій пароль.", "@withTheseAddressesRecoveryDescription": { "type": "String", @@ -2031,11 +1853,6 @@ "type": "String", "placeholders": {} }, - "people": "Люди", - "@people": { - "type": "String", - "placeholders": {} - }, "pin": "Закріпити", "@pin": { "type": "String", @@ -2084,17 +1901,7 @@ }, "oneClientLoggedOut": "На одному з ваших клієнтів виконано вихід із системи", "bundleName": "Назва вузла", - "toggleFavorite": "Перемикнути вибране", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, "removeFromBundle": "Вилучити з цього вузла", - "toggleMuted": "Увімкнути/вимкнути звук", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, "editBundlesForAccount": "Змінити вузол для цього облікового запису", "addToBundle": "Додати до вузлів", "repeatPassword": "Повторіть пароль", @@ -2103,7 +1910,6 @@ "messageType": "Тип повідомлення", "openGallery": "Відкрити галерею", "sender": "Відправник", - "addToSpaceDescription": "Виберіть простір, щоб додати до нього цю бесіду.", "removeFromSpace": "Вилучити з простору", "start": "Почати", "commandHint_discardsession": "Відкинути сеанс", @@ -2126,21 +1932,6 @@ "type": "String", "description": "Usage hint for the command /dm" }, - "openVideoCamera": "Відкрити камеру для відео", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "publish": "Опублікувати", - "videoWithSize": "Відео ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "dismiss": "Відхилити", "markAsRead": "Позначити прочитаним", "reportUser": "Поскаржився на користувача", @@ -2165,33 +1956,7 @@ "voiceCall": "Голосовий виклик", "unsupportedAndroidVersionLong": "Для цієї функції потрібна новіша версія Android. Перевірте наявність оновлень або підтримку Lineage OS.", "videoCallsBetaWarning": "Зауважте, що відеовиклики на ранньому етапі розробки. Вони можуть працювати не так, як очікувалося, або взагалі не працювати на всіх платформах.", - "emailOrUsername": "Електронна адреса або ім’я користувача", "experimentalVideoCalls": "Експериментальні відеовиклики", - "switchToAccount": "Перемкнутися на обліковий запис {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Наступний обліковий запис", - "previousAccount": "Попередній обліковий запис", - "addWidget": "Додати віджет", - "widgetVideo": "Відео", - "widgetCustom": "Користувацький", - "widgetName": "Назва", - "widgetNameError": "Укажіть коротку назву.", - "widgetEtherpad": "Текстова примітка", - "widgetJitsi": "Jitsi Meet", - "widgetUrlError": "Це недійсна URL-адреса.", - "errorAddingWidget": "Помилка додавання віджета.", - "separateChatTypes": "Розділіть особисті бесіди та групи", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "youInvitedBy": "📩 Ви були запрошені {user}", "@youInvitedBy": { "placeholders": { @@ -2256,7 +2021,6 @@ "storeInAppleKeyChain": "Зберегти в Apple KeyChain", "storeSecurlyOnThisDevice": "Зберегти безпечно на цей пристрій", "pleaseEnterRecoveryKeyDescription": "Щоб розблокувати старі повідомлення, введіть ключ відновлення, згенерований у попередньому сеансі. Ваш ключ відновлення це НЕ ваш пароль.", - "pleaseEnterRecoveryKey": "Введіть ключ відновлення:", "recoveryKey": "Ключ відновлення", "recoveryKeyLost": "Ключ відновлення втрачено?", "users": "Користувачі", @@ -2271,14 +2035,8 @@ } }, "hydrate": "Відновлення з файлу резервної копії", - "hydrateTorLong": "Минулого разу ви експортували свій сеанс із TOR? Швидко імпортуйте його та продовжуйте спілкування.", - "indexedDbErrorTitle": "Проблеми приватного режиму", - "indexedDbErrorLong": "На жаль, сховище повідомлень не ввімкнуто у приватному режимі типово.\nВідкрийте\n - about:config\n - установіть для dom.indexedDB.privateBrowsing.enabled значення true\nІнакше запустити FluffyChat буде неможливо.", "dehydrate": "Експортувати сеанс та очистити пристрій", "dehydrateWarning": "Цю дію не можна скасувати. Переконайтеся, що ви безпечно зберігаєте файл резервної копії.", - "dehydrateTor": "Користувачі TOR: експорт сеансу", - "dehydrateTorLong": "Для користувачів TOR рекомендується експортувати сеанс перед закриттям вікна.", - "hydrateTor": "Користувачі TOR: імпорт експортованого сеансу", "user": "Користувач", "custom": "Користувацький", "supposedMxid": "Це має бути {mxid}", @@ -2297,28 +2055,10 @@ "noKeyForThisMessage": "Це може статися, якщо повідомлення було надіслано до того, як ви ввійшли у свій обліковий запис на цьому пристрої.\n\nТакож можливо, що відправник заблокував ваш пристрій або щось пішло не так з під'єднанням до інтернету.\n\nЧи можете ви прочитати повідомлення на іншому сеансі? Тоді ви зможете перенести повідомлення з нього! Перейдіть до Налаштування > Пристрої та переконайтеся, що ваші пристрої перевірили один одного. Коли ви відкриєте кімнату наступного разу й обидва сеанси будуть на активні, ключі будуть передані автоматично.\n\nВи ж не хочете втрачати ключі після виходу або зміни пристроїв? Переконайтеся, що ви ввімкнули резервне копіювання бесід у налаштуваннях.", "foregroundServiceRunning": "Це сповіщення з'являється під час роботи основної служби.", "screenSharingTitle": "спільний доступ до екрана", - "callingPermissions": "Дозволи на виклик", - "callingAccount": "Обліковий запис для виклику", - "callingAccountDetails": "Дозволяє FluffyChat використовувати основний застосунок Android для набору номера.", - "appearOnTop": "З'являтися зверху", - "appearOnTopDetails": "Дозволяє застосунку показуватися зверху (не потрібно, якщо Fluffychat вже налаштований обліковим записом для викликів)", "newGroup": "Нова група", "newSpace": "Новий простір", - "enterSpace": "Увійти в простір", - "enterRoom": "Увійти в кімнату", - "otherCallingPermissions": "Мікрофон, камера та інші дозволи FluffyChat", "allSpaces": "Усі простори", "screenSharingDetail": "Ви ділитеся своїм екраном FuffyChat", - "numChats": "{number} бесід", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Сховати неважливі державні свята", "doNotShowAgain": "Не показувати знову", "commandHint_cuddle": "Надіслати пригортайку", "googlyEyesContent": "{senderName} надсилає вам гугл-очі", @@ -2359,7 +2099,6 @@ } } }, - "startFirstChat": "Розпочніть свою першу бесіду", "newSpaceDescription": "Простори дозволяють об'єднувати ваші бесіди та створювати приватні або загальнодоступні спільноти.", "encryptThisChat": "Зашифрувати цю бесіду", "disableEncryptionWarning": "З міркувань безпеки ви не можете вимкнути шифрування в бесіді, ув якій воно було ввімкнене раніше.", @@ -2382,24 +2121,8 @@ "readUpToHere": "Читати тут", "jump": "Перейти", "openLinkInBrowser": "Відкрити посилання у браузері", - "allRooms": "Усі групові бесіди", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "reportErrorDescription": "О, ні. Щось пішло не так. Якщо хочете, можете повідомити про помилку розробникам.", "report": "повідомити", - "pleaseTryAgainLaterOrChooseDifferentServer": "Спробуйте пізніше або виберіть інший сервер.", - "signInWithPassword": "Увійти за допомогою пароля", - "signInWith": "Увійти через {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "notAnImage": "Не файл зображення.", "importNow": "Імпортувати зараз", "importEmojis": "Імпорт емодзі", @@ -2408,13 +2131,10 @@ "exportEmotePack": "Експортувати набір смайликів у форматі .zip", "sendTypingNotifications": "Надсилати сповіщення про ввід тексту", "createGroup": "Створити групу", - "inviteContactToGroupQuestion": "Хочете запросити {contact} до бесіди \"{groupName}\"?", "messagesStyle": "Повідомлення:", "shareInviteLink": "Надіслати запрошувальне посилання", "tryAgain": "Повторіть спробу", - "setTheme": "Налаштувати тему:", "setColorTheme": "Налаштувати колірну тему:", - "addChatDescription": "Додати опис бесіди...", "chatPermissions": "Дозволи бесіди", "chatDescription": "Опис бесіди", "chatDescriptionHasBeenChanged": "Опис бесіди змінено", @@ -2443,12 +2163,10 @@ } } }, - "profileNotFound": "Не вдалося знайти користувача на сервері. Можливо, проблема зі з'єднанням або користувач не існує.", "invite": "Запросити", "redactMessageDescription": "Повідомлення буде відредаговано для всіх учасників цієї розмови. Це не можна скасувати.", "setChatDescription": "Налаштувати опис бесіди", "inviteGroupChat": "📨 Запрошення до групової бесіди", - "invitePrivateChat": "📨 Запрошення до приватної бесіди", "emoteKeyboardNoRecents": "Тут з'являться нещодавно використані смайлики...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2484,7 +2202,6 @@ "kickUserDescription": "Користувача вигнали з бесіди, але не заблокували. До загальнодоступних бесід користувач може приєднатися будь-коли.", "blockListDescription": "Ви можете заблокувати користувачів, які вас турбують. Ви не зможете отримувати жодних повідомлень або запрошень до кімнати від користувачів з вашого персонального списку блокування.", "createGroupAndInviteUsers": "Створити групу та запросити користувачів", - "startConversation": "Розпочати розмову", "blockedUsers": "Заблоковані користувачі", "groupCanBeFoundViaSearch": "Групу можна знайти через пошук", "noUsersFoundWithQuery": "На жаль, не знайдено жодного користувача з запитом \"{query}\".Перевірте, чи не було допущено помилки.", @@ -2509,12 +2226,9 @@ "publicSpaces": "Загальнодоступний простір", "passwordIsWrong": "Введений пароль неправильний", "pleaseEnterYourCurrentPassword": "Введіть поточний пароль", - "publicLink": "Загальнодоступне посилання", "nothingFound": "Нічого не знайдено...", - "decline": "Відхилити", "newPassword": "Новий пароль", "passwordsDoNotMatch": "Паролі відрізняються", - "subspace": "Підпростір", "select": "Вибрати", "pleaseChooseAStrongPassword": "Виберіть надійний пароль", "addChatOrSubSpace": "Додати бесіду або підпростір", @@ -2533,18 +2247,6 @@ } } }, - "databaseBuildErrorBody": "Не вдалося створити базу даних SQlite. Застосунок намагається використовувати стару базу даних. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "initAppError": "Виникла помилка під час запуску застосунку", "restoreSessionBody": "Наразі застосунок намагається відновити ваш сеанс з резервної копії. Будь ласка, повідомте про цю помилку розробникам за адресою {url}. Текст помилки: {error}", "@restoreSessionBody": { @@ -2558,14 +2260,6 @@ } } }, - "youInvitedToBy": "📩 Вас запрошено за посиланням на:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "acceptedKeyVerification": "{sender} погоджується звірити ключі", "@acceptedKeyVerification": { "type": "String", @@ -2596,15 +2290,6 @@ "transparent": "Прозорий", "sendReadReceiptsDescription": "Інші учасники бесіди бачитимуть, що ви прочитали повідомлення.", "formattedMessages": "Форматовані повідомлення", - "forwardMessageTo": "Переслати повідомлення до {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "Надіслати підтвердження прочитання", "sendTypingNotificationsDescription": "Інші учасники бесіди бачитимуть, коли ви набираєте нове повідомлення.", "formattedMessagesDescription": "Показувати розширений вміст повідомлень, наприклад, жирний текст, використовуючи markdown.", @@ -2639,11 +2324,6 @@ } } }, - "presenceStyle": "Присутність:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Показувати повідомлення про стан від інших користувачів", "@presencesToggle": { "type": "String", @@ -2672,36 +2352,14 @@ "customEmojisAndStickers": "Власні емодзі та наліпки", "customEmojisAndStickersBody": "Додавайте або діліться власними емодзі або наліпками, які можна використовувати в будь-якій бесіді.", "createNewAddress": "Створити нову адресу", - "userRole": "Роль користувача", - "minimumPowerLevel": "{level} — це найнижчий рівень повноважень.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "commandHint_unignore": "Не ігнорувати цей Matrix ID", "knockRestricted": "Стук обмежено", "appLockDescription": "Блокувати застосунок, коли не використовується ПІН-код", "hideRedactedMessages": "Сховати змінені повідомлення", "hideRedactedMessagesBody": "Якщо хтось змінить повідомлення, його більше не буде видно в бесіді.", "hideInvalidOrUnknownMessageFormats": "Сховати недійсні або невідомі формати повідомлень", - "hideMemberChangesInPublicChats": "Сховати зміни користувачів у загальнодоступних бесідах", - "hideMemberChangesInPublicChatsBody": "Не показувати в хронології бесіди, якщо хтось приєднується до загальнодоступної бесіди або виходить з неї, щоб покращити її читабельність.", "overview": "Огляд", - "notifyMeFor": "Сповіщати мене про", "passwordRecoverySettings": "Налаштування відновлення пароля", - "userWouldLikeToChangeTheChat": "{user} хоче приєднатися до бесіди.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Загальнодоступне посилання ще не створено", "knock": "Постукатись", "knocking": "Стукаються", "noDatabaseEncryption": "Шифрування бази даних не підтримується на цій платформі", @@ -2802,27 +2460,11 @@ }, "changelog": "Зміни", "chatPermissionsDescription": "Визначте, який рівень повноважень необхідний для певних дій у цьому чаті. Рівні повноважень 0, 50 і 100 зазвичай представляють користувачів, модераторів та адміністраторів, але можливі будь-які градації.", - "countChatsAndCountParticipants": "{chats} чати та {participants} учасників", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Більше чатів не знайдено...", - "joinedChats": "Приєднані чати", "unread": "Непрочитані", "sendCanceled": "Надсилання скасовано", "noChatsFoundHere": "Бесід ще немає. Розпочніть спілкування натиснувши кнопку нижче. ⤵️", "loginWithMatrixId": "Увійти за допомогою Matrix-ID", - "discoverHomeservers": "Знайти домашні сервери", - "whatIsAHomeserver": "Що таке домашній сервер?", - "homeserverDescription": "Усі ваші дані зберігаються на домашньому сервері, так само як у постачальника послуг електронної пошти. Ви можете вибрати, який домашній сервер ви хочете використовувати, водночас ви можете спілкуватися з усіма. Докладніше на https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "Здається, це несумісний домашній сервер. Неправильна URL-адреса?", "calculatingFileSize": "Обчислення розміру файлу...", "prepareSendingAttachment": "Підготовка до надсилання вкладення...", @@ -2919,7 +2561,6 @@ "appWantsToUseForLoginDescription": "Цим ви дозволяєте застосунку та вебсайту ділитися інформацією про вас.", "open": "Відкрити", "waitingForServer": "Очікування сервера...", - "appIntroduction": "FluffyChat дає змогу спілкуватися з друзями у різних месенджерах. Дізнайтеся більше на https://matrix.org або просто натисніть *Продовжити*.", "shareKeysWithDescription": "Яким пристроям довіряти, щоб вони могли читати ваші повідомлення в зашифрованих бесідах?", "verifiedDevicesOnly": "Лише верифіковані пристрої", "contentNotificationSettings": "Налаштування сповіщень про вміст", @@ -2981,10 +2622,7 @@ "notificationRuleEncryptedRoomOneToOne": "Зашифрована кімната \"Один на один\"", "deletePushRuleCanNotBeUndone": "Якщо ви видалите це налаштування сповіщень, відновити його буде неможливо.", "ignoreUser": "Ігнорувати користувача", - "setCustomPermissionLevel": "Встановити рівень користувацьких прав", - "normalUser": "Звичайний користувач", "notificationRuleEncryptedDescription": "Повідомляє користувача про повідомлення в зашифрованих кімнатах.", - "setPermissionsLevelDescription": "Будь ласка, виберіть заздалегідь визначену роль нижче або введіть користувацький рівень прав від 0 до 100.", "notificationRuleRoomServerAclDescription": "Приховує сповіщення про списки контролю доступу (ACL) сервера кімнати.", "notificationRuleReaction": "Реакція", "notificationRuleCallDescription": "Повідомляє користувача про виклики.", @@ -3024,10 +2662,6 @@ "longPressToRecordVoiceMessage": "Затисніть, щоб записати голосове повідомлення.", "pause": "Призупинити", "resume": "Продовжити", - "newSubSpace": "Новий вкладений простір", - "moveToDifferentSpace": "Перемістити в інший простір", - "moveUp": "Перемістити вище", - "moveDown": "Переместити нижче", "removeFromSpaceDescription": "Бесіду буде видалено з простору, та вона залишиться у вашому списку бесід.", "countChats": "{chats} бесід", "@countChats": { @@ -3070,7 +2704,6 @@ "startPoll": "Розпочати опитування", "endPoll": "Завершити опитування", "answersVisible": "Відповіді видимі", - "answersHidden": "Відповіді сховано", "pollQuestion": "Питання опитування", "answerOption": "Варіант відповіді", "addAnswerOption": "Додати варіант відповіді", @@ -3134,7 +2767,6 @@ "logs": "Журнали", "advancedConfigs": "Розширені налаштування", "advancedConfigurations": "Розширені налаштування", - "signInWithLabel": "Увійти через:", "identityServer": "Сервер профілів:", "clientWellKnownInformation": "Дані клієнту із .well-known:", "federationBaseUrl": "Основний URL федерації", @@ -3145,4 +2777,4 @@ "signInGreeting": "Ви вже маєте обліковий запис у Matrix? Ласкаво просимо! Виберіть свій домашній сервер і ввійдіть.", "appIntro": "За допомогою FluffyChat ви можете спілкуватися зі своїми друзями. Це безпечний децентралізований месенджер [matrix]! Дізнайтеся більше на сайті https://matrix.org або просто зареєструйтеся.", "theProcessWasCanceled": "Процес скасовано." -} +} \ No newline at end of file diff --git a/lib/l10n/intl_uz.arb b/lib/l10n/intl_uz.arb index a4df2898..3567af88 100644 --- a/lib/l10n/intl_uz.arb +++ b/lib/l10n/intl_uz.arb @@ -1,13 +1,10 @@ { "repeatPassword": "Parolni takrorlang", - "normalUser": "Oddiy foydalanuvchi", "alwaysUse24HourFormat": "true", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, "notAnImage": "Rasm fayli emas.", - "setCustomPermissionLevel": "Maxsus ruxsatlar darajasini sozlash", - "setPermissionsLevelDescription": "Quyidagi oldindan belgilangan rolni tanlang yoki 0-100 orasidagi maxsus ruxsatlar darajasini kiriting.", "ignoreUser": "Foydalanuvchini e’tiborsiz qoldirish", "remove": "O‘chirish", "@remove": { @@ -72,7 +69,6 @@ } } }, - "addChatDescription": "Suhbat tavsifini kiriting...", "addToSpace": "Maydonga qo‘shish", "admin": "Admin", "@admin": { @@ -199,33 +195,8 @@ } }, "sendOnEnter": "Enterda yuborish", - "badServerVersionsException": "Homeserver quyidagi Spec versiyalarini qo'llab-quvvatlaydi:\n{serverVersions}\nLekin bu ilova faqat {supportedVersions} versiyalarini qo'llab-quvvatlaydi", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "countChatsAndCountParticipants": "{chats} suhbatlar va {participants} ishtirokchilar", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "Boshqa chatlar topilmadi...", "noChatsFoundHere": "Bu yerda hali chat topilmadi. Quyidagi tugmadan foydalanib, kimdir bilan yangi suhbat boshlang. ⤵️", - "joinedChats": "Qo'shilgan suhbatlar", "unread": "Oʻqilmagan", "space": "Boʻshliq", "spaces": "Boʻshliqlar", @@ -261,11 +232,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "Bot xabarlari", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "Bekor qilish", "@cancel": { "type": "String", @@ -471,7 +437,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "Suhbat bu maydonga kiritildi", "changedTheRoomAliases": "{username} xona taxalluslarini oʻzgartirdi", "@changedTheRoomAliases": { "type": "String", @@ -613,31 +578,11 @@ "type": "String", "placeholders": {} }, - "confirm": "Tasdiqlash", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "Ulanish", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "Kontakt guruhga taklif qilindi", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "Displey nomni oʻz ichiga oladi", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "Foydalanuvchi nomini oʻz ichiga oladi", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "Kontent server administratorlariga xabar qilindi", "@contentHasBeenReported": { "type": "String", @@ -733,33 +678,6 @@ } } }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "Bu sizning foydalanuvchi hisobingizni oʻchirib qoʻyadi. Buni qaytarib boʻlmaydi! Ishonchingiz komilmi?", "@deactivateAccountWarning": { "type": "String", @@ -805,11 +723,6 @@ "type": "String", "placeholders": {} }, - "allRooms": "Barcha guruh suhbatlar", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "emotePacks": "Guruh uchun Emote toʻplamlar", "@emotePacks": { "type": "String", @@ -831,11 +744,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "Siz emote qisqa kodi va rasmni tanlashingiz kerak!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "Boʻsh suhbat", "@emptyChat": { "type": "String", @@ -891,11 +799,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "Yangi guruhga oʻtish", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "Guruh", "@group": { "type": "String", @@ -991,7 +894,6 @@ "type": "String", "placeholders": {} }, - "inviteContactToGroupQuestion": "{contact} ni \"{groupName}\" suhbatiga taklif qilishni istaysizmi?", "inviteContactToGroup": "Kontaktni {groupName} ga taklif qiling", "@inviteContactToGroup": { "type": "String", @@ -1028,11 +930,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "Men uchun taklif qilish", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} sizni FluffyChat’ga taklif qildi.\n1. fluffychat.im saytiga tashrif buyuring va ilovani oʻrnating.\n2. Roʻyxatdan oʻting yoki tizimga kiring.\n3. Taklif havolasini oching:\n{link}", "@inviteText": { "type": "String", @@ -1121,11 +1018,6 @@ "placeholders": {} }, "homeserver": "Uy serveri", - "enterYourHomeserver": "Uy serveriga kiring", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "errorObtainingLocation": "Joylashuv axboroti olinmadi: {error}", "@errorObtainingLocation": { "type": "String", @@ -1212,11 +1104,6 @@ "type": "String", "placeholders": {} }, - "license": "Litsenziya", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "Yorugʻlik", "@lightTheme": { "type": "String", @@ -1233,10 +1120,6 @@ }, "dehydrate": "Sessiyani eksport qilish va qurilmani oʻchirish", "dehydrateWarning": "Bu amalni bekor qilib boʻlmaydi. Zaxira faylini xavfsiz saqlang.", - "dehydrateTor": "TOR foydalanuvchilari: Seansni eksport qilish", - "dehydrateTorLong": "TOR foydalanuvchilari uchun oynani yopishdan oldin seansni eksport qilish tavsiya etiladi.", - "hydrateTor": "TOR foydalanuvchilari: Seans eksportini import qilish", - "hydrateTorLong": "Seansingizni oxirgi marta TOR’da eksport qildingizmi? Uni tezda import qiling va suhbatni davom ettiring.", "hydrate": "Zaxira faylidan tiklash", "loadingPleaseWait": "Yuklanmoqda… Iltimos, kuting.", "@loadingPleaseWait": { @@ -1277,11 +1160,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "Aʼzo oʻzgarishlari", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "Qayd etmoq", "@mention": { "type": "String", @@ -1392,11 +1270,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "Ushbu hisob uchun bildirishnomalar yoqildi", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} foydalanuvchilar yozmoqda…", "@numUsersTyping": { "type": "String", @@ -1456,11 +1329,6 @@ "type": "String", "placeholders": {} }, - "openVideoCamera": "Video uchun kamerani oching", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "oneClientLoggedOut": "Mijozlaringizdan biri tizimdan chiqdi", "addAccount": "Hisob qoʻshish", "editBundlesForAccount": "Bu hisob uchun toʻplamlarni tahrirlash", @@ -1505,21 +1373,13 @@ "type": "String", "placeholders": {} }, - "hideMemberChangesInPublicChats": "Ommaviy suhbatlarda aʼzolarga oʻzgartirishlarni yashirish", - "hideMemberChangesInPublicChatsBody": "Oʻqish qulayligini oshirish uchun kimdir ochiq suhbatga qoʻshilsa yoki undan chiqsa, suhbat vaqt jadvalida koʻrsatilmasin.", "overview": "Umumiy ma'lumot", - "notifyMeFor": "Menga bildirishnoma yuborish", "passwordRecoverySettings": "Parolni qayta tiklash sozlamalari", "passwordRecovery": "Parolni qayta tiklash", "@passwordRecovery": { "type": "String", "placeholders": {} }, - "people": "Odamlar", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "Rasm tanlash", "@pickImage": { "type": "String", @@ -1539,11 +1399,6 @@ } } }, - "pleaseChoose": "Iltimos tanlang", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "Iltimos, kirish kodini tanlang", "@pleaseChooseAPasscode": { "type": "String", @@ -1559,7 +1414,6 @@ "type": "String", "placeholders": {} }, - "pleaseEnterRecoveryKey": "Iltimos, tiklash kalitingizni kiriting:", "pleaseEnterYourPassword": "Iltimos parolingizni kiriting", "@pleaseEnterYourPassword": { "type": "String", @@ -1660,11 +1514,6 @@ } } }, - "rejoin": "Qayta qoʻshilish", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "removeAllOtherDevices": "Qolgan barcha qurilmalarni oʻchirish", "@removeAllOtherDevices": { "type": "String", @@ -1679,11 +1528,6 @@ } } }, - "removeDevice": "Qurilmani oʻchirish", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "Suhbat blokidan chiqazish", "@unbanFromChat": { "type": "String", @@ -1741,15 +1585,6 @@ }, "recoveryKey": "Tiklash kaliti", "recoveryKeyLost": "Tiklash kaliti yo‘qolib qoldimi?", - "seenByUser": "{username} ko‘rgan", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "Yuborish", "@send": { "type": "String", @@ -1793,16 +1628,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "Asl nusxani yuborish", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "Stiker yuborish", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "Video yuborish", "@sendVideo": { "type": "String", @@ -1862,32 +1687,12 @@ } } }, - "separateChatTypes": "To‘g‘ridan-to‘g‘ri suhbatlar va guruhlarni alohida ajratish", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "setAsCanonicalAlias": "Asosiy taxallus sifatida belgilash", "@setAsCanonicalAlias": { "type": "String", "placeholders": {} }, - "setCustomEmotes": "Maxsus hissiyotlarni sozlash", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, "setChatDescription": "Suhbat tavsifini sozlash", - "setInvitationLink": "Taklif havolasini sozlash", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "Ruxsatlar darajasini belgilash", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "Holatni sozlash", "@setStatus": { "type": "String", @@ -1922,21 +1727,11 @@ "type": "String", "placeholders": {} }, - "presenceStyle": "Mavjudlik:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "Boshqa foydalanuvchilarning holat xabarlarini ko‘rsatish", "@presencesToggle": { "type": "String", "placeholders": {} }, - "singlesignon": "Yagona kirish", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "Tashlab ketish", "@skip": { "type": "String", @@ -1966,7 +1761,6 @@ } } }, - "startFirstChat": "Birinchi suhbatni boshlash", "status": "Holati", "@status": { "type": "String", @@ -2017,21 +1811,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "Saralanganni almashtirish", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "O‘chirib qo‘yish", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "O‘qilgan/O‘qilmaganni belgilash", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "Talablar soni oshib ketdi. Keyinroq qayta urining!", "@tooManyRequestsWarning": { "type": "String", @@ -2098,15 +1877,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 ta oʻqilmagan suhbat} other{{unreadCount} ta o‘qilmagan chat}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} va yana {count} kishi yozmoqda…", "@userAndOthersAreTyping": { "type": "String", @@ -2232,11 +2002,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "Fon rasmi:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "Ogohlantirish!", "@warning": { "type": "String", @@ -2308,19 +2073,9 @@ "sender": "Yuboruvchi", "openGallery": "Galereyani ochish", "removeFromSpace": "Guruhdan olib tashlash", - "addToSpaceDescription": "Bu suhbatni unga kiritish uchun guruhni tanlang.", "start": "Boshlash", "usersMustKnock": "Foydalanuvchilar taqillatishi kerak", "noOneCanJoin": "Hech kim qoʻshila olmaydi", - "userWouldLikeToChangeTheChat": "{user} suhbatga qoʻshilmoqchi.", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "Hech qanday ochiq havola yaratilmagan", "knock": "Taqillating", "users": "Foydalanuvchilar", "unlockOldMessages": "Eski xabarlarni qulfdan chiqaring", @@ -2342,29 +2097,11 @@ "foregroundServiceRunning": "Bu bildirishnoma old plan xizmati ishlab turgan paytda paydo bo‘ladi.", "screenSharingTitle": "Ekranni ulashish", "screenSharingDetail": "Siz ekraningizni FuffyChat’da ulashmoqdasiz", - "callingPermissions": "Qoʻngʻiroq qilish ruxsatlar", - "callingAccount": "Qoʻngʻiroq qilishi hisobi", - "callingAccountDetails": "FluffyChat’ga mahalliy android terish ilovasidan foydalanishga ruxsat beradi.", - "appearOnTop": "Teppada paydo boʻladi", - "appearOnTopDetails": "Ilovaning yuqori qismida koʻrinishiga ruxsat beradi (agar sizda Fluffychat qoʻngʻiroq qiluvchi hisobi sifatida oʻrnatilgan boʻlsa, kerak emas)", - "otherCallingPermissions": "Mikrofon, kamera va boshqa FluffyChat ruxsatnomalari", "whyIsThisMessageEncrypted": "Nima uchun bu xabarni oʻqib boʻlmaydi?", "noKeyForThisMessage": "Bu xabar siz ushbu qurilmada hisobingizga kirishdan oldin yuborilgan boʻlsa sodir boʻlishi mumkin.\n\nShuningdek, joʻnatuvchi qurilmangizni bloklagan yoki internet ulanishida biron bir muammo yuzaga kelgan boʻlishi mumkin.\n\nXabarni boshqa sessiyada oʻqiy olasizmi? Keyin xabarni undan uzatishingiz mumkin! Sozlamalar > Qurilmalar boʻlimiga oʻting va qurilmalaringiz bir-birini tasdiqlaganligiga ishonch hosil qiling. Keyingi safar xonani ochganingizda va ikkala sessiya ham oldinda boʻlganda, kalitlar avtomatik ravishda uzatiladi.\n\nTizimdan chiqishda yoki qurilmalarni almashtirishda kalitlarni yoʻqotishni xohlamaysizmi? Sozlamalarda suhbatning zaxira nusxasini yoqganingizga ishonch hosil qiling.", "newGroup": "Yangi guruh", "newSpace": "Yangi maydon", - "enterSpace": "Maydonga kirish", - "enterRoom": "Guruhga kirish", "allSpaces": "Barcha maydonlar", - "numChats": "{number} suhbatlar", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "Muhim boʻlmagan shtat tadbirlarini yashirish", "hidePresences": "Holat roʻyxati yashirilsinmi?", "doNotShowAgain": "Qaytib koʻrsatilmasin", "wasDirectChatDisplayName": "Boʻsh suhbat ({oldDisplayName} edi)", @@ -2378,14 +2115,12 @@ }, "newSpaceDescription": "Maydonlar sizga suhbatlaringizni birlashtirish va shaxsiy yoki ommaviy hamjamiyatlarni yaratish imkonini beradi.", "openChat": "Suhbatni ochish", - "indexedDbErrorLong": "Xabarlarni saqlash, afsuski, sukut bo'yicha maxfiy rejimda yoqilmagan.\nIltimos, tashrif buyuring\n- about:config\n- dom.indexedDB.privateBrowsing.enabled ga true berilgan\nAks holda, FluffyChat ni ishga tushirish mumkin emas.", "youJoinedTheChat": "Siz suhbatga qoʻshildingiz", "encryptThisChat": "Bu suhbatni shifrlash", "disableEncryptionWarning": "Xavfsizlik nuqtai nazaridan, agar u ilgari yoqilgan boʻlsa, suhbatda shifrlashni oʻchirib qoʻyolmaysiz.", "reopenChat": "Suhbatni qayta ochish", "noBackupWarning": "Diqqat! Suhbatni zaxiralashni yoqmasangiz, shifrlangan xabarlaringizga kirish huquqini yoʻqotasiz. Tizimdan chiqishdan oldin chatni zaxiralashni yoqishingiz tavsiya etiladi.", "inviteGroupChat": "📨 Guruh suhbatiga taklif", - "invitePrivateChat": "📨 Shaxsiy suhbatga taklif", "archiveRoomDescription": "Suhbat arxivga koʻchiriladi. Boshqa foydalanuvchilar sizning suhbatdan chiqqaningizni koʻra oladilar.", "roomUpgradeDescription": "Keyin suhbat yangi guruh versiyasi bilan qayta yaratiladi. Barcha ishtirokchilarga yangi suhbatga oʻtishlari kerakligi haqida xabar beriladi. Guruh versiyalari haqida koʻproq maʼlumotni https://spec.matrix.org/latest/rooms/ manzilida topishingiz mumkin", "banUserDescription": "Foydalanuvchi suhbatdan bloklanadi va blokdan chiqarilmaguncha suhbatga qayta kira olmaydi.", @@ -2436,7 +2171,6 @@ "noticeChatBackupDeviceVerification": "Eslatma: Barcha qurilmalaringizni suhbat zaxira nusxasiga ulaganingizda, ular avtomatik ravishda tasdiqlanadi.", "welcomeText": "Hey Hey 👋 Bu FluffyChat. Siz https://matrix.org bilan mos keladigan istalgan uy serveriga kirishingiz mumkin. Va keyin istalgan kishi bilan suhbatlashishingiz mumkin. Bu ulkan markazlashtirilmagan xabar almashish tarmog'i!", "unableToJoinChat": "Chatga qoʻshilib boʻlmadi. Ehtimol, boshqa tomon suhbatni allaqachon yopib qoʻygan.", - "appIntroduction": "FluffyChat sizga turli messenjerlar orqali doʻstlaringiz bilan suhbatlashish imkonini beradi. Batafsil maʼlumotni https://matrix.org saytidan oling yoki shunchaki *Davom etish* tugmasini bosing.", "newChatRequest": "📩 Yangi suhbat uchun soʻrov", "shareKeysWithDescription": "Shifrlangan suhbatlarda xabarlaringizni oʻqishlari uchun qaysi qurilmalarga ishonish kerak?", "enterNewChat": "Yangi suhbatga kirish", @@ -2452,16 +2186,6 @@ }, "backToMainChat": "Asosiy suhbatga qaytish", "pleaseEnterRecoveryKeyDescription": "Eski xabarlaringizni qulfdan chiqarish uchun, iltimos, avvalgi seansdan yaratilgan tiklash kalitingizni kiriting. Sizning tiklash kalitingiz parolingiz EMAS.", - "publish": "Nashr qilish", - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "markAsRead": "Oʻqilgan sifatida belgilash", "reportUser": "Foydalanuvchi haqida xabar berish", "dismiss": "Rad qilmoq", @@ -2485,21 +2209,6 @@ "unsupportedAndroidVersionLong": "Bu funksiya Androidning yangi versiyasini talab qiladi. Iltimos, yangilanishlar yoki Lineage OS qoʻllab-quvvatlashini tekshiring.", "videoCallsBetaWarning": "Iltimos, video qoʻngʻiroqlar hozirda beta-versiyada ekanligini unutmang. Ular kutilganidek ishlamasligi yoki barcha platformalarda umuman ishlamasligi mumkin.", "experimentalVideoCalls": "Tajriba video qoʻngʻiroqlar", - "emailOrUsername": "Elektron pochta yoki foydalanuvchi nomi", - "indexedDbErrorTitle": "Shaxsiy rejim bilan bogʻliq muammolar", - "switchToAccount": "{number} hisobiga oʻtish", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "Keyingi hisob", - "previousAccount": "Oldingi hisob", - "addWidget": "Vidjet qoʻshish", - "widgetVideo": "Video", "sorryThatsNotPossible": "Kechirasiz... bu mumkin emas", "deviceKeys": "Qurilma kalitlari:", "noOtherDevicesFound": "Boshqa qurilma topilmadi", @@ -2527,19 +2236,6 @@ "openLinkInBrowser": "Havolani brauzerda ochish", "reportErrorDescription": "😭 Voy yo‘q. Nimadir xato ketdi. Agar xohlasangiz, bu xato haqida dasturchilarga xabar berishingiz mumkin.", "report": "hisobot", - "signInWithPassword": "Parol bilan kirish", - "pleaseTryAgainLaterOrChooseDifferentServer": "Keyinroq qayta urining yoki boshqa serverni tanlang.", - "signInWith": "{provider} bilan kiring", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "profileNotFound": "Foydalanuvchi serverda topilmadi. Ehtimol, ulanishda muammo bor yoki foydalanuvchi mavjud emas.", - "setTheme": "Mavzu tanlash:", "setColorTheme": "Rang mavzusini sozlash:", "invite": "Taklif qilish", "invalidInput": "Xato kiritildi!", @@ -2569,7 +2265,6 @@ "createGroupAndInviteUsers": "Guruh yaratish va foydalanuvchilarni taklif qilish", "groupCanBeFoundViaSearch": "Guruh qidiruv orqali topilishi mumkin", "wrongRecoveryKey": "Kechirasiz... bu toʻgʻri tiklash kaliti emasga oʻxshaydi.", - "startConversation": "Suhbat boshlash", "commandHint_sendraw": "Xom jsonni yuborish", "databaseMigrationTitle": "Maʼlumotlar bazasi optimallashtirilgan", "databaseMigrationBody": "Iltimos, kuting. Bu biroz vaqt olishi mumkin.", @@ -2581,39 +2276,14 @@ "pleaseChooseAStrongPassword": "Iltimos kuchli maxfiy soʻz tanlang", "passwordsDoNotMatch": "Maxfiy soʻzlar mos kelmadi", "passwordIsWrong": "Siz kiritgan maxfiy soʻz xato", - "publicLink": "Ommaviy havola", "createNewAddress": "Yangi manzil yarating", "joinSpace": "Maydonga qoʻshiling", "publicSpaces": "Ommaviy maydonlar", - "subspace": "Sub-maydonlar", - "decline": "Rad qilish", "thisDevice": "Ushbu qurilma:", "initAppError": "Ilovani ishga tushirishda xatolik yuz berdi", - "userRole": "Foydalanuvchi roli", - "minimumPowerLevel": "{level} minimal quvvat darajasidir.", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "searchMore": "Koʻproq qidirish...", "gallery": "Galereya", "files": "Fayllar", - "databaseBuildErrorBody": "SQlite maʼlumotlar bazasini yaratib boʻlmadi. Ilova hozircha eski maʼlumotlar bazasidan foydalanishga harakat qilmoqda. Iltimos, ushbu xato haqida {url} manzilidagi dasturchilarga xabar bering. Xato xabari: {error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sessionLostBody": "Seansingiz yoʻqoldi. Iltimos, ushbu xato haqida {url} manzilidagi dasturchilarga xabar bering. Xato xabari: {error}", "@sessionLostBody": { "type": "String", @@ -2638,15 +2308,6 @@ } } }, - "forwardMessageTo": "Xabarni {roomName}ga yoʻnaltirilsinmi?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceipts": "Oʻqilganlik haqida xabarnomalarni yuborish", "formattedMessages": "Formatlangan xabarlar", "formattedMessagesDescription": "Markdown yordamida qalin matn kabi boy xabar mazmunini koʻrsating.", @@ -2793,9 +2454,6 @@ "changelog": "O‘zgarishlar jurnali", "sendCanceled": "Yuborish bekor qilindi", "loginWithMatrixId": "Matriks-ID bilan kirish", - "discoverHomeservers": "Uy serverlarini kashf eting", - "whatIsAHomeserver": "Uy serveri nima?", - "homeserverDescription": "Barcha ma’lumotlaringiz xuddi elektron pochta provayderi kabi uy serverda saqlanadi. Siz qaysi uy serveridan foydalanishni tanlashingiz mumkin, shu bilan birga siz hamma bilan muloqot qilishingiz mumkin. Batafsil: https://matrix.org.", "doesNotSeemToBeAValidHomeserver": "Uy serveri mos emasga o‘xshaydi. URL xato kiritilganmi?", "calculatingFileSize": "Fayl hajmi hisoblanmoqda...", "prepareSendingAttachment": "Yuborish uchun biriktirmani tayyorlang...", @@ -2922,10 +2580,6 @@ "longPressToRecordVoiceMessage": "Ovozli xabarni yozib olish uchun uzoq bosing.", "pause": "Pauza", "resume": "Davom etish", - "newSubSpace": "Yangi quyi maydon", - "moveToDifferentSpace": "Boshqa maydonga o‘tish", - "moveUp": "Yuqoriga surish", - "moveDown": "Pastga surish", "spaceMemberOf": "{spaces} maydoni a’zosi", "@spaceMemberOf": { "type": "String", @@ -2958,7 +2612,6 @@ "startPoll": "So‘rovni boshlash", "endPoll": "So‘rovnomani yakunlash", "answersVisible": "Javoblar ko‘rinadi", - "answersHidden": "Javoblar berkitildi", "pollQuestion": "So‘rovnoma savoli", "answerOption": "Javob varianti", "addAnswerOption": "Javob variantini kiritish", @@ -2985,13 +2638,6 @@ } }, "thread": "Sahifa", - "widgetEtherpad": "Matnli qayd", - "widgetJitsi": "Jitsi Meet", - "widgetCustom": "Maxsus", - "widgetName": "Nomi", - "widgetUrlError": "Bu yaroqli URL emas.", - "widgetNameError": "Iltimos, displey nomini kiriting.", - "errorAddingWidget": "Vidjet kiritilmadi.", "youRejectedTheInvitation": "Taklifni rad etdingiz", "youAcceptedTheInvitation": "👍 Taklifni qabul qildingiz", "youBannedUser": "Siz {user}ni blokladingiz", @@ -3010,14 +2656,6 @@ } } }, - "youInvitedToBy": "📩 Sizni quyidagi havola orqali taklif qilishdi:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "youInvitedBy": "📩 Sizni {user} taklif qildi", "@youInvitedBy": { "placeholders": { @@ -3079,11 +2717,6 @@ "learnMore": "Batafsil", "yourGlobalUserIdIs": "Global foydalanuvchi ID raqamingiz: ", "notificationRuleTombstone": "Qabrtosh", - "identity": "Shaxs", - "@identity": { - "type": "String", - "placeholders": {} - }, "emojis": "Emojilar", "changedTheChatDescription": "{username} chat tavsifini o‘zgartirdi", "changedTheChatName": "{username} chat nomini o‘zgartirdi", @@ -3124,6 +2757,5 @@ }, "logs": "Jurnallar", "advancedConfigs": "Kengaytirilgan konfiguratsiyalar", - "advancedConfigurations": "Kengaytirilgan sozlamalar", - "signInWithLabel": "Kirish:" -} + "advancedConfigurations": "Kengaytirilgan sozlamalar" +} \ No newline at end of file diff --git a/lib/l10n/intl_vi.arb b/lib/l10n/intl_vi.arb index 584c2990..0897f5cd 100644 --- a/lib/l10n/intl_vi.arb +++ b/lib/l10n/intl_vi.arb @@ -167,33 +167,6 @@ "type": "String", "placeholders": {} }, - "dateWithYear": "{day}/{month}/{year}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithoutYear": "{day}/{month}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "dateAndTimeOfDay": "{date}, {timeOfDay}", "@dateAndTimeOfDay": { "type": "String", @@ -253,16 +226,6 @@ "type": "String", "placeholders": {} }, - "connect": "Kết nối", - "@connect": { - "type": "String", - "placeholders": {} - }, - "confirm": "Xác nhận", - "@confirm": { - "type": "String", - "placeholders": {} - }, "compareNumbersMatch": "So sánh và đảm bảo các số sau đây giống trên máy còn lại", "@compareNumbersMatch": { "type": "String", @@ -445,18 +408,6 @@ "type": "String", "placeholders": {} }, - "badServerVersionsException": "Máy chủ hỗ trợ Spec phiên bản:\n{serverVerions}\nNhưng ứng dụng này chỉ hỗ trợ {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "badServerLoginTypesException": "Máy chủ nhà hỗ trợ kiểu đăng nhập:\n{serverVersions}\nNhưng ứng dụng này chỉ hỗ trợ:\n{supportedVersions}", "@badServerLoginTypesException": { "type": "String", @@ -505,14 +456,8 @@ "@makeAdminDescription": {}, "setColorTheme": "Chọn màu giao diện:", "@setColorTheme": {}, - "callingAccount": "Gọi tài khoản", - "@callingAccount": {}, "openLinkInBrowser": "Mở đường dẫn trong trình duyệt", "@openLinkInBrowser": {}, - "setTheme": "Chọn giao diện:", - "@setTheme": {}, - "invitePrivateChat": "📨 Mời trò chuyện riêng tư", - "@invitePrivateChat": {}, "inviteGroupChat": "📨 Mời nhóm trò chuyện", "@inviteGroupChat": {}, "addToSpace": "Thêm vào không gian", @@ -523,12 +468,8 @@ "@importFromZipFile": {}, "exportEmotePack": "Xuất gói biểu cảm bằng tệp .zip", "@exportEmotePack": {}, - "hideUnimportantStateEvents": "Ẩn các sự kiện không quan trọng", - "@hideUnimportantStateEvents": {}, "replace": "Thay thế", "@replace": {}, - "addChatDescription": "Thêm mô tả hội thoại...", - "@addChatDescription": {}, "report": "báo cáo", "@report": {}, "remove": "Loại bỏ", @@ -540,10 +481,6 @@ "@restricted": {}, "newSpace": "Không gian mới", "@newSpace": {}, - "enterRoom": "Nhập phòng", - "@enterRoom": {}, - "signInWithPassword": "Đăng nhập với mật khẩu", - "@signInWithPassword": {}, "all": "Tất cả", "@all": { "type": "String", @@ -587,8 +524,6 @@ }, "reportErrorDescription": "😭 Ôi. Có lỗi xảy ra. Bạn có thể báo cáo lỗi tới nhà phát triển nếu muốn.", "@reportErrorDescription": {}, - "profileNotFound": "Không tìm thấy người dùng này tại máy chủ. Có thể do lỗi kết nối hoặc người dùng không tồn tại.", - "@profileNotFound": {}, "banUserDescription": "Người dùng sẽ bị cấm khỏi cuộc trò chuyện và không thể tham gia lại cho tới khi được gỡ cấm.", "@banUserDescription": {}, "learnMore": "Tìm hiểu thêm", @@ -601,43 +536,23 @@ "@noOtherDevicesFound": {}, "fileIsTooBigForServer": "Máy chủ báo cáo rằng tệp tin quá lớn để gửi.", "@fileIsTooBigForServer": {}, - "signInWith": "Đăng nhập với {provider}", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "notAnImage": "Không phải tệp ảnh.", "@notAnImage": {}, "importNow": "Nhập vào", "@importNow": {}, "allSpaces": "Tất cả không gian", "@allSpaces": {}, - "enterSpace": "Nhập không gian", - "@enterSpace": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "Hãy thử lại sau hoặc chọn 1 máy chủ khác.", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, "jumpToLastReadMessage": "Đi tới tin nhắn đã đọc mới nhất", "@jumpToLastReadMessage": {}, "commandHint_ignore": "Phớt lờ matrix ID này", "@commandHint_ignore": {}, "appLockDescription": "Khoá ứng dụng khi không dùng bằng mã pin", "@appLockDescription": {}, - "notifyMeFor": "Bật thông báo cho", - "@notifyMeFor": {}, "settings": "Cài đặt", "@settings": { "type": "String", "placeholders": {} }, - "sendSticker": "Gửi nhãn dán", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "fileHasBeenSavedAt": "Tệp đã được lưu tại {path}", "@fileHasBeenSavedAt": { "type": "String", @@ -651,17 +566,6 @@ "@readUpToHere": {}, "jump": "Đi tới", "@jump": {}, - "callingPermissions": "Quyền gọi điện", - "@callingPermissions": {}, - "numChats": "{number} cuộc hội thoại", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, "hidePresences": "Ẩn danh sách trạng thái?", "@hidePresences": {}, "sorryThatsNotPossible": "Xin lỗi... không khả dụng", @@ -732,14 +636,8 @@ } } }, - "setCustomPermissionLevel": "Cài mức phân quyền", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "Vui lòng chọn vai trò được xác định trước bên dưới hoặc nhập mức quyền tùy chỉnh từ 0 đến 100.", - "@setPermissionsLevelDescription": {}, "ignoreUser": "Chặn người dùng", "@ignoreUser": {}, - "normalUser": "Người dùng thường", - "@normalUser": {}, "commandHint_roomupgrade": "Nâng cấp phòng lên phiên bản mặc định", "@commandHint_roomupgrade": {}, "commandHint_cuddle": "Gửi cái ôm", @@ -780,15 +678,6 @@ "@sendOnEnter": {}, "continueText": "Tiếp", "@continueText": {}, - "videoWithSize": "Video ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "markAsRead": "Đánh dấu đã đọc", "@markAsRead": {}, "reportUser": "Báo cáo người dùng", @@ -811,4 +700,4 @@ "@pinMessage": {}, "confirmEventUnpin": "Bạn có muốn bỏ ghim sự kiện?", "@confirmEventUnpin": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_yue_Hant.arb b/lib/l10n/intl_yue_Hant.arb index cce50f37..8e3c8b25 100644 --- a/lib/l10n/intl_yue_Hant.arb +++ b/lib/l10n/intl_yue_Hant.arb @@ -1,7 +1,5 @@ { "@@locale": "yue", - "normalUser": "正常用家", - "@normalUser": {}, "areYouSureYouWantToLogout": "係咪確定要 log out?", "@areYouSureYouWantToLogout": { "type": "String", @@ -38,18 +36,6 @@ } } }, - "badServerVersionsException": "呢個 Homeserver 支持以下 Spec 版本:\n{serverVersions}\n但係個 App 淨係支持 {supoortedVersions} 版本", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "喺傾偈入面 Ban 咗佢", "@banFromChat": { "type": "String", @@ -171,8 +157,6 @@ } } }, - "addChatDescription": "講下關於呢個偈係傾嘅乜嘢……", - "@addChatDescription": {}, "addToSpace": "加落去空間嗰度", "@addToSpace": {}, "admin": "Admin", @@ -265,22 +249,8 @@ "@swipeRightToLeftToReply": {}, "sendOnEnter": "撳 Enter 即 Send", "@sendOnEnter": {}, - "countChatsAndCountParticipants": "{chats} 間房同 {participants} 條友", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "noMoreChatsFound": "搵唔到更多偈傾啦…", "@noMoreChatsFound": {}, - "joinedChats": "入咗嘅房間", - "@joinedChats": {}, "unread": "未讀", "@unread": {}, "space": "空間", @@ -302,11 +272,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "機械人訊息", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "取消", "@cancel": { "type": "String", @@ -328,10 +293,6 @@ }, "confirmMatrixId": "Confirm 你嘅 Matrix ID ,我哋先至可以刪除你嘅 Account。", "@confirmMatrixId": {}, - "setCustomPermissionLevel": "自訂權限級別", - "@setCustomPermissionLevel": {}, "importFromZipFile": "喺 .zip 檔案導入", - "@importFromZipFile": {}, - "setPermissionsLevelDescription": "請喺下面選擇一個預定義嘅角色,或輸入介乎0同100之間嘅自定義權限級別。", - "@setPermissionsLevelDescription": {} -} + "@importFromZipFile": {} +} \ No newline at end of file diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 748fb231..ed4886aa 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -119,18 +119,6 @@ } } }, - "badServerVersionsException": "主服务器支持的 Spec 版本:\n{serverVersions}\n但此应用仅支持 {supportedVersions} 版本", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "从聊天中封禁", "@banFromChat": { "type": "String", @@ -163,11 +151,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "机器人消息", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "取消", "@cancel": { "type": "String", @@ -487,31 +470,11 @@ "type": "String", "placeholders": {} }, - "confirm": "确认", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "连接", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "联系人已被邀请至群组", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "包含昵称", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "包含用户名", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "此内容已被报告至服务器管理员处", "@contentHasBeenReported": { "type": "String", @@ -586,33 +549,6 @@ } } }, - "dateWithoutYear": "{month}-{day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year}-{month}-{day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "这将停用你的用户账户。这不能被撤销!你确定吗?", "@deactivateAccountWarning": { "type": "String", @@ -718,11 +654,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "你需要选择一个表情快捷码和一张图片!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "空聊天", "@emptyChat": { "type": "String", @@ -772,11 +703,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "输入你的主服务器地址", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "一切就绪!", "@everythingReady": { "type": "String", @@ -817,11 +743,6 @@ "type": "String", "placeholders": {} }, - "goToTheNewRoom": "前往新的聊天室", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "group": "群组", "@group": { "type": "String", @@ -893,11 +814,6 @@ "type": "String", "placeholders": {} }, - "identity": "身份", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "忽略", "@ignore": { "type": "String", @@ -959,11 +875,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "发给我的邀请", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} 邀请你使用 FluffyChat。 \n1. 安装 FluffyChat:https://fluffychat.im \n2. 注册或登录 \n3. 打开邀请链接:\n {link}", "@inviteText": { "type": "String", @@ -1043,11 +954,6 @@ "type": "String", "placeholders": {} }, - "license": "许可证", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "浅色", "@lightTheme": { "type": "String", @@ -1091,11 +997,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "成员变更", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "提及", "@mention": { "type": "String", @@ -1191,11 +1092,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "已为此账户启用通知", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} 人正在输入…", "@numUsersTyping": { "type": "String", @@ -1285,11 +1181,6 @@ "type": "String", "placeholders": {} }, - "people": "联系人", - "@people": { - "type": "String", - "placeholders": {} - }, "pickImage": "选择图像", "@pickImage": { "type": "String", @@ -1309,11 +1200,6 @@ } } }, - "pleaseChoose": "请选择", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "pleaseChooseAPasscode": "请选择一个密码", "@pleaseChooseAPasscode": { "type": "String", @@ -1407,11 +1293,6 @@ } } }, - "rejoin": "重新加入", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "移除", "@remove": { "type": "String", @@ -1431,11 +1312,6 @@ } } }, - "removeDevice": "移除设备", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "从聊天中解封", "@unbanFromChat": { "type": "String", @@ -1491,15 +1367,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "被 {username} 看见", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "发送", "@send": { "type": "String", @@ -1534,16 +1401,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "发送原图", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, - "sendSticker": "发送贴纸", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "sendVideo": "发送视频", "@sendVideo": { "type": "String", @@ -1608,21 +1465,6 @@ "type": "String", "placeholders": {} }, - "setCustomEmotes": "设置自定义表情", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "设置邀请链接", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "设置权限级别", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "设置状态", "@setStatus": { "type": "String", @@ -1652,11 +1494,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "单点登录", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, "skip": "跳过", "@skip": { "type": "String", @@ -1717,21 +1554,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "切换收藏", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "切换静音", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "标记已读/未读", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "请求过多。请稍后再试!", "@tooManyRequestsWarning": { "type": "String", @@ -1798,15 +1620,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1{1 个未读聊天} other{{unreadCount} 个未读聊天}}", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} 和其他 {count} 人正在输入…", "@userAndOthersAreTyping": { "type": "String", @@ -1931,11 +1744,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "壁纸:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "警告!", "@warning": { "type": "String", @@ -2085,7 +1893,6 @@ "sendOnEnter": "按 Enter 键发送", "yourChatBackupHasBeenSetUp": "你的聊天记录备份已设置。", "scanQrCode": "扫描二维码", - "chatHasBeenAddedToThisSpace": "聊天已添加到此空间", "homeserver": "服务器", "oneClientLoggedOut": "你的一个客户端已登出", "removeFromBundle": "从此集合中移除", @@ -2103,7 +1910,6 @@ "openGallery": "打开图库", "messageInfo": "消息信息", "time": "时间", - "addToSpaceDescription": "选择一个空间以添加此聊天。", "removeFromSpace": "从此空间中移除", "start": "开始", "commandHint_discardsession": "丢弃会话", @@ -2126,21 +1932,6 @@ "type": "String", "description": "Usage hint for the command /create" }, - "openVideoCamera": "打开相机拍摄视频", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, - "publish": "发布", - "videoWithSize": "视频 ({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "dismiss": "忽略", "markAsRead": "标为已读", "reportUser": "举报用户", @@ -2166,32 +1957,6 @@ "placeCall": "发起通话", "videoCallsBetaWarning": "请注意,视频通话目前处于测试阶段。它们可能不能像预期的那样工作,或者在所有平台上都不能工作。", "experimentalVideoCalls": "实验性的视频通话", - "emailOrUsername": "电子邮箱或用户名", - "switchToAccount": "切换到账户 {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "nextAccount": "下个账户", - "previousAccount": "上个账户", - "widgetVideo": "视频", - "widgetJitsi": "Jitsi Meet", - "widgetCustom": "自定义", - "widgetNameError": "请提供昵称。", - "errorAddingWidget": "添加小部件出错。", - "addWidget": "添加小部件", - "widgetEtherpad": "文本笔记", - "widgetName": "名称", - "widgetUrlError": "这不是有效的 URL。", - "separateChatTypes": "分开私聊和群组", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "youRejectedTheInvitation": "你拒绝了邀请", "youJoinedTheChat": "你加入了聊天", "youBannedUser": "你封禁了 {user}", @@ -2254,7 +2019,6 @@ "storeInSecureStorageDescription": "将恢复密钥存储在此设备的安全存储中。", "storeInAppleKeyChain": "存储在 Apple KeyChain 中", "unlockOldMessages": "解锁旧消息", - "pleaseEnterRecoveryKey": "请输入你的恢复密钥:", "recoveryKey": "恢复密钥", "recoveryKeyLost": "丢失了恢复密钥?", "pleaseEnterRecoveryKeyDescription": "要解锁你的旧邮件,请输入你在之前会话中生成的恢复密钥。 你的恢复密钥不是你的密码。", @@ -2270,15 +2034,9 @@ } } }, - "dehydrateTor": "TOR 用户:导出会话", - "dehydrateTorLong": "建议 TOR 用户在关闭窗口之前导出会话。", - "hydrateTor": "TOR 用户:导入会话导出", "hydrate": "从备份文件恢复", "dehydrate": "导出会话并擦除设备", "dehydrateWarning": "此操作无法撤消。 确保你安全地存储备份文件。", - "indexedDbErrorTitle": "私有模式问题", - "indexedDbErrorLong": "遗憾的是,默认情况下未在私有模式下启用消息存储。\n请访问\n - about:config\n - 将 dom.indexedDB.privateBrowsing.enabled 设置为 true\n否则,无法运行 FluffyChat。", - "hydrateTorLong": "你上次是否导出 TOR 会话? 快速导入它并继续聊天。", "user": "用户", "custom": "自定义", "confirmMatrixId": "请确认你的 Matrix ID 以删除账户。", @@ -2297,28 +2055,10 @@ "noKeyForThisMessage": "如果消息是在你在此设备上登录账户前发送的,就可能发生这种情况。\n\n也有可能是发送者屏蔽了你的设备或网络连接出了问题。\n\n你能在另一个会话中读取消息吗?如果是的话,你可以从它那里传递信息!点击设置 > 设备,并确保你的设备已经相互验证。当你下次打开聊天室,且两个会话都在前台,密钥就会自动传输。\n\n你不想在退出登录或切换设备时丢失密钥?请确保在设置中启用了聊天备份。", "newGroup": "新群组", "newSpace": "新的空间", - "enterSpace": "进入空间", - "enterRoom": "进入聊天室", "allSpaces": "所有空间", - "appearOnTop": "显示在其它应用上方", - "appearOnTopDetails": "允许应用显示在顶部(如果你已经将 Fluffychat 设置为呼叫账户,则不需要授予此权限)", - "otherCallingPermissions": "麦克风、摄像头和其它 FluffyChat 权限", - "callingPermissions": "呼叫权限", - "callingAccountDetails": "允许 FluffyChat 使用本机 android 拨号器应用。", "foregroundServiceRunning": "此通知在前台服务运行时出现。", "screenSharingTitle": "屏幕共享", - "callingAccount": "呼叫账户", "screenSharingDetail": "你正在 FluffyChat 中共享屏幕", - "numChats": "{number} 个聊天", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "隐藏不重要的状态事件", "doNotShowAgain": "不再显示", "googlyEyesContent": "{senderName} 向你发送了“大眼”表情", "@googlyEyesContent": { @@ -2359,7 +2099,6 @@ } } }, - "startFirstChat": "发起你的第一个聊天", "newSpaceDescription": "空间让你可以整合聊天并建立私人或公共社区。", "encryptThisChat": "加密此聊天", "disableEncryptionWarning": "出于安全考虑 ,你不能在之前已启用加密的聊天中禁用加密。", @@ -2372,20 +2111,6 @@ "readUpToHere": "读到此处", "jump": "跳转", "openLinkInBrowser": "在浏览器中打开链接", - "signInWith": "使用 {provider} 登录", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, - "allRooms": "所有群聊", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "fileHasBeenSavedAt": "文件已保存在 {path}", "@fileHasBeenSavedAt": { "type": "String", @@ -2397,8 +2122,6 @@ }, "reportErrorDescription": "😭 哦不。出了点差错。如果你愿意,可以向开发人员报告此错误。", "noBackupWarning": "警告!如果不启用聊天备份,你将无法访问加密消息。强烈建议在退出登录前先启用聊天备份。", - "signInWithPassword": "使用密码登录", - "pleaseTryAgainLaterOrChooseDifferentServer": "请稍后再试或选择其它服务器。", "reopenChat": "重新打开聊天", "importEmojis": "导入表情包", "notAnImage": "不是图像文件。", @@ -2409,10 +2132,7 @@ "sendTypingNotifications": "发送正在输入通知", "createGroup": "创建群组", "shareInviteLink": "分享邀请链接", - "profileNotFound": "服务器上找不到此用户。可能是连接有问题或者用户不存在。", - "inviteContactToGroupQuestion": "你是否要邀请 {contact} 参与聊天 \"{groupName}\"?", "tryAgain": "重试", - "addChatDescription": "添加聊天说明…", "chatPermissions": "聊天权限", "chatDescription": "聊天描述", "chatDescriptionHasBeenChanged": "聊天描述已被更改", @@ -2421,7 +2141,6 @@ "redactMessageDescription": "消息将为此对话中所有参与者删除。此操作无法撤销。", "optionalRedactReason": "(可选)删除此消息的原因...", "setChatDescription": "设置聊天描述", - "setTheme": "设置主题:", "setColorTheme": "设置主题颜色:", "invite": "邀请", "messagesStyle": "消息:", @@ -2448,7 +2167,6 @@ } }, "inviteGroupChat": "📨 群聊邀请", - "invitePrivateChat": "📨 私聊邀请", "emoteKeyboardNoRecents": "最近使用过的表情会出现在这里...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2484,7 +2202,6 @@ "kickUserDescription": "该用户会被踢出聊天但没被封禁。在公开聊天中,该用户可以随时重新加入。", "blockListDescription": "你可以屏蔽打扰你的用户。你将不会收到来自屏蔽列表中用户的任何消息或聊天室邀请。", "createGroupAndInviteUsers": "创建群组并邀请用户", - "startConversation": "开始对话", "blockedUsers": "已屏蔽的用户", "groupCanBeFoundViaSearch": "可通过搜索找到该群组", "noUsersFoundWithQuery": "很遗憾,没有找到有关\"{query}\"的用户。请检查是否输入错误。", @@ -2509,30 +2226,15 @@ "publicSpaces": "公开空间", "passwordIsWrong": "你输入的密码有误", "pleaseEnterYourCurrentPassword": "请输入你当前的密码", - "publicLink": "公开链接", "nothingFound": "未找到任何内容…", - "decline": "拒绝", "newPassword": "新的密码", "passwordsDoNotMatch": "密码不匹配", - "subspace": "子空间", "select": "选择", "pleaseChooseAStrongPassword": "请选择一个强密码", "addChatOrSubSpace": "添加聊天或子空间", "leaveEmptyToClearStatus": "留空以清除你的状态。", "joinSpace": "加入空间", "searchForUsers": "搜索 @用户…", - "databaseBuildErrorBody": "无法构建 SQLite 数据库。目前应用尝试使用旧数据库。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "initAppError": "在初始化应用时发生错误", "sessionLostBody": "你的会话已丢失。请将此错误报告给开发者,网址为 {url}。错误消息为:{error}", "@sessionLostBody": { @@ -2575,15 +2277,6 @@ "formattedMessages": "格式化的消息", "verifyOtherDevice": "🔐 验证其它设备", "verifyOtherUser": "🔐 验证其他用户", - "forwardMessageTo": "转发消息至 {roomName} ?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendReadReceiptsDescription": "聊天中的其他参与者可以看到你是否读过消息。", "acceptedKeyVerification": "{sender} 接受了密钥验证", "@acceptedKeyVerification": { @@ -2631,24 +2324,11 @@ } }, "transparent": "透明", - "youInvitedToBy": "📩 你已通过链接被邀请到:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, "presencesToggle": "显示其他用户的状态消息", "@presencesToggle": { "type": "String", "placeholders": {} }, - "presenceStyle": "是否在线:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "hidePresences": "隐藏状态列表?", "incomingMessages": "传入消息", "stickers": "贴纸", @@ -2675,9 +2355,7 @@ "customEmojisAndStickers": "自定义表情符号和贴纸", "hideRedactedMessages": "隐藏被涂黑的消息", "overview": "概览", - "notifyMeFor": "提示内容", "passwordRecoverySettings": "密码发现设置", - "noPublicLinkHasBeenCreatedYet": "尚未创建公开链接", "knock": "请求", "noOneCanJoin": "无人可以加入", "knocking": "正在请求", @@ -2697,29 +2375,9 @@ }, "hideRedactedMessagesBody": "如果某人涂黑了一条消息,那么在聊天中再也看不到这条消息。", "hideInvalidOrUnknownMessageFormats": "隐藏无效或未知的消息格式", - "hideMemberChangesInPublicChats": "在公开聊天中隐藏成员变化", - "hideMemberChangesInPublicChatsBody": "不在聊天时间线中显示某人是否加入或离开了公开聊天来改进可读性。", - "userWouldLikeToChangeTheChat": "{user} 想加入聊天。", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, "customEmojisAndStickersBody": "添加或分享可用于任何聊天的表情符号或贴纸。", "usersMustKnock": "用户必须请求加入", "noDatabaseEncryption": "数据库加密在此平台上不受支持", - "userRole": "用户角色", - "minimumPowerLevel": "{level} 是最低权限等级。", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "publicChatAddresses": "公开聊天的地址", "createNewAddress": "新建地址", "searchMore": "搜索更多…", @@ -2742,7 +2400,6 @@ "description": "Set to true to always display time of day in 24 hour format." }, "noMoreChatsFound": "找不到更多聊天…", - "joinedChats": "已加入的聊天", "space": "空间", "spaces": "空间", "goToSpace": "转到空间:{space}", @@ -2751,18 +2408,6 @@ "space": {} }, "markAsUnread": "标为未读", - "countChatsAndCountParticipants": "{chats} 个聊天和 {participants} 名参与者", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, "unread": "未读", "userLevel": "{level} - 用户", "@userLevel": { @@ -2820,9 +2465,6 @@ "sendCanceled": "发送被取消", "noChatsFoundHere": "此处尚未找到聊天。使用下方按钮 ⤵️ 开始和某人的新聊天", "loginWithMatrixId": "使用 Matrix-ID 登录", - "discoverHomeservers": "发现主服务器", - "whatIsAHomeserver": "什么是主服务器?", - "homeserverDescription": "主服务器上就像电子邮件提供商,你的所有数据都存储在上面。你可以选择你想使用哪个主服务器。在 https://matrix.org 上了解更多信息。", "doesNotSeemToBeAValidHomeserver": "似乎不是兼容的主服务器。URL 不正确?", "prepareSendingAttachment": "准备发送附件…", "sendingAttachment": "发送附件中…", @@ -2915,7 +2557,6 @@ } } }, - "appIntroduction": "FluffyChat 让使用不同即时通信工具的你和你的好友得以聊天。 访问 https://matrix.org 了解详情或轻按 *继续*。", "newChatRequest": "📩 新的聊天请求", "generalNotificationSettings": "常规通知设置", "userSpecificNotificationSettings": "使用特定通知设置", @@ -2985,10 +2626,7 @@ "notSupportedOnThisDevice": "此设备上不受支持", "enterNewChat": "进入新聊天", "commandHint_roomupgrade": "将此聊天室升级到给定的聊天室版本", - "setCustomPermissionLevel": "设置自定义权限等级", - "setPermissionsLevelDescription": "请在下方选择预定义的角色或输入 0 到 100 间的自定义权限等级。", "ignoreUser": "忽略用户", - "normalUser": "正常用户", "approve": "批准", "youHaveKnocked": "你已请求加入", "pleaseWaitUntilInvited": "在来自该聊天室的某人邀请你之前请等待。", @@ -3024,10 +2662,6 @@ "longPressToRecordVoiceMessage": "长按录制语音消息。", "pause": "暂停", "resume": "继续", - "newSubSpace": "新建子空间", - "moveToDifferentSpace": "移动到别的空间", - "moveUp": "上移", - "moveDown": "下移", "removeFromSpaceDescription": "将从空间移除该聊天,但仍出现在聊天列表中。", "countChats": "{chats} 个聊天", "@countChats": { @@ -3070,7 +2704,6 @@ "startPoll": "启动投票", "endPoll": "结束投票", "answersVisible": "结果可见", - "answersHidden": "结果隐藏", "pollQuestion": "投票问题", "answerOption": "结果选项", "addAnswerOption": "添加结果选项", @@ -3138,7 +2771,6 @@ "logs": "日志", "advancedConfigs": "高级配置", "advancedConfigurations": "高级配置", - "signInWithLabel": "登录方式:", "signIn": "登录", "createNewAccount": "创建新账户", "signUpGreeting": "FluffyChat 是去中心化的!选择您希望创建账户的服务器!", @@ -3156,4 +2788,4 @@ "powerLevel": "权限级别", "setPowerLevelDescription": "权限级别定义群成员在这个聊天室中可以做什么,取值范围 0 到 100。", "owner": "所有者" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_zh_Hant.arb b/lib/l10n/intl_zh_Hant.arb index ea0cd6bf..0e5c1321 100644 --- a/lib/l10n/intl_zh_Hant.arb +++ b/lib/l10n/intl_zh_Hant.arb @@ -118,18 +118,6 @@ } } }, - "badServerVersionsException": "目前伺服器支援的協議版本:\n{serverVersions}\n但本應用程式僅支援 {supportedVersions}", - "@badServerVersionsException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, "banFromChat": "已從聊天室中封鎖", "@banFromChat": { "type": "String", @@ -162,11 +150,6 @@ "type": "String", "placeholders": {} }, - "botMessages": "機器人訊息", - "@botMessages": { - "type": "String", - "placeholders": {} - }, "cancel": "取消", "@cancel": { "type": "String", @@ -391,31 +374,11 @@ "type": "String", "placeholders": {} }, - "confirm": "確認", - "@confirm": { - "type": "String", - "placeholders": {} - }, - "connect": "連接", - "@connect": { - "type": "String", - "placeholders": {} - }, "contactHasBeenInvitedToTheGroup": "聯絡人已被邀請至群組", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} }, - "containsDisplayName": "包含顯示名稱", - "@containsDisplayName": { - "type": "String", - "placeholders": {} - }, - "containsUserName": "包含使用者名稱", - "@containsUserName": { - "type": "String", - "placeholders": {} - }, "contentHasBeenReported": "此內容已被回報給伺服器管理員們", "@contentHasBeenReported": { "type": "String", @@ -490,33 +453,6 @@ } } }, - "dateWithoutYear": "{month} - {day}", - "@dateWithoutYear": { - "type": "String", - "placeholders": { - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, - "dateWithYear": "{year} - {month} - {day}", - "@dateWithYear": { - "type": "String", - "placeholders": { - "year": { - "type": "String" - }, - "month": { - "type": "String" - }, - "day": { - "type": "String" - } - } - }, "deactivateAccountWarning": "這將停用您的帳號。這個決定是不能挽回的!您確定嗎?", "@deactivateAccountWarning": { "type": "String", @@ -617,11 +553,6 @@ "type": "String", "placeholders": {} }, - "emoteWarnNeedToPick": "您需要選取一個表情快捷鍵和一張圖片!", - "@emoteWarnNeedToPick": { - "type": "String", - "placeholders": {} - }, "emptyChat": "空的聊天室", "@emptyChat": { "type": "String", @@ -671,11 +602,6 @@ "type": "String", "placeholders": {} }, - "enterYourHomeserver": "輸入伺服器位址", - "@enterYourHomeserver": { - "type": "String", - "placeholders": {} - }, "everythingReady": "一切就緒!", "@everythingReady": { "type": "String", @@ -787,11 +713,6 @@ "type": "String", "placeholders": {} }, - "identity": "身份", - "@identity": { - "type": "String", - "placeholders": {} - }, "ignore": "無視", "@ignore": { "type": "String", @@ -853,11 +774,6 @@ "type": "String", "placeholders": {} }, - "inviteForMe": "來自我的邀請", - "@inviteForMe": { - "type": "String", - "placeholders": {} - }, "inviteText": "{username} 邀請您使用 FluffyChat\n1. 安裝 FluffyChat:https://fluffychat.im\n2. 登入或註冊\n3. 打開該邀請網址:\n{link}", "@inviteText": { "type": "String", @@ -937,11 +853,6 @@ "type": "String", "placeholders": {} }, - "license": "授權", - "@license": { - "type": "String", - "placeholders": {} - }, "lightTheme": "日間模式", "@lightTheme": { "type": "String", @@ -985,11 +896,6 @@ "type": "String", "placeholders": {} }, - "memberChanges": "變更成員", - "@memberChanges": { - "type": "String", - "placeholders": {} - }, "mention": "提及", "@mention": { "type": "String", @@ -1085,11 +991,6 @@ "type": "String", "placeholders": {} }, - "notificationsEnabledForThisAccount": "已為此帳號啟用通知", - "@notificationsEnabledForThisAccount": { - "type": "String", - "placeholders": {} - }, "numUsersTyping": "{count} 個人正在輸入...…", "@numUsersTyping": { "type": "String", @@ -1271,11 +1172,6 @@ } } }, - "rejoin": "重新加入", - "@rejoin": { - "type": "String", - "placeholders": {} - }, "remove": "移除", "@remove": { "type": "String", @@ -1295,11 +1191,6 @@ } } }, - "removeDevice": "移除裝置", - "@removeDevice": { - "type": "String", - "placeholders": {} - }, "unbanFromChat": "解封聊天室", "@unbanFromChat": { "type": "String", @@ -1340,15 +1231,6 @@ "type": "String", "placeholders": {} }, - "seenByUser": "{username} 已讀", - "@seenByUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, "send": "傳送", "@send": { "type": "String", @@ -1379,11 +1261,6 @@ "type": "String", "placeholders": {} }, - "sendOriginal": "傳送原始內容", - "@sendOriginal": { - "type": "String", - "placeholders": {} - }, "sendVideo": "傳送影片", "@sendVideo": { "type": "String", @@ -1443,21 +1320,6 @@ } } }, - "setCustomEmotes": "自訂表情符號", - "@setCustomEmotes": { - "type": "String", - "placeholders": {} - }, - "setInvitationLink": "設定邀請連結", - "@setInvitationLink": { - "type": "String", - "placeholders": {} - }, - "setPermissionsLevel": "設定權限等級", - "@setPermissionsLevel": { - "type": "String", - "placeholders": {} - }, "setStatus": "設定狀態", "@setStatus": { "type": "String", @@ -1542,21 +1404,6 @@ "type": "String", "placeholders": {} }, - "toggleFavorite": "切換收藏夾", - "@toggleFavorite": { - "type": "String", - "placeholders": {} - }, - "toggleMuted": "切換靜音", - "@toggleMuted": { - "type": "String", - "placeholders": {} - }, - "toggleUnread": "標示為已讀/未讀", - "@toggleUnread": { - "type": "String", - "placeholders": {} - }, "tooManyRequestsWarning": "太多請求了。請稍候再試!", "@tooManyRequestsWarning": { "type": "String", @@ -1623,15 +1470,6 @@ "type": "String", "placeholders": {} }, - "unreadChats": "{unreadCount, plural, =1 {1 unread chat} other { {unreadCount} 個未讀聊天室} }", - "@unreadChats": { - "type": "String", - "placeholders": { - "unreadCount": { - "type": "int" - } - } - }, "userAndOthersAreTyping": "{username} 和其他 {count} 個人正在輸入...…", "@userAndOthersAreTyping": { "type": "String", @@ -1756,11 +1594,6 @@ "type": "String", "placeholders": {} }, - "wallpaper": "桌布:", - "@wallpaper": { - "type": "String", - "placeholders": {} - }, "warning": "警告!", "@warning": { "type": "String", @@ -1826,11 +1659,6 @@ "type": "String", "placeholders": {} }, - "people": "人", - "@people": { - "type": "String", - "placeholders": {} - }, "chats": "聊天室", "@chats": { "type": "String", @@ -1916,11 +1744,6 @@ "@repeatPassword": {}, "yourChatBackupHasBeenSetUp": "您的聊天室記錄備份已設定。", "@yourChatBackupHasBeenSetUp": {}, - "goToTheNewRoom": "前往新聊天室", - "@goToTheNewRoom": { - "type": "String", - "placeholders": {} - }, "commandHint_myroomavatar": "設定您的聊天室頭貼(通過 mxc-uri)", "@commandHint_myroomavatar": { "type": "String", @@ -1943,8 +1766,6 @@ "type": "String", "placeholders": {} }, - "chatHasBeenAddedToThisSpace": "聊天室已新增到此空間", - "@chatHasBeenAddedToThisSpace": {}, "clearArchive": "清除存檔", "@clearArchive": {}, "hugContent": "{senderName} 擁抱您", @@ -1998,8 +1819,6 @@ } } }, - "addChatDescription": "新增聊天室描述......", - "@addChatDescription": {}, "sendTypingNotifications": "傳送「輸入中」通知", "@sendTypingNotifications": {}, "importEmojis": "匯入表情包", @@ -2049,11 +1868,6 @@ "@addChatOrSubSpace": {}, "thisDevice": "這個裝置:", "@thisDevice": {}, - "separateChatTypes": "分開私訊和群組", - "@separateChatTypes": { - "type": "String", - "placeholders": {} - }, "commandHint_markasdm": "將給定的 Matrix ID 標示為直接訊息房間", "@commandHint_markasdm": {}, "commandHint_html": "傳送 HTML 格式的文字", @@ -2077,8 +1891,6 @@ "@optionalRedactReason": {}, "dehydrateWarning": "此操作不能反悔。請確保安全地存儲備份文件。", "@dehydrateWarning": {}, - "hydrateTorLong": "上次在 TOR 上匯出會話了嗎?快速匯入它已繼續使用聊天室。", - "@hydrateTorLong": {}, "hydrate": "從備份文件恢復", "@hydrate": {}, "locationDisabledNotice": "位置服務被停用。請啟用它們以能夠分享您的位置。", @@ -2124,8 +1936,6 @@ "type": "String", "placeholders": {} }, - "publish": "發布", - "@publish": {}, "hasKnocked": "🚪 {user} 敲門了", "@hasKnocked": { "placeholders": { @@ -2136,8 +1946,6 @@ }, "unlockOldMessages": "解鎖舊消息", "@unlockOldMessages": {}, - "callingAccountDetails": "允許 FluffyChat 使用原生 Android 撥號應用程式。", - "@callingAccountDetails": {}, "noOtherDevicesFound": "未找到其他裝置", "@noOtherDevicesFound": {}, "noUsersFoundWithQuery": "很遺憾,找不到與「{query}」相符的使用者。請檢查是否有打錯字。", @@ -2149,20 +1957,12 @@ } } }, - "publicLink": "公開網址", - "@publicLink": {}, "dehydrate": "匯出會話並清除裝置", "@dehydrate": {}, - "dehydrateTor": "TOR 使用者:匯出會話", - "@dehydrateTor": {}, "reopenChat": "重新開啟聊天室", "@reopenChat": {}, - "widgetNameError": "請提供一個顯示名稱。", - "@widgetNameError": {}, "yourGlobalUserIdIs": "您的全域使用者ID是: ", "@yourGlobalUserIdIs": {}, - "startFirstChat": "開始您的第一次聊天室", - "@startFirstChat": {}, "experimentalVideoCalls": "實驗性視訊通話", "@experimentalVideoCalls": {}, "youAcceptedTheInvitation": "👍 您接受了邀請", @@ -2194,8 +1994,6 @@ "@banUserDescription": {}, "searchChatsRooms": "搜尋 #chats, @users...", "@searchChatsRooms": {}, - "decline": "拒絕", - "@decline": {}, "sendReadReceipts": "傳送已讀回條", "@sendReadReceipts": {}, "formattedMessagesDescription": "使用 markdown 顯示豐富的訊息內容,如粗體文字。", @@ -2222,19 +2020,10 @@ }, "users": "使用者", "@users": {}, - "pleaseChoose": "請選擇", - "@pleaseChoose": { - "type": "String", - "placeholders": {} - }, "youRejectedTheInvitation": "您拒絕了邀請", "@youRejectedTheInvitation": {}, - "enterRoom": "進入房間", - "@enterRoom": {}, "allSpaces": "所有空間", "@allSpaces": {}, - "indexedDbErrorLong": "預設情況下,私密模式不啟用消息存儲。\n請訪問\n - about:config\n - 將 dom.indexedDB.privateBrowsing.enabled 設定為 true\n否則,無法運行 FluffyChat。", - "@indexedDbErrorLong": {}, "youKickedAndBanned": "🙅 您踢出並封鎖了 {user}", "@youKickedAndBanned": { "placeholders": { @@ -2249,8 +2038,6 @@ "@custom": {}, "hidePresences": "隱藏狀態列表?", "@hidePresences": {}, - "signInWithPassword": "使用密碼登入", - "@signInWithPassword": {}, "setColorTheme": "設定主題顏色:", "@setColorTheme": {}, "makeAdminDescription": "一旦您讓這個使用者成為管理員,您可能無法撤銷此操作,因為他們將擁有與您相同的權限。", @@ -2261,25 +2048,17 @@ "@groupCanBeFoundViaSearch": {}, "pleaseEnterYourCurrentPassword": "請輸入您當前的密碼", "@pleaseEnterYourCurrentPassword": {}, - "widgetCustom": "自訂", - "@widgetCustom": {}, "createGroup": "建立群組", "@createGroup": {}, - "enterSpace": "進入空間", - "@enterSpace": {}, "shareLocation": "分享位置", "@shareLocation": { "type": "String", "placeholders": {} }, - "widgetVideo": "影片", - "@widgetVideo": {}, "redactMessageDescription": "該訊息將對此對話中的所有參與者收回。這不能被反悔。", "@redactMessageDescription": {}, "removeFromBundle": "從此套組中移除", "@removeFromBundle": {}, - "widgetName": "名稱", - "@widgetName": {}, "jump": "跳轉", "@jump": {}, "commandHint_unignore": "取消無視已提供的 Matrix ID", @@ -2306,11 +2085,6 @@ "type": "String", "placeholders": {} }, - "allRooms": "所有群組聊天室", - "@allRooms": { - "type": "String", - "placeholders": {} - }, "chatPermissions": "聊天室權限", "@chatPermissions": {}, "customEmojisAndStickersBody": "新增或分享可在任何聊天室中使用的自訂表情符號或貼圖。", @@ -2328,21 +2102,12 @@ "@hideRedactedMessages": {}, "hideInvalidOrUnknownMessageFormats": "隱藏無效或未知的訊息格式", "@hideInvalidOrUnknownMessageFormats": {}, - "dehydrateTorLong": "對 TOR 使用者,建議在關閉窗口前匯出會話。", - "@dehydrateTorLong": {}, - "hydrateTor": "TOR 使用者:匯入會話", - "@hydrateTor": {}, "messagesStyle": "訊息樣式:", "@messagesStyle": {}, "shareInviteLink": "分享邀請網址", "@shareInviteLink": {}, "scanQrCode": "掃描 QR 碼", "@scanQrCode": {}, - "openVideoCamera": "打開錄影", - "@openVideoCamera": { - "type": "String", - "placeholders": {} - }, "oneClientLoggedOut": "您的一個客戶端已登出", "@oneClientLoggedOut": {}, "addAccount": "新增帳號", @@ -2361,12 +2126,8 @@ "type": "String", "placeholders": {} }, - "hideMemberChangesInPublicChatsBody": "若有人加入或離開公開聊天室,將不在聊天室時間軸顯示,以提升資訊可讀性。", - "@hideMemberChangesInPublicChatsBody": {}, "overview": "概觀", "@overview": {}, - "notifyMeFor": "通知我", - "@notifyMeFor": {}, "passwordRecoverySettings": "恢復密碼設定", "@passwordRecoverySettings": {}, "redactedBy": "由 {username} 編輯", @@ -2394,19 +2155,8 @@ "@messageInfo": {}, "removeFromSpace": "從空間中移除", "@removeFromSpace": {}, - "addToSpaceDescription": "選擇一個空間將此聊天室加入。", - "@addToSpaceDescription": {}, "pleaseEnterRecoveryKeyDescription": "要解鎖您的舊訊息,請輸入在之前的會話中生成的恢復密鑰。您的恢復密鑰不是您的密碼。", "@pleaseEnterRecoveryKeyDescription": {}, - "videoWithSize": "影片({size})", - "@videoWithSize": { - "type": "String", - "placeholders": { - "size": { - "type": "String" - } - } - }, "emojis": "表情符號", "@emojis": {}, "placeCall": "發起通話", @@ -2415,16 +2165,6 @@ "@unsupportedAndroidVersion": {}, "videoCallsBetaWarning": "請注意,視訊通話目前處於測試階段。它們可能不會按預期工作,或者在所有平台上都不工作。", "@videoCallsBetaWarning": {}, - "widgetUrlError": "這不是一個有效的URL。", - "@widgetUrlError": {}, - "nextAccount": "下一個帳戶", - "@nextAccount": {}, - "previousAccount": "上一個帳戶", - "@previousAccount": {}, - "addWidget": "新增小工具", - "@addWidget": {}, - "errorAddingWidget": "新增小工具時發生錯誤。", - "@errorAddingWidget": {}, "youJoinedTheChat": "您加入了聊天室", "@youJoinedTheChat": {}, "youBannedUser": "您封鎖了 {user}", @@ -2459,47 +2199,18 @@ } } }, - "youInvitedToBy": "📩 您通過網址被邀請至:\n{alias}", - "@youInvitedToBy": { - "placeholders": { - "alias": { - "type": "String" - } - } - }, - "callingPermissions": "通話權限", - "@callingPermissions": {}, - "callingAccount": "通話帳戶", - "@callingAccount": {}, - "appearOnTop": "顯示在最上層", - "@appearOnTop": {}, "newGroup": "新群組", "@newGroup": {}, "newSpace": "新空間", "@newSpace": {}, - "numChats": "{number} 個聊天室", - "@numChats": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "hideUnimportantStateEvents": "隱藏不重要的狀態事件", - "@hideUnimportantStateEvents": {}, "doNotShowAgain": "不再顯示", "@doNotShowAgain": {}, "encryptThisChat": "加密此聊天室", "@encryptThisChat": {}, "sorryThatsNotPossible": "抱歉......這是不可能的", "@sorryThatsNotPossible": {}, - "profileNotFound": "在伺服器上找不到該使用者。可能是連接問題或該使用者不存在。", - "@profileNotFound": {}, "invite": "邀請", "@invite": {}, - "invitePrivateChat": "📨 邀請私人聊天室", - "@invitePrivateChat": {}, "removeDevicesDescription": "您將從這個裝置登出,並將不再能夠接收消息。", "@removeDevicesDescription": {}, "unbanUserDescription": "如果該使用者嘗試,他們將能夠再次進入聊天室。", @@ -2512,8 +2223,6 @@ "@learnMore": {}, "nothingFound": "什麼都沒找到......", "@nothingFound": {}, - "startConversation": "開始對話", - "@startConversation": {}, "databaseMigrationBody": "請稍候。這可能需要一點時間。", "@databaseMigrationBody": {}, "pleaseChooseAStrongPassword": "請選擇一個強密碼", @@ -2522,32 +2231,12 @@ "@passwordIsWrong": {}, "publicChatAddresses": "公開聊天室地址", "@publicChatAddresses": {}, - "userRole": "使用者角色", - "@userRole": {}, - "minimumPowerLevel": "{level} 是最低權限等級。", - "@minimumPowerLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "String" - } - } - }, "leaveEmptyToClearStatus": "留空以清除您的狀態。", "@leaveEmptyToClearStatus": {}, "select": "選擇", "@select": {}, "files": "文件", "@files": {}, - "forwardMessageTo": "將訊息轉發至 {roomName}?", - "@forwardMessageTo": { - "type": "String", - "placeholders": { - "roomName": { - "type": "String" - } - } - }, "sendTypingNotificationsDescription": "聊天室中的其他參與者可以看到您正在輸入新訊息。", "@sendTypingNotificationsDescription": {}, "verifyOtherDeviceDescription": "當您驗證另一個裝置時,這些裝置可以交換密鑰,提升您的整體安全性。💪 當您開始驗證時,一個彈出視窗將在兩個裝置上的應用程式中出現。在那裡,您將看到一系列的表情符號或數字,您需要相互比較。在開始驗證之前最好有兩個裝置在手邊。🤳", @@ -2602,8 +2291,6 @@ "@chatDescriptionHasBeenChanged": {}, "tryAgain": "再試一次", "@tryAgain": {}, - "pleaseEnterRecoveryKey": "請輸入您的恢復金鑰:", - "@pleaseEnterRecoveryKey": {}, "directChat": "私訊", "@directChat": {}, "register": "註冊", @@ -2624,8 +2311,6 @@ "@searchForUsers": {}, "inviteGroupChat": "📨 邀請群組聊天室", "@inviteGroupChat": {}, - "setTheme": "設定主題:", - "@setTheme": {}, "knocking": "敲門", "@knocking": {}, "sessionLostBody": "您的會話已丟失。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", @@ -2661,16 +2346,6 @@ "type": "String", "placeholders": {} }, - "singlesignon": "單一登入", - "@singlesignon": { - "type": "String", - "placeholders": {} - }, - "presenceStyle": "目前狀態:", - "@presenceStyle": { - "type": "String", - "placeholders": {} - }, "presencesToggle": "顯示其他使用者的狀態訊息", "@presencesToggle": { "type": "String", @@ -2697,29 +2372,8 @@ }, "confirmEventUnpin": "您確定要永久取消釘選該事件嗎?", "@confirmEventUnpin": {}, - "switchToAccount": "切換到帳戶 {number}", - "@switchToAccount": { - "type": "number", - "placeholders": { - "number": { - "type": "String" - } - } - }, - "widgetEtherpad": "文字筆記", - "@widgetEtherpad": {}, "noOneCanJoin": "沒有人可以加入", "@noOneCanJoin": {}, - "userWouldLikeToChangeTheChat": "{user} 想要加入聊天室。", - "@userWouldLikeToChangeTheChat": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "noPublicLinkHasBeenCreatedYet": "尚未建立公開網址", - "@noPublicLinkHasBeenCreatedYet": {}, "saveKeyManuallyDescription": "通過觸發系統分享對話框或剪貼板手動保存此密鑰。", "@saveKeyManuallyDescription": {}, "storeInAndroidKeystore": "存儲在 Android KeyStore", @@ -2739,8 +2393,6 @@ } } }, - "otherCallingPermissions": "麥克風、相機和其他 FluffyChat 權限", - "@otherCallingPermissions": {}, "disableEncryptionWarning": "出於安全原因,您不能在之前已加密的聊天室中停用加密。", "@disableEncryptionWarning": {}, "deviceKeys": "裝置密鑰:", @@ -2776,8 +2428,6 @@ "@passwordsDoNotMatch": {}, "publicSpaces": "公共空間", "@publicSpaces": {}, - "subspace": "子空間", - "@subspace": {}, "initAppError": "初始化應用時發生錯誤", "@initAppError": {}, "canceledKeyVerification": "{sender} 取消了密鑰驗證", @@ -2834,23 +2484,14 @@ "type": "String", "placeholders": {} }, - "inviteContactToGroupQuestion": "您想邀請 {contact} 加入 「{groupName}」 聊天室嗎?", - "@inviteContactToGroupQuestion": {}, "enableMultiAccounts": "(實驗性功能)在此裝置上啟用多個帳號", "@enableMultiAccounts": {}, - "hideMemberChangesInPublicChats": "在公開聊天室中隱藏成員變動", - "@hideMemberChangesInPublicChats": {}, "recoveryKeyLost": "遺失恢復金鑰?", "@recoveryKeyLost": {}, "sendAsText": "以文字傳送", "@sendAsText": { "type": "String" }, - "sendSticker": "傳送貼圖", - "@sendSticker": { - "type": "String", - "placeholders": {} - }, "unverified": "尚未驗證", "@unverified": {}, "time": "時間", @@ -2883,18 +2524,6 @@ "@searchMore": {}, "gallery": "畫廊", "@gallery": {}, - "databaseBuildErrorBody": "無法建立 SQLite 資料庫。應用程式目前嘗試使用遺留資料庫。請將此錯誤報告給開發人員,網址為 {url}。錯誤訊息為:{error}", - "@databaseBuildErrorBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, "sendReadReceiptsDescription": "聊天室中的其他參與者可以看到您已讀取一條訊息。", "@sendReadReceiptsDescription": {}, "formattedMessages": "格式化訊息", @@ -2920,37 +2549,18 @@ "@reportUser": {}, "unsupportedAndroidVersionLong": "此功能需要較新的 Android 版本。請檢查更新或 Lineage OS 支持。", "@unsupportedAndroidVersionLong": {}, - "emailOrUsername": "電子郵件或使用者名", - "@emailOrUsername": {}, - "indexedDbErrorTitle": "私密模式問題", - "@indexedDbErrorTitle": {}, - "widgetJitsi": "Jitsi Meet", - "@widgetJitsi": {}, "usersMustKnock": "使用者必須敲門", "@usersMustKnock": {}, "knock": "敲門", "@knock": {}, "storeInSecureStorageDescription": "將恢復密鑰存儲在此裝置的安全存儲中。", "@storeInSecureStorageDescription": {}, - "appearOnTopDetails": "允許應用程式顯示在最上層(如果您已將 Fluffychat 設定為通話帳戶則不需要)", - "@appearOnTopDetails": {}, "whyIsThisMessageEncrypted": "為什麼這條訊息無法讀取?", "@whyIsThisMessageEncrypted": {}, "noKeyForThisMessage": "如果訊息是在您登入此裝置之前傳送的,就可能會發生這種情況。\n\n也有可能是傳送者已經封鎖了您的裝置,或者網絡連接出了問題。\n\n如果您能在另一個會話中讀取該訊息,那麼您可以從中轉移訊息!前往設定 > 裝置,並確保您的裝置已相互驗證。當您下次打開房間且兩個會話都在前景時,密鑰將自動傳輸。\n\n不想在登出或切換裝置時丟失密鑰?請確保您已在設定中啟用了聊天室備份。", "@noKeyForThisMessage": {}, "newSpaceDescription": "空間允許您整合您的聊天室並建立私人或公開社群。", "@newSpaceDescription": {}, - "pleaseTryAgainLaterOrChooseDifferentServer": "請稍後再試,或選擇不同的伺服器。", - "@pleaseTryAgainLaterOrChooseDifferentServer": {}, - "signInWith": "使用 {provider} 登入", - "@signInWith": { - "type": "String", - "placeholders": { - "provider": { - "type": "String" - } - } - }, "invalidInput": "無效的輸入!", "@invalidInput": {}, "verifyOtherUser": "🔐 驗證其他使用者", @@ -2968,20 +2578,6 @@ }, "commandHint_ignore": "無視已提供的 Matrix ID", "@commandHint_ignore": {}, - "countChatsAndCountParticipants": "{chats} 個聊天室和 {participants} 位參與者", - "@countChatsAndCountParticipants": { - "type": "String", - "placeholders": { - "chats": { - "type": "int" - }, - "participants": { - "type": "int" - } - } - }, - "joinedChats": "已加入的聊天室", - "@joinedChats": {}, "unread": "未讀", "@unread": {}, "space": "空間", @@ -3085,8 +2681,6 @@ "@changeTheChatPermissions": {}, "changeTheVisibilityOfChatHistory": "變更過往聊天記錄可見度", "@changeTheVisibilityOfChatHistory": {}, - "homeserverDescription": "您的所有資料都儲存在歸屬伺服器上,就像電子郵件提供商一樣。 您可以選擇要使用的歸屬伺服器,同時您仍然可以與每個人溝通。 請訪問https://matrix.org瞭解更多資訊。", - "@homeserverDescription": {}, "sendingAttachment": "附件傳送中…", "@sendingAttachment": {}, "compressVideo": "影片壓縮中…", @@ -3106,10 +2700,6 @@ "@noChatsFoundHere": {}, "changeTheDescriptionOfTheGroup": "變更聊天室說明", "@changeTheDescriptionOfTheGroup": {}, - "discoverHomeservers": "探索歸屬伺服器", - "@discoverHomeservers": {}, - "whatIsAHomeserver": "什麼是歸屬伺服器?", - "@whatIsAHomeserver": {}, "calculatingFileSize": "正在計算檔案大小…", "@calculatingFileSize": {}, "prepareSendingAttachment": "準備傳送附件…", @@ -3235,8 +2825,6 @@ "@open": {}, "waitingForServer": "等待伺服器中...", "@waitingForServer": {}, - "appIntroduction": "FluffyChat 讓你和你的朋友跨越工具聊天。在 https://matrix.org 了解更多或*繼續*。", - "@appIntroduction": {}, "previous": "上一個", "@previous": {}, "otherPartyNotLoggedIn": "對方現未登入,未能接收訊息 !", @@ -3308,10 +2896,6 @@ "@crossVerifiedDevices": {}, "crossVerifiedDevicesIfEnabled": "交叉驗證裝置(如啟用)", "@crossVerifiedDevicesIfEnabled": {}, - "setCustomPermissionLevel": "設置自定義權限等級", - "@setCustomPermissionLevel": {}, - "setPermissionsLevelDescription": "請在下方選擇預先定義的角色,或輸入在 0 到 100 之間的自訂權限等級。", - "@setPermissionsLevelDescription": {}, "recordAVideo": "錄製影像", "@recordAVideo": {}, "takeAPhoto": "拍攝照片", @@ -3322,8 +2906,6 @@ "@notSupportedOnThisDevice": {}, "ignoreUser": "忽略用户", "@ignoreUser": {}, - "normalUser": "正常用户", - "@normalUser": {}, "notificationRuleTombstoneDescription": "通知用户有關房間解散的訊息。", "@notificationRuleTombstoneDescription": {}, "notificationRuleReaction": "心情回應", @@ -3359,4 +2941,4 @@ } } } -} +} \ No newline at end of file From 03f8f98e03193740df11171d5f3aede96b10c407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 4 Mar 2026 14:11:51 +0100 Subject: [PATCH 209/333] chore: Follow up audio player mimetype --- lib/pages/chat/events/audio_player.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index e7998083..66dbe65d 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -204,7 +204,7 @@ class AudioPlayerState extends State { if (file != null) { audioPlayer.setFilePath(file.path); } else if (kIsWeb) { - final blob = html.Blob([matrixFile.bytes], 'audio/mpeg'); + final blob = html.Blob([matrixFile.bytes], matrixFile.mimeType); final url = html.Url.createObjectUrlFromBlob(blob); await audioPlayer.setAudioSource(AudioSource.uri(Uri.parse(url))); } else { From de76969993fba511f7d20eb4ea57f36ce134555a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 21:33:46 +0000 Subject: [PATCH 210/333] build: (deps): Bump docker/login-action from 3 to 4 Bumps [docker/login-action](https://github.com/docker/login-action) from 3 to 4. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v3...v4) --- updated-dependencies: - dependency-name: docker/login-action dependency-version: '4' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 09275b7e..04833a76 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -191,7 +191,7 @@ jobs: - name: Check out Git repository uses: actions/checkout@v6 - name: Log in to the Container registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} From c206a515156337ec59fd18d20ab3b40ea7a63f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 5 Mar 2026 09:09:27 +0100 Subject: [PATCH 211/333] fix: Use correct own person for android notification replies --- .../notification_background_handler.dart | 83 +------------------ lib/utils/push_helper.dart | 75 ++++++++--------- 2 files changed, 34 insertions(+), 124 deletions(-) diff --git a/lib/utils/notification_background_handler.dart b/lib/utils/notification_background_handler.dart index 6c257e9a..c3d14eeb 100644 --- a/lib/utils/notification_background_handler.dart +++ b/lib/utils/notification_background_handler.dart @@ -9,10 +9,7 @@ import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/utils/client_download_content_extension.dart'; import 'package:fluffychat/utils/client_manager.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/push_helper.dart'; import '../config/app_config.dart'; import '../config/setting_keys.dart'; @@ -172,89 +169,11 @@ Future notificationTap( ); } - final eventId = await room.sendTextEvent( + await room.sendTextEvent( input, parseCommands: false, displayPendingEvent: false, ); - - if (PlatformInfos.isAndroid) { - final ownProfile = await room.client.fetchOwnProfile(); - final avatar = ownProfile.avatarUrl; - final avatarFile = avatar == null - ? null - : await client - .downloadMxcCached( - avatar, - thumbnailMethod: ThumbnailMethod.crop, - width: notificationAvatarDimension, - height: notificationAvatarDimension, - animated: false, - isThumbnail: true, - rounded: true, - ) - .timeout(const Duration(seconds: 3)); - final messagingStyleInformation = - await AndroidFlutterLocalNotificationsPlugin() - .getActiveNotificationMessagingStyle(id: room.id.hashCode); - if (messagingStyleInformation == null) return; - l10n ??= await lookupL10n(PlatformDispatcher.instance.locale); - messagingStyleInformation.messages?.add( - Message( - input, - DateTime.now(), - Person( - key: room.client.userID, - name: l10n.you, - icon: avatarFile == null - ? null - : ByteArrayAndroidIcon(avatarFile), - ), - ), - ); - - await FlutterLocalNotificationsPlugin().show( - id: room.id.hashCode, - title: room.getLocalizedDisplayname(MatrixLocals(l10n)), - body: input, - notificationDetails: NotificationDetails( - android: AndroidNotificationDetails( - AppConfig.pushNotificationsChannelId, - l10n.incomingMessages, - category: AndroidNotificationCategory.message, - shortcutId: room.id, - styleInformation: messagingStyleInformation, - groupKey: room.id, - playSound: false, - enableVibration: false, - actions: [ - AndroidNotificationAction( - FluffyChatNotificationActions.reply.name, - l10n.reply, - inputs: [ - AndroidNotificationActionInput( - label: l10n.writeAMessage, - ), - ], - cancelNotification: false, - allowGeneratedReplies: true, - semanticAction: SemanticAction.reply, - ), - AndroidNotificationAction( - FluffyChatNotificationActions.markAsRead.name, - l10n.markAsRead, - semanticAction: SemanticAction.markAsRead, - ), - ], - ), - ), - payload: FluffyChatPushPayload( - client.clientName, - room.id, - eventId, - ).toString(), - ); - } } } } diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart index 4b10623e..097aaa55 100644 --- a/lib/utils/push_helper.dart +++ b/lib/utils/push_helper.dart @@ -162,43 +162,15 @@ Future _tryPushHelper( ? avatar : event.senderFromMemoryOrFallback.avatarUrl; - Uint8List? roomAvatarFile, senderAvatarFile; - try { - roomAvatarFile = avatar == null - ? null - : await client - .downloadMxcCached( - avatar, - thumbnailMethod: ThumbnailMethod.crop, - width: notificationAvatarDimension, - height: notificationAvatarDimension, - animated: false, - isThumbnail: true, - rounded: true, - ) - .timeout(const Duration(seconds: 3)); - } catch (e, s) { - Logs().e('Unable to get avatar picture', e, s); - } - try { - senderAvatarFile = event.room.isDirectChat - ? roomAvatarFile - : senderAvatar == null - ? null - : await client - .downloadMxcCached( - senderAvatar, - thumbnailMethod: ThumbnailMethod.crop, - width: notificationAvatarDimension, - height: notificationAvatarDimension, - animated: false, - isThumbnail: true, - rounded: true, - ) - .timeout(const Duration(seconds: 3)); - } catch (e, s) { - Logs().e('Unable to get avatar picture', e, s); - } + final ownUser = event.room.unsafeGetUserFromMemoryOrFallback(client.userID!); + + final userAvatarFile = await client.tryDownloadNotificationAvatar( + ownUser.avatarUrl, + ); + final roomAvatarFile = await client.tryDownloadNotificationAvatar(avatar); + final senderAvatarFile = await client.tryDownloadNotificationAvatar( + senderAvatar, + ); final id = notification.roomId.hashCode; @@ -262,12 +234,11 @@ Future _tryPushHelper( messagingStyleInformation ?? MessagingStyleInformation( Person( - name: senderName, - icon: roomAvatarFile == null + name: ownUser.calcDisplayname(), + icon: userAvatarFile == null ? null - : ByteArrayAndroidIcon(roomAvatarFile), - key: event.roomId, - important: event.room.isFavourite, + : ByteArrayAndroidIcon(userAvatarFile), + key: event.room.client.userID, ), conversationTitle: event.room.isDirectChat ? null : roomName, groupConversation: !event.room.isDirectChat, @@ -372,3 +343,23 @@ Future _setShortcut( ), ); } + +extension on Client { + Future tryDownloadNotificationAvatar(Uri? avatar) async { + if (avatar == null) return null; + try { + return await downloadMxcCached( + avatar, + thumbnailMethod: ThumbnailMethod.crop, + width: notificationAvatarDimension, + height: notificationAvatarDimension, + animated: false, + isThumbnail: true, + rounded: true, + ).timeout(const Duration(seconds: 3)); + } catch (e, s) { + Logs().e('Unable to get avatar picture', e, s); + return null; + } + } +} From 386d01296f279a1373d20c5bb6adc7b2180e50bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 5 Mar 2026 10:14:04 +0100 Subject: [PATCH 212/333] build: Use flutter version from pubspec.yaml instead of env file --- .github/workflows/integrate.yaml | 20 ++++++-------------- .github/workflows/main_deploy.yaml | 10 ++-------- .github/workflows/release.yaml | 19 ++++--------------- .github/workflows/versions.env | 2 -- pubspec.lock | 2 +- pubspec.yaml | 1 + 6 files changed, 14 insertions(+), 40 deletions(-) delete mode 100644 .github/workflows/versions.env diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index c809d548..d89c203e 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -12,10 +12,9 @@ jobs: - uses: webiny/action-conventional-commits@v1.3.1 - run: ./scripts/generate-locale-config.sh - run: git diff --exit-code - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml cache: true - name: Check for unused translations run: flutter pub run translations_cleaner list-unused-terms -a @@ -51,14 +50,9 @@ jobs: steps: - uses: actions/checkout@v6 - uses: ./.github/actions/free_up_space - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - - uses: actions/setup-java@v5 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: "zulu" - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml cache: true - uses: moonrepo/setup-rust@v1 with: @@ -84,10 +78,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml cache: true - uses: moonrepo/setup-rust@v1 - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu @@ -109,9 +102,9 @@ jobs: runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}} steps: - uses: actions/checkout@v6 - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - name: Install dependencies run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y + - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < pubspec.yaml)" >> $GITHUB_ENV - name: Install Flutter run: | git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git @@ -125,10 +118,9 @@ jobs: runs-on: macos-15 steps: - uses: actions/checkout@v6 - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml cache: true - name: Use Xcode 16.4 run: sudo xcode-select --switch /Applications/Xcode_16.4.app @@ -202,7 +194,7 @@ jobs: echo "Generated AVD snapshot for caching." - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml cache: true - uses: remarkablemark/setup-maestro-cli@v1 - name: Load integration test env diff --git a/.github/workflows/main_deploy.yaml b/.github/workflows/main_deploy.yaml index 4636ce7f..d01adfc8 100644 --- a/.github/workflows/main_deploy.yaml +++ b/.github/workflows/main_deploy.yaml @@ -15,10 +15,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml - uses: moonrepo/setup-rust@v1 - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu - name: Prepare web @@ -40,14 +39,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - - uses: actions/setup-java@v5 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: 'zulu' - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml cache: true - name: Set up Ruby uses: ruby/setup-ruby@v1 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 04833a76..44f1444f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -18,10 +18,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml cache: true - uses: moonrepo/setup-rust@v1 - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu @@ -67,14 +66,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - - uses: actions/setup-java@v5 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: 'zulu' - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml cache: true - name: Add Firebase Messaging run: | @@ -107,9 +101,9 @@ jobs: runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}} steps: - uses: actions/checkout@v6 - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - name: Install dependencies run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y + - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < pubspec.yaml)" >> $GITHUB_ENV - name: Install Flutter run: | git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git @@ -133,14 +127,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - - run: cat .github/workflows/versions.env >> $GITHUB_ENV - - uses: actions/setup-java@v5 - with: - java-version: ${{ env.JAVA_VERSION }} - distribution: 'zulu' - uses: subosito/flutter-action@v2 with: - flutter-version: ${{ env.FLUTTER_VERSION }} + flutter-version-file: pubspec.yaml cache: true - name: Set up Ruby uses: ruby/setup-ruby@v1 diff --git a/.github/workflows/versions.env b/.github/workflows/versions.env deleted file mode 100644 index e5d1f0b2..00000000 --- a/.github/workflows/versions.env +++ /dev/null @@ -1,2 +0,0 @@ -FLUTTER_VERSION=3.41.2 -JAVA_VERSION=17 diff --git a/pubspec.lock b/pubspec.lock index 6d30bd23..c13b217e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2316,4 +2316,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.10.3 <4.0.0" - flutter: ">=3.38.4" + flutter: "3.41.3" diff --git a/pubspec.yaml b/pubspec.yaml index 9ecb47e9..c30bfd09 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,6 +8,7 @@ version: 2.4.0+3546 environment: sdk: ">=3.10.0 <4.0.0" + flutter: 3.41.3 dependencies: animations: ^2.1.1 From 9d8c332fc3e54b98a75a033be2d741f69834b8b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 5 Mar 2026 12:21:14 +0100 Subject: [PATCH 213/333] build: Update to flutter 3.41.4 --- pubspec.lock | 18 +++++++++--------- pubspec.yaml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index c13b217e..982b471c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1112,10 +1112,10 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.19" material_color_utilities: dependency: transitive description: @@ -1877,26 +1877,26 @@ packages: dependency: transitive description: name: test - sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" + sha256: "280d6d890011ca966ad08df7e8a4ddfab0fb3aa49f96ed6de56e3521347a9ae7" url: "https://pub.dev" source: hosted - version: "1.29.0" + version: "1.30.0" test_api: dependency: transitive description: name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" url: "https://pub.dev" source: hosted - version: "0.7.9" + version: "0.7.10" test_core: dependency: transitive description: name: test_core - sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" + sha256: "0381bd1585d1a924763c308100f2138205252fb90c9d4eeaf28489ee65ccde51" url: "https://pub.dev" source: hosted - version: "0.6.15" + version: "0.6.16" timezone: dependency: transitive description: @@ -2316,4 +2316,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.10.3 <4.0.0" - flutter: "3.41.3" + flutter: "3.41.4" diff --git a/pubspec.yaml b/pubspec.yaml index c30bfd09..aeeb8e91 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ version: 2.4.0+3546 environment: sdk: ">=3.10.0 <4.0.0" - flutter: 3.41.3 + flutter: 3.41.4 dependencies: animations: ^2.1.1 From a22c8fa6fafd53f19c5ab7fe989759182ececfc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 5 Mar 2026 12:38:46 +0100 Subject: [PATCH 214/333] fix: Do not cancel notification on reply --- lib/utils/push_helper.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart index 097aaa55..e41f2d30 100644 --- a/lib/utils/push_helper.dart +++ b/lib/utils/push_helper.dart @@ -264,7 +264,6 @@ Future _tryPushHelper( inputs: [ AndroidNotificationActionInput(label: l10n.writeAMessage), ], - cancelNotification: false, allowGeneratedReplies: true, semanticAction: SemanticAction.reply, ), From 58d5de4aba0791b2b801b2ff5e5d4e0bacc5914a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 5 Mar 2026 13:12:53 +0100 Subject: [PATCH 215/333] chore: Remove web notification custom sound Sound is now played on macOS and Windows by default. On some Linux distro it may differ but there it should be possible to configure it. --- lib/widgets/local_notifications_extension.dart | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index ee5708a5..618219dd 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -18,10 +18,6 @@ import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import 'package:fluffychat/widgets/matrix.dart'; extension LocalNotificationsExtension on MatrixState { - static final html.AudioElement _audioPlayer = html.AudioElement() - ..src = 'assets/assets/sounds/notification.ogg' - ..load(); - Future showLocalNotification(Event event) async { final roomId = event.room.id; if (activeRoomId == roomId) { @@ -74,8 +70,6 @@ extension LocalNotificationsExtension on MatrixState { ); } - _audioPlayer.play(); - html.Notification( title, body: body, From bfcd78fcdf43449e13bbc51271abef9a011c981e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 5 Mar 2026 13:18:50 +0100 Subject: [PATCH 216/333] refactor: Use native uri data from bytes instead of html --- lib/pages/chat/events/audio_player.dart | 11 +++++------ lib/pages/image_viewer/video_player.dart | 7 +++---- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index 66dbe65d..f2edc232 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -10,7 +10,6 @@ import 'package:just_audio/just_audio.dart'; import 'package:matrix/matrix.dart'; import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:universal_html/html.dart' as html; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; @@ -203,12 +202,12 @@ class AudioPlayerState extends State { if (file != null) { audioPlayer.setFilePath(file.path); - } else if (kIsWeb) { - final blob = html.Blob([matrixFile.bytes], matrixFile.mimeType); - final url = html.Url.createObjectUrlFromBlob(blob); - await audioPlayer.setAudioSource(AudioSource.uri(Uri.parse(url))); } else { - throw Exception('No audio file provided!'); + await audioPlayer.setAudioSource( + AudioSource.uri( + Uri.dataFromBytes(matrixFile.bytes, mimeType: matrixFile.mimeType), + ), + ); } audioPlayer.play().onError( diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index 2fd5e0c2..5b0991ea 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -6,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:chewie/chewie.dart'; import 'package:matrix/matrix.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:universal_html/html.dart' as html; import 'package:video_player/video_player.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; @@ -64,9 +63,9 @@ class EventVideoPlayerState extends State { // Create the VideoPlayerController from the contents of videoFile. if (kIsWeb) { - final blob = html.Blob([videoFile.bytes], videoFile.mimeType); - final networkUri = Uri.parse(html.Url.createObjectUrlFromBlob(blob)); - videoPlayerController = VideoPlayerController.networkUrl(networkUri); + videoPlayerController = VideoPlayerController.networkUrl( + Uri.dataFromBytes(videoFile.bytes, mimeType: videoFile.mimeType), + ); } else { final tempDir = await getTemporaryDirectory(); final fileName = Uri.encodeComponent( From d1abd71527a57178a0d2949bc41870e686ac729f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 5 Mar 2026 14:35:08 +0100 Subject: [PATCH 217/333] feat: Add mute notification action --- lib/l10n/intl_en.arb | 6 +++++- lib/utils/notification_background_handler.dart | 4 +++- lib/utils/push_helper.dart | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 18bf66dd..f7ff5d48 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -2776,5 +2776,9 @@ "removeAdminRights": "Remove admin rights", "powerLevel": "Power level", "setPowerLevelDescription": "Power levels define what a member is allowed to do in this room and usually range between 0 and 100.", - "owner": "Owner" + "owner": "Owner", + "mute": "Mute", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + } } \ No newline at end of file diff --git a/lib/utils/notification_background_handler.dart b/lib/utils/notification_background_handler.dart index c3d14eeb..4c85800f 100644 --- a/lib/utils/notification_background_handler.dart +++ b/lib/utils/notification_background_handler.dart @@ -174,8 +174,10 @@ Future notificationTap( parseCommands: false, displayPendingEvent: false, ); + case FluffyChatNotificationActions.mute: + await room.setPushRuleState(PushRuleState.mentionsOnly); } } } -enum FluffyChatNotificationActions { markAsRead, reply } +enum FluffyChatNotificationActions { markAsRead, reply, mute } diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart index e41f2d30..05d40b57 100644 --- a/lib/utils/push_helper.dart +++ b/lib/utils/push_helper.dart @@ -272,6 +272,11 @@ Future _tryPushHelper( l10n.markAsRead, semanticAction: SemanticAction.markAsRead, ), + AndroidNotificationAction( + FluffyChatNotificationActions.mute.name, + l10n.mute, + semanticAction: SemanticAction.mute, + ), ], ); const iOSPlatformChannelSpecifics = DarwinNotificationDetails(); From 18d98d96c622a9ed5ee3a7dfb5aaf83af46d3f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 5 Mar 2026 14:36:18 +0100 Subject: [PATCH 218/333] chore: Follow up search for homeserver --- lib/pages/sign_in/view_model/sign_in_view_model.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart index cb4a41ae..5760ce2e 100644 --- a/lib/pages/sign_in/view_model/sign_in_view_model.dart +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -39,7 +39,9 @@ class SignInViewModel extends ValueNotifier { ) .toList() ?? []; - if (Uri.tryParse(filterText) != null && + if (filterText.length >= 3 && + filterText.contains('.') && + Uri.tryParse(filterText) != null && !filteredPublicHomeservers.any( (homeserver) => homeserver.name == filterText, )) { From 0fe91bfe14843617c3c9bddb910ceb2d899b336c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 5 Mar 2026 15:28:42 +0100 Subject: [PATCH 219/333] chore: Follow up user dialog --- lib/config/app_config.dart | 2 +- lib/l10n/intl_en.arb | 3 ++- lib/widgets/adaptive_dialogs/user_dialog.dart | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index cedef2c1..0b98d693 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -17,7 +17,7 @@ abstract class AppConfig { static const String schemePrefix = 'matrix:'; static const String pushNotificationsChannelId = 'fluffychat_push'; static const String pushNotificationsAppId = 'chat.fluffy.fluffychat'; - static const double borderRadius = 18.0; + static const double borderRadius = 8.0; static const double spaceBorderRadius = 11.0; static const double columnWidth = 360.0; diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index f7ff5d48..ce842573 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -2780,5 +2780,6 @@ "mute": "Mute", "@mute": { "description": "This should be a very short string because there is not much space in the button!" - } + }, + "createNewChat": "Create new chat" } \ No newline at end of file diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index fc15c4e4..4e40cd83 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -41,6 +41,7 @@ class UserDialog extends StatelessWidget { @override Widget build(BuildContext context) { final client = Matrix.of(context).client; + final directChatRoomId = client.getDirectChatFromUserId(profile.userId); final displayname = profile.displayName ?? profile.userId.localpart ?? @@ -247,7 +248,9 @@ class UserDialog extends StatelessWidget { router.go('/rooms/$roomId'); }, child: Text( - L10n.of(context).sendAMessage, + directChatRoomId != null + ? L10n.of(context).createNewChat + : L10n.of(context).sendAMessage, style: TextStyle(color: theme.colorScheme.secondary), ), ), From cb8b3be205be8e8a5c7888a7439d589b2960e9be Mon Sep 17 00:00:00 2001 From: Krille-chan Date: Thu, 5 Mar 2026 18:55:13 +0100 Subject: [PATCH 220/333] chore: follow up borderradius --- lib/config/app_config.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 0b98d693..0a3aa2dd 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -17,7 +17,7 @@ abstract class AppConfig { static const String schemePrefix = 'matrix:'; static const String pushNotificationsChannelId = 'fluffychat_push'; static const String pushNotificationsAppId = 'chat.fluffy.fluffychat'; - static const double borderRadius = 8.0; + static const double borderRadius = 16.0; static const double spaceBorderRadius = 11.0; static const double columnWidth = 360.0; From dba3553a59ed4a9802dca0b88fd9c173e0f3781a Mon Sep 17 00:00:00 2001 From: Krille-chan Date: Thu, 5 Mar 2026 18:56:33 +0100 Subject: [PATCH 221/333] chore: follow up user dialog --- lib/widgets/adaptive_dialogs/user_dialog.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index 4e40cd83..4be6ba9d 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -248,7 +248,7 @@ class UserDialog extends StatelessWidget { router.go('/rooms/$roomId'); }, child: Text( - directChatRoomId != null + directChatRoomId == null ? L10n.of(context).createNewChat : L10n.of(context).sendAMessage, style: TextStyle(color: theme.colorScheme.secondary), From d0901da51e254868d9f88a9d6a6c18dd2ba32404 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 21:33:52 +0000 Subject: [PATCH 222/333] build: (deps): Bump docker/metadata-action from 5 to 6 Bumps [docker/metadata-action](https://github.com/docker/metadata-action) from 5 to 6. - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/v5...v6) --- updated-dependencies: - dependency-name: docker/metadata-action dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 44f1444f..e7ec5c10 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -187,7 +187,7 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - name: Build and push Docker image From 89864cfd0cb59398784f5af815d8998c8858283a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 6 Mar 2026 08:52:05 +0100 Subject: [PATCH 223/333] chore: Retry sign in tap in tests --- .github/workflows/integrate.yaml | 1 - integration_test/login.yaml | 9 +++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index d89c203e..fb84067d 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -233,7 +233,6 @@ jobs: script: | flutter run --use-application-binary=$PWD/app-debug.apk > flutter_logs.txt 2>&1 & FLUTTER_PID=$! - sleep 10 maestro test integration_test/login.yaml --env HOMESERVER=10.0.2.2 --env USER1_NAME=${USER1_NAME} --env USER1_PW=${USER1_PW} kill $FLUTTER_PID 2>/dev/null || true cp flutter_logs.txt ~/.maestro/tests/ diff --git a/integration_test/login.yaml b/integration_test/login.yaml index d32c255a..5bd1a3bd 100644 --- a/integration_test/login.yaml +++ b/integration_test/login.yaml @@ -1,7 +1,12 @@ appId: chat.fluffy.fluffychat --- -- assertVisible: "Sign in" -- tapOn: "Sign in" +- extendedWaitUntil: # Wait for app to be visible + visible: "Sign in" + timeout: 60000 +- retry: + maxRetries: 10 # Emulator might need some time to be ready to + commands: + - tapOn: "Sign in" - tapOn: "Search or enter homeserver address" - inputText: "http://${HOMESERVER}" - pressKey: "back" From edf7d81b60f64eaad5be0b32dba749ad45c4e525 Mon Sep 17 00:00:00 2001 From: gredzikk Date: Thu, 5 Mar 2026 10:02:10 +0100 Subject: [PATCH 224/333] chore(translations): Translated using Weblate (Polish) Currently translated at 99.2% (845 of 851 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/pl/ --- lib/l10n/intl_pl.arb | 279 +------------------------------------------ 1 file changed, 5 insertions(+), 274 deletions(-) diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index d1d432d8..cfb6dbe5 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -68,7 +68,7 @@ "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "Czy użytkownicy-goście mogą dołączyć", + "areGuestsAllowedToJoin": "Czy goście mogą dołączyć?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -330,7 +330,7 @@ "type": "String", "placeholders": {} }, - "chatBackupDescription": "Twoje stare wiadomości są zabezpieczone kluczem odzyskiwania. Uważaj żeby go nie zgubić.", + "chatBackupDescription": "Twoje wiadomości są zabezpieczone kluczem odzyskiwania. Uważaj żeby go nie zgubić.", "@chatBackupDescription": { "type": "String", "placeholders": {} @@ -351,7 +351,6 @@ "placeholders": {} }, "clearArchive": "Wyczyść archiwum", - "@clearArchive": {}, "close": "Zamknij", "@close": { "type": "String", @@ -1455,9 +1454,7 @@ "placeholders": {} }, "addAccount": "Dodaj konto", - "@addAccount": {}, "serverRequiresEmail": "Ten serwer wymaga potwierdzenia Twojego adresu email w celu rejestracji.", - "@serverRequiresEmail": {}, "or": "Lub", "@or": { "type": "String", @@ -1547,7 +1544,6 @@ "placeholders": {} }, "enableMultiAccounts": "(BETA) Włącza obsługę wielu kont na tym urządzeniu", - "@enableMultiAccounts": {}, "pickImage": "Wybierz obraz", "@pickImage": { "type": "String", @@ -1564,14 +1560,12 @@ "placeholders": {} }, "link": "Link", - "@link": {}, "roomHasBeenUpgraded": "Pokój został zaktualizowany", "@roomHasBeenUpgraded": { "type": "String", "placeholders": {} }, "repeatPassword": "Powtórz hasło", - "@repeatPassword": {}, "all": "Wszystkie", "@all": { "type": "String", @@ -1588,7 +1582,6 @@ "placeholders": {} }, "sendOnEnter": "Wyślij enterem", - "@sendOnEnter": {}, "autoplayImages": "Automatycznie odtwarzaj animowane naklejki i emotikony", "@autoplayImages": { "type": "String", @@ -1609,14 +1602,12 @@ "placeholders": {} }, "homeserver": "Adres serwera", - "@homeserver": {}, "locationDisabledNotice": "Usługi lokalizacji są wyłączone. Proszę włącz je aby móc udostępnić swoją lokalizację.", "@locationDisabledNotice": { "type": "String", "placeholders": {} }, "oneClientLoggedOut": "Jedno z twoich urządzeń zostało wylogowane", - "@oneClientLoggedOut": {}, "privacy": "Prywatność", "@privacy": { "type": "String", @@ -1710,7 +1701,6 @@ "placeholders": {} }, "scanQrCode": "Skanuj kod QR", - "@scanQrCode": {}, "createNewSpace": "Nowa przestrzeń", "@createNewSpace": { "type": "String", @@ -1722,7 +1712,6 @@ "placeholders": {} }, "addToSpace": "Dodaj do przestrzeni", - "@addToSpace": {}, "changeYourAvatar": "Zmień swoje zdjęcie", "@changeYourAvatar": { "type": "String", @@ -1783,7 +1772,7 @@ "type": "String", "placeholders": {} }, - "tooManyRequestsWarning": "Zbyt wiele żądań. Proszę spróbować później.", + "tooManyRequestsWarning": "Zbyt wiele żądań. Proszę spróbować później!", "@tooManyRequestsWarning": { "type": "String", "placeholders": {} @@ -1799,9 +1788,7 @@ "placeholders": {} }, "messageInfo": "Informacje o wiadomości", - "@messageInfo": {}, "time": "Czas", - "@time": {}, "messageType": "Rodzaj wiadomości", "@messageType": {}, "waitingPartnerAcceptRequest": "Oczekiwanie na zaakceptowanie prośby przez drugą osobę…", @@ -1830,7 +1817,6 @@ "placeholders": {} }, "removeFromSpace": "Usuń z przestrzeni", - "@removeFromSpace": {}, "extremeOffensive": "Bardzo obraźliwe", "@extremeOffensive": { "type": "String", @@ -1856,9 +1842,7 @@ "placeholders": {} }, "recoveryKey": "Klucz odzyskiwania", - "@recoveryKey": {}, "recoveryKeyLost": "Utracono klucz odzyskiwania?", - "@recoveryKeyLost": {}, "sentCallInformations": "{senderName} wysłał/-a informacje o połączeniu", "@sentCallInformations": { "type": "String", @@ -1889,15 +1873,11 @@ "placeholders": {} }, "sender": "Nadawca", - "@sender": {}, "openGallery": "Otwórz galerię", - "@openGallery": {}, "start": "Start", - "@start": {}, "pleaseEnterRecoveryKeyDescription": "Aby odblokować wcześniejsze wiadomości, wprowadź swój klucz odzyskiwania, który został wygenerowany w poprzedniej sesji. Twój klucz odzyskiwania NIE jest Twoim hasłem.", "@pleaseEnterRecoveryKeyDescription": {}, "hydrate": "Przywracanie z pliku kopii zapasowej", - "@hydrate": {}, "noMatrixServer": "{server1} nie jest serwerem Matriksa, czy chcesz zamiast niego użyć {server2}?", "@noMatrixServer": { "type": "String", @@ -1935,7 +1915,6 @@ "placeholders": {} }, "unverified": "Niezweryfikowane", - "@unverified": {}, "wipeChatBackup": "Wymazać kopię zapasową czatu, aby utworzyć nowy klucz odzyskiwania?", "@wipeChatBackup": { "type": "String", @@ -1947,11 +1926,8 @@ "placeholders": {} }, "reportUser": "Zgłoś użytkownika", - "@reportUser": {}, "dismiss": "Odrzuć", - "@dismiss": {}, "markAsRead": "Oznacz jako przeczytane", - "@markAsRead": {}, "passphraseOrKey": "fraza dostępu lub klucz odzyskiwania", "@passphraseOrKey": { "type": "String", @@ -1969,38 +1945,26 @@ } }, "commandHint_markasdm": "Oznacz jako pokój wiadomości bezpośrednich dla podanego Matrix ID", - "@commandHint_markasdm": {}, "confirmMatrixId": "Potwierdź swój identyfikator Matrix w celu usunięcia konta.", - "@confirmMatrixId": {}, "commandHint_markasgroup": "Oznacz jako grupę", - "@commandHint_markasgroup": {}, "noEmotesFound": "Nie znaleziono żadnych emotikonów. 😕", "@noEmotesFound": { "type": "String", "placeholders": {} }, "dehydrate": "Eksportuj sesję i wymaż urządzenie", - "@dehydrate": {}, "dehydrateWarning": "Tego nie można cofnąć. Upewnij się, że plik kopii zapasowej jest bezpiecznie przechowywany.", "@dehydrateWarning": {}, "unsupportedAndroidVersion": "Nieobsługiwana wersja systemu Android", "@unsupportedAndroidVersion": {}, "pinMessage": "Przypnij do pokoju", - "@pinMessage": {}, "confirmEventUnpin": "Czy na pewno chcesz trwale odpiąć wydarzenie?", - "@confirmEventUnpin": {}, "youJoinedTheChat": "Dołączono do czatu", - "@youJoinedTheChat": {}, "user": "Użytkownik", - "@user": {}, "custom": "Własne", - "@custom": {}, "newGroup": "Nowa grupa", - "@newGroup": {}, "newSpace": "Nowa przestrzeń", - "@newSpace": {}, "fileIsTooBigForServer": "Nie udało się wysłać! Ten serwer obsługuje załączniki o maksymalnej wielkości {max}.", - "@fileIsTooBigForServer": {}, "youBannedUser": "Zbanowałeś/-aś {user}", "@youBannedUser": { "placeholders": { @@ -2010,7 +1974,6 @@ } }, "users": "Użytkownicy", - "@users": {}, "countFiles": "{count} plików", "@countFiles": { "placeholders": { @@ -2022,27 +1985,19 @@ "noOtherDevicesFound": "Nie znaleziono innych urządzeń", "@noOtherDevicesFound": {}, "encryptThisChat": "Zaszyfruj ten czat", - "@encryptThisChat": {}, "disableEncryptionWarning": "Ze względów bezpieczeństwa nie można wyłączyć szyfrowania w czacie, w którym zostało ono wcześniej włączone.", - "@disableEncryptionWarning": {}, "deviceKeys": "Klucze urządzenia:", "@deviceKeys": {}, "saveKeyManuallyDescription": "Zapisz ten klucz ręcznie, uruchamiając systemowe okno dialogowe udostępniania lub schowek.", - "@saveKeyManuallyDescription": {}, "screenSharingTitle": "udostępnianie ekranu", "@screenSharingTitle": {}, "noKeyForThisMessage": "Może się to zdarzyć, jeśli wiadomość została wysłana przed zalogowaniem się na to konto na tym urządzeniu.\n\nMożliwe jest również, że nadawca zablokował Twoje urządzenie lub coś poszło nie tak z połączeniem internetowym.\n\nJesteś w stanie odczytać wiadomość na innej sesji? W takim razie możesz przenieść z niej wiadomość! Wejdź w Ustawienia > Urządzenia i upewnij się, że Twoje urządzenia zweryfikowały się wzajemnie. Gdy następnym razem otworzysz pokój i obie sesje będą włączone, klucze zostaną przekazane automatycznie.\n\nNie chcesz stracić kluczy podczas wylogowania lub przełączania urządzeń? Upewnij się, że w ustawieniach masz włączoną kopię zapasową czatu.", - "@noKeyForThisMessage": {}, "sorryThatsNotPossible": "Przepraszamy... to nie jest możliwe", - "@sorryThatsNotPossible": {}, "noBackupWarning": "Uwaga! Bez włączenia kopii zapasowej czatu, stracisz dostęp do swoich zaszyfrowanych wiadomości. Zaleca się włączenie kopii zapasowej czatu przed wylogowaniem.", - "@noBackupWarning": {}, "commandHint_googly": "Wyślij kręcące się oczka", "@commandHint_googly": {}, "storeInAndroidKeystore": "Przechowaj w Android KeyStore", - "@storeInAndroidKeystore": {}, "commandHint_cuddle": "Wyślij przytulenie", - "@commandHint_cuddle": {}, "googlyEyesContent": "{senderName} wysyła ci kręcące się oczka", "@googlyEyesContent": { "type": "String", @@ -2071,7 +2026,6 @@ } }, "commandHint_hug": "Wyślij uścisk", - "@commandHint_hug": {}, "reactedWith": "{sender} zareagował/-a z {reaction}", "@reactedWith": { "type": "String", @@ -2085,21 +2039,14 @@ } }, "emojis": "Emoji", - "@emojis": {}, "placeCall": "Zadzwoń", - "@placeCall": {}, "voiceCall": "Połączenie głosowe", - "@voiceCall": {}, "unsupportedAndroidVersionLong": "Ta funkcja wymaga nowszej wersji systemu Android. Sprawdź aktualizacje lub wsparcie Lineage OS.", - "@unsupportedAndroidVersionLong": {}, "videoCallsBetaWarning": "Należy pamiętać, że połączenia wideo są obecnie w fazie beta. Mogą nie działać zgodnie z oczekiwaniami lub nie działać w ogóle na wszystkich platformach.", - "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Eksperymentalne połączenia wideo", "@experimentalVideoCalls": {}, "youRejectedTheInvitation": "Odrzucono zaproszenie", - "@youRejectedTheInvitation": {}, "youAcceptedTheInvitation": "👍 Zaakceptowałeś/-aś zaproszenie", - "@youAcceptedTheInvitation": {}, "youHaveWithdrawnTheInvitationFor": "Wycofano zaproszenie dla {user}", "@youHaveWithdrawnTheInvitationFor": { "placeholders": { @@ -2149,15 +2096,10 @@ } }, "unlockOldMessages": "Odblokuj stare wiadomości", - "@unlockOldMessages": {}, "storeInSecureStorageDescription": "Przechowaj klucz odzyskiwania w bezpiecznym magazynie tego urządzenia.", - "@storeInSecureStorageDescription": {}, "storeInAppleKeyChain": "Przechowaj w pęku kluczy Apple", - "@storeInAppleKeyChain": {}, "storeSecurlyOnThisDevice": "Przechowaj bezpiecznie na tym urządzeniu", - "@storeSecurlyOnThisDevice": {}, "foregroundServiceRunning": "To powiadomienie pojawia się, gdy usługa w tle jest uruchomiona.", - "@foregroundServiceRunning": {}, "screenSharingDetail": "Udostępniasz swój ekran w FluffyChat", "@screenSharingDetail": {}, "whyIsThisMessageEncrypted": "Dlaczego nie można odczytać tej wiadomości?", @@ -2165,7 +2107,6 @@ "allSpaces": "Wszystkie przestrzenie", "@allSpaces": {}, "doNotShowAgain": "Nie pokazuj ponownie", - "@doNotShowAgain": {}, "wasDirectChatDisplayName": "Pusty czat (wcześniej {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -2176,9 +2117,7 @@ } }, "newSpaceDescription": "Przestrzenie pozwalają na konsolidację czatów i budowanie prywatnych lub publicznych społeczności.", - "@newSpaceDescription": {}, "reopenChat": "Otwórz ponownie czat", - "@reopenChat": {}, "fileHasBeenSavedAt": "Plik został zapisany w ścieżce {path}", "@fileHasBeenSavedAt": { "type": "String", @@ -2189,39 +2128,24 @@ } }, "addToBundle": "Dodaj do pakietu", - "@addToBundle": {}, "bundleName": "Nazwa pakietu", - "@bundleName": {}, "editBundlesForAccount": "Edytuj pakiety dla tego konta", - "@editBundlesForAccount": {}, "jumpToLastReadMessage": "Przejdź do ostatnio przeczytanej wiadomości", - "@jumpToLastReadMessage": {}, "readUpToHere": "Czytaj do tego miejsca", - "@readUpToHere": {}, "jump": "Przejdź", - "@jump": {}, "removeFromBundle": "Usuń z tego pakietu", - "@removeFromBundle": {}, "openLinkInBrowser": "Otwórz link w przeglądarce", "@openLinkInBrowser": {}, "reportErrorDescription": "😭 O nie! Coś poszło nie tak. Spróbuj ponownie później. Jeśli chcesz, możesz zgłosić ten błąd autorom programu.", - "@reportErrorDescription": {}, "setColorTheme": "Ustal styl kolorów:", - "@setColorTheme": {}, "tryAgain": "Spróbuj ponownie", - "@tryAgain": {}, "messagesStyle": "Wiadomości:", - "@messagesStyle": {}, "chatDescription": "Opis czatu", - "@chatDescription": {}, "invalidServerName": "Nieprawidłowa nazwa serwera", - "@invalidServerName": {}, "chatPermissions": "Uprawnienia w czacie", "@chatPermissions": {}, "setChatDescription": "Ustaw opis czatu", - "@setChatDescription": {}, "importFromZipFile": "Zaimportuj z pliku .zip", - "@importFromZipFile": {}, "redactedBy": "Usunięte przez {username}", "@redactedBy": { "type": "String", @@ -2232,7 +2156,6 @@ } }, "optionalRedactReason": "(Opcjonalnie) Powód usunięcia tej wiadomości...", - "@optionalRedactReason": {}, "exportEmotePack": "Eksportuj pakiet emotikonów jako .zip", "@exportEmotePack": {}, "redactedByBecause": "Usunięte przez {username} z powodu „{reason}”", @@ -2248,13 +2171,10 @@ } }, "redactMessageDescription": "Wiadomość zostanie usunięta u wszystkich uczestników tej rozmowy. Tego nie można cofnąć.", - "@redactMessageDescription": {}, "invalidInput": "Nieprawidłowe dane!", - "@invalidInput": {}, "report": "zgłoś", "@report": {}, "directChat": "Czat bezpośredni", - "@directChat": {}, "wrongPinEntered": "Wprowadzono nieprawidłowy kod PIN! Spróbuj ponownie za {seconds} sekund...", "@wrongPinEntered": { "type": "String", @@ -2265,19 +2185,14 @@ } }, "sendTypingNotifications": "Wysyłaj powiadomienie o pisaniu", - "@sendTypingNotifications": {}, "inviteGroupChat": "📨 Zaproszenie do rozmowy grupowej", "@inviteGroupChat": {}, "importEmojis": "Zaimportuj emotikony", - "@importEmojis": {}, "noChatDescriptionYet": "Nie utworzono jeszcze opisu czatu.", - "@noChatDescriptionYet": {}, "notAnImage": "To nie jest plik obrazu.", - "@notAnImage": {}, "chatDescriptionHasBeenChanged": "Zmieniono opis czatu", "@chatDescriptionHasBeenChanged": {}, "shareInviteLink": "Udostępnij link z zaproszeniem", - "@shareInviteLink": {}, "emoteKeyboardNoRecents": "Tutaj pojawiają się ostatnio używane emotikony...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2286,47 +2201,29 @@ "replace": "Zastąp", "@replace": {}, "createGroup": "Utwórz grupę", - "@createGroup": {}, "importNow": "Zaimportuj", - "@importNow": {}, "invite": "Zaproszenie", - "@invite": {}, "block": "Zablokuj", - "@block": {}, "blockedUsers": "Zablokowani użytkownicy", - "@blockedUsers": {}, "blockUsername": "Ignoruj użytkownika", "@blockUsername": {}, "transparent": "Przezroczystość", - "@transparent": {}, "select": "Zaznacz", - "@select": {}, "calls": "Połączenia", - "@calls": {}, "overview": "Podsumowanie", - "@overview": {}, "learnMore": "Dowiedz się więcej", - "@learnMore": {}, "groupName": "Nazwa grupy", "@groupName": {}, "newPassword": "Nowe hasło", - "@newPassword": {}, "thisDevice": "To urządzenie:", - "@thisDevice": {}, "gallery": "Galeria", - "@gallery": {}, "files": "Pliki", - "@files": {}, "discover": "Odkrywaj", - "@discover": {}, "restricted": "Ograniczone", "@restricted": {}, "nothingFound": "Nic nie odnaleziono...", - "@nothingFound": {}, "stickers": "Naklejki", - "@stickers": {}, "noChatsFoundHere": "Nie jeszcze ma żadnych czatów. Wciśnij poniższy przycisk, aby rozpocząć nowy czat. ⤵️", - "@noChatsFoundHere": {}, "hideRedactedMessagesBody": "Usunięte wiadomości nie będą widoczne w czacie.", "@hideRedactedMessagesBody": {}, "passwordRecoverySettings": "Ustawienia odzyskiwania hasła", @@ -2340,9 +2237,7 @@ } }, "archiveRoomDescription": "Czat zostanie przeniesiony do archiwum. Pozostali użytkownicy będą mogli zobaczyć, że opuściłeś/-aś czat.", - "@archiveRoomDescription": {}, "yourGlobalUserIdIs": "Twój globalny identyfikator to: ", - "@yourGlobalUserIdIs": {}, "canceledKeyVerification": "{sender} anulował/-a weryfikację kluczy", "@canceledKeyVerification": { "type": "String", @@ -2362,27 +2257,17 @@ } }, "commandHint_ignore": "Ignoruj podany identyfikator Matrix", - "@commandHint_ignore": {}, "commandHint_unignore": "Przestań ignorować podany identyfikator Matrix", - "@commandHint_unignore": {}, "changeTheChatPermissions": "Zmień uprawnienia w czacie", - "@changeTheChatPermissions": {}, "changelog": "Lista zmian", - "@changelog": {}, "inviteOtherUsers": "Zaproś innych użytkowników do tego czatu", - "@inviteOtherUsers": {}, "blockListDescription": "Możesz zablokować uciążliwych użytkowników. Nie będziesz widzieć ani otrzymywać wiadomości oraz zaproszeń od nich.", - "@blockListDescription": {}, "formattedMessages": "Sformatowane wiadomości", - "@formattedMessages": {}, "banUserDescription": "Użytkownik zostanie zbanowany w czacie i nie będzie w stanie dołączyć do czatu do momentu odbanowania.", "@banUserDescription": {}, "sendReadReceipts": "Wysyłaj powiadomienia o przeczytaniu wiadomości", - "@sendReadReceipts": {}, "verifyOtherDevice": "🔐 Zweryfikuj inne urządzenie", - "@verifyOtherDevice": {}, "prepareSendingAttachment": "Przygotuj wysyłanie załącznika...", - "@prepareSendingAttachment": {}, "acceptedKeyVerification": "{sender} zaakceptował/-a weryfikację kluczy", "@acceptedKeyVerification": { "type": "String", @@ -2393,7 +2278,6 @@ } }, "databaseMigrationTitle": "Baza danych jest zoptymalizowana", - "@databaseMigrationTitle": {}, "hasKnocked": "{user} zapukał-/a", "@hasKnocked": { "placeholders": { @@ -2412,7 +2296,6 @@ } }, "changeTheVisibilityOfChatHistory": "Zmień widoczność historii czatu", - "@changeTheVisibilityOfChatHistory": {}, "sendImages": "Wyślij {count} obrazów", "@sendImages": { "type": "String", @@ -2446,11 +2329,8 @@ } }, "sendTypingNotificationsDescription": "Pozostali uczestnicy czatu mogą widzieć kiedy piszesz nową wiadomość.", - "@sendTypingNotificationsDescription": {}, "sendReadReceiptsDescription": "Pozostali uczestnicy czatu mogą widzieć zobaczyć kiedy przeczytasz wiadomość.", - "@sendReadReceiptsDescription": {}, "noDatabaseEncryption": "Szyfrowanie bazy danych nie jest obsługiwane na tej platformie", - "@noDatabaseEncryption": {}, "thereAreCountUsersBlocked": "Obecnie jest {count} zablokowanych użytkowników.", "@thereAreCountUsersBlocked": { "type": "String", @@ -2462,7 +2342,6 @@ "space": {} }, "markAsUnread": "Oznacz jako nieprzeczytane", - "@markAsUnread": {}, "moderatorLevel": "{level} - Moderator", "@moderatorLevel": { "type": "String", @@ -2482,25 +2361,16 @@ } }, "sendRoomNotifications": "Wysyłaj powiadomienia @room", - "@sendRoomNotifications": {}, "chatPermissionsDescription": "Ustal jaki poziom uprawnień jest wymagany dla określonych czynności w czacie. Poziomy uprawnień 0, 50 i 100 zwykle dotyczą odpowiednio użytkowników, moderatorów i administratorów, ale możliwa jest dowolna gradacja.", - "@chatPermissionsDescription": {}, "changeTheCanonicalRoomAlias": "Zmień główny publiczny czatu", - "@changeTheCanonicalRoomAlias": {}, "changeTheDescriptionOfTheGroup": "Zmień opis czatu", - "@changeTheDescriptionOfTheGroup": {}, "sendCanceled": "Anulowano wysyłanie", "@sendCanceled": {}, "doesNotSeemToBeAValidHomeserver": "Wydaje się nie być kompatybilnym serwerem domowym. Niepoprawny adres URL?", - "@doesNotSeemToBeAValidHomeserver": {}, "calculatingFileSize": "Obliczanie rozmiaru pliku...", - "@calculatingFileSize": {}, "sendingAttachment": "Wysyłanie załącznika...", - "@sendingAttachment": {}, "generatingVideoThumbnail": "Generowanie podglądu filmu...", - "@generatingVideoThumbnail": {}, "compressVideo": "Kompresowanie filmu...", - "@compressVideo": {}, "sendingAttachmentCountOfCount": "Wysyłanie {index} z {length} części załącznika...", "@sendingAttachmentCountOfCount": { "type": "integer", @@ -2514,27 +2384,16 @@ } }, "welcomeText": "No cześć! 👋 Tutaj FluffyChat. Możesz zapisać się do dowolnego serwera domowego, kompatybilnego z https://matrix.org i rozmawiać ze wszystkimi. To duża zdecentralizowana sieć czatów!", - "@welcomeText": {}, "blur": "Rozmazanie:", - "@blur": {}, "opacity": "Przezroczystość:", - "@opacity": {}, "setWallpaper": "Ustaw tapetę", - "@setWallpaper": {}, "manageAccount": "Zarządzaj kontem", - "@manageAccount": {}, "noContactInformationProvided": "Serwer nie dostarcza żadnych poprawnych danych kontaktowych", - "@noContactInformationProvided": {}, "contactServerAdmin": "Skontaktuj się z administratorem serwera", - "@contactServerAdmin": {}, "compress": "Skompresuj", - "@compress": {}, "pleaseFillOut": "Proszę wypełnić", - "@pleaseFillOut": {}, "invalidUrl": "Niepoprawny adres URL", - "@invalidUrl": {}, - "unableToJoinChat": "Nie udało się dołączyć do czatu. Może druga strona zakończyła już rozmowę?", - "@unableToJoinChat": {}, + "unableToJoinChat": "Nie udało się dołączyć do czatu. Rozmowa mogła zostać zakończona przez drugą stronę.", "aboutHomeserver": "O {homeserver}", "@aboutHomeserver": { "type": "String", @@ -2554,9 +2413,7 @@ } }, "continueText": "Kontynuuj", - "@continueText": {}, "noticeChatBackupDeviceVerification": "Uwaga: Urządzenia dodane do kopii zapasowej czatu automatycznie zostają zweryfikowane.", - "@noticeChatBackupDeviceVerification": {}, "serverLimitReached": "Osiągnięto limit serwera. Czekanie {seconds} sekund...", "@serverLimitReached": { "type": "integer", @@ -2567,35 +2424,21 @@ } }, "oneOfYourDevicesIsNotVerified": "Jedno z Twoich urządzeń nie jest zweryfikowane", - "@oneOfYourDevicesIsNotVerified": {}, "supportPage": "Strona obsługi użytkownika", - "@supportPage": {}, "serverInformation": "Informacje o serwerze:", - "@serverInformation": {}, "name": "Nazwa", - "@name": {}, "website": "Strona internetowa", - "@website": {}, "contactServerSecurity": "Skontaktuj się z działem bezpieczeństwa serwera", - "@contactServerSecurity": {}, "version": "Wersja", - "@version": {}, "accessAndVisibility": "Dostęp i widoczność", - "@accessAndVisibility": {}, "customEmojisAndStickers": "Własne emotikony i naklejki", - "@customEmojisAndStickers": {}, "globalChatId": "Globalny identyfikator czatu", - "@globalChatId": {}, "accessAndVisibilityDescription": "Kto może dołączyć do tego czatu i w jaki sposób można ten czat znaleźć.", - "@accessAndVisibilityDescription": {}, "customEmojisAndStickersBody": "Dodaj lub podziel się własnymi emotikonami i naklejkami, które będą mogły być użyte w dowolnym czacie.", - "@customEmojisAndStickersBody": {}, "hideRedactedMessages": "Nie pokazuj usuniętych wiadomości", - "@hideRedactedMessages": {}, "hideInvalidOrUnknownMessageFormats": "Ukryj niepoprawne lub nieznane typy wiadomości", "@hideInvalidOrUnknownMessageFormats": {}, "pushNotificationsNotAvailable": "Powiadomienia push nie są dostępne", - "@pushNotificationsNotAvailable": {}, "noUsersFoundWithQuery": "Niestety nie udało się nikogo znaleźć poprzez \"{query}\". Proszę sprawdzić, czy w zapytaniu nie ma literówek.", "@noUsersFoundWithQuery": { "type": "String", @@ -2615,46 +2458,30 @@ } }, "publicSpaces": "Przestrzenie publiczne", - "@publicSpaces": {}, "searchMore": "Szukaj dalej...", - "@searchMore": {}, "formattedMessagesDescription": "Używaj Markdown do wyświetlania dodatkowego formatowania w wiadomościach, jak np. pogrubienie tekstu.", - "@formattedMessagesDescription": {}, "verifyOtherUser": "🔐 Zweryfikuj innego użytkownika", - "@verifyOtherUser": {}, "knockRestricted": "Pukanie jest ograniczone", - "@knockRestricted": {}, "appLockDescription": "Zablokuj aplikację pinem kiedy nie jest używana", - "@appLockDescription": {}, "knocking": "Pukanie", - "@knocking": {}, "pleaseChooseAStrongPassword": "Proszę wybrać silne hasło", - "@pleaseChooseAStrongPassword": {}, "usersMustKnock": "Użytkownicy muszą zapukać", - "@usersMustKnock": {}, "noOneCanJoin": "Nikt nie może dołączyć", - "@noOneCanJoin": {}, "alwaysUse24HourFormat": "false", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, "swipeRightToLeftToReply": "Przeciągnij w lewo, by odpowiedzieć", - "@swipeRightToLeftToReply": {}, "presencesToggle": "Pokazuj zmiany statusów innych użytkowników", "@presencesToggle": { "type": "String", "placeholders": {} }, "hidePresences": "Ukryć listę statusów?", - "@hidePresences": {}, "pleaseEnterANumber": "Proszę podać liczbę większą od 0", - "@pleaseEnterANumber": {}, "commandHint_sendraw": "Wyślij zwykły JSON", - "@commandHint_sendraw": {}, "databaseMigrationBody": "Proszę czekać. Może to potrwać chwilę.", - "@databaseMigrationBody": {}, "leaveEmptyToClearStatus": "Pozostaw puste, aby wyczyścić swój status.", - "@leaveEmptyToClearStatus": {}, "sessionLostBody": "Twoja sesja została utracona. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}", "@sessionLostBody": { "type": "String", @@ -2668,7 +2495,6 @@ } }, "publicChatAddresses": "Adresy publicznych czatów", - "@publicChatAddresses": {}, "createNewAddress": "Utwórz nowy adres", "@createNewAddress": {}, "completedKeyVerification": "{sender} zakończył/-a weryfikację kluczy", @@ -2681,19 +2507,13 @@ } }, "italicText": "Kursywa", - "@italicText": {}, "boldText": "Pogrubienie", - "@boldText": {}, "strikeThrough": "Przekreślenie", - "@strikeThrough": {}, "incomingMessages": "Wiadomości przychodzące", "@incomingMessages": {}, "loginWithMatrixId": "Zaloguj się identyfikatorem Matrix", - "@loginWithMatrixId": {}, "passwordsDoNotMatch": "Hasła się nie zgadzają", - "@passwordsDoNotMatch": {}, "unbanUserDescription": "Użytkownik będzie w stanie dołączyć do czatu ponownie.", - "@unbanUserDescription": {}, "roomUpgradeDescription": "Czat zostanie przeniesiony do pokoju w nowej wersji. Wszyscy użytkownicy zostaną powiadomieni o konieczności dołączenia do nowego czatu. Możesz dowiedzieć się więcej o wersjach pokojów na https://spec.matrix.org/latest/rooms/", "@roomUpgradeDescription": {}, "requestedKeyVerification": "{sender} poprosił/-a o weryfikację kluczy", @@ -2708,9 +2528,7 @@ "changeGeneralChatSettings": "Zmień ogólne ustawienia czatu", "@changeGeneralChatSettings": {}, "verifyOtherUserDescription": "Jeśli zweryfikujesz innego użytkownika, możesz być pewien/-na z kim naprawdę piszesz. 💪\n\nKiedy rozpoczniesz weryfikację, Ty i ta druga osoba zobaczycie okienko dialogowe. Zobaczycie w nim serię emotikonów lub numery do porównania.\n\nNajlepiej potwierdzić ich zgodność osobiście lub przez wideorozmowę. 👭", - "@verifyOtherUserDescription": {}, "verifyOtherDeviceDescription": "Jeśli zweryfikujesz inne urządzenie, będzie mogło ono wymienić klucze z dotychczasowym, zwiększając ogólne bezpieczeństwo. 💪 Kiedy rozpoczniesz weryfikację, na obu urządzeniach wyświetli się okno dialogowe. Zobaczysz w nim serię emotikonów lub numery do porównania. Najlepiej mieć oba urządzenia pod ręką przed rozpoczęciem weryfikacji. 🤳", - "@verifyOtherDeviceDescription": {}, "unreadChatsInApp": "{appname}: {unread} nieprzeczytanych czatów", "@unreadChatsInApp": { "type": "String", @@ -2724,37 +2542,23 @@ } }, "addLink": "Dodaj link", - "@addLink": {}, "unread": "Nieprzeczytane", - "@unread": {}, "space": "Przestrzeń", - "@space": {}, "spaces": "Przestrzenie", "@spaces": {}, "noMoreChatsFound": "Nie znaleziono więcej czatów...", "@noMoreChatsFound": {}, "removeDevicesDescription": "Nastąpi wylogowanie z tego urządzenia. Nie będziesz w stanie odbierać na nim wiadomości.", - "@removeDevicesDescription": {}, "makeAdminDescription": "Kiedy użytkownik zostanie adminem, nie będziesz móc tego cofnąć, bo nabierze takich samych uprawnień, jak Ty.", - "@makeAdminDescription": {}, "searchChatsRooms": "Szukaj #czatów, @użytkowników...", - "@searchChatsRooms": {}, "createGroupAndInviteUsers": "Utwórz grupę i zaproś użytkowników", - "@createGroupAndInviteUsers": {}, "groupCanBeFoundViaSearch": "Grupa może być znaleziona poprzez wyszukiwanie", - "@groupCanBeFoundViaSearch": {}, "wrongRecoveryKey": "Niestety to nie wygląda na poprawny klucz odzyskiwania.", - "@wrongRecoveryKey": {}, "searchForUsers": "Szukaj @użytkowników...", - "@searchForUsers": {}, "pleaseEnterYourCurrentPassword": "Proszę podać swoje obecne hasło", - "@pleaseEnterYourCurrentPassword": {}, "passwordIsWrong": "Podano niepoprawne hasło", - "@passwordIsWrong": {}, "joinSpace": "Dołącz do przestrzeni", - "@joinSpace": {}, "addChatOrSubSpace": "Dodaj czat lub podprzestrzeń", - "@addChatOrSubSpace": {}, "initAppError": "Wystąpił błąd podczas inicjalizacji aplikacji", "@initAppError": {}, "searchIn": "Szukaj w czacie \"{chat}\"...", @@ -2767,7 +2571,6 @@ } }, "kickUserDescription": "Użytkownik jest wyrzucony z czatu, ale nie zbanowany. Do czatu publicznego może dołączyć ponownie.", - "@kickUserDescription": {}, "appWantsToUseForLogin": "Użyj serwera '{server}' do zalogowania się", "@appWantsToUseForLogin": { "type": "String", @@ -2778,83 +2581,44 @@ } }, "appWantsToUseForLoginDescription": "Niniejszym zezwalasz aplikacji i witrynie na udostępnianie informacji o sobie.", - "@appWantsToUseForLoginDescription": {}, "open": "Otwórz", - "@open": {}, "contentNotificationSettings": "Ustawienia powiadomień o treści", - "@contentNotificationSettings": {}, "generalNotificationSettings": "Ogólne ustawienia powiadomień", - "@generalNotificationSettings": {}, "roomNotificationSettings": "Ustawienia powiadomień w pokoju", - "@roomNotificationSettings": {}, "userSpecificNotificationSettings": "Ustawienia powiadomień dla użytkownika", - "@userSpecificNotificationSettings": {}, "otherNotificationSettings": "Inne ustawienia powiadomień", - "@otherNotificationSettings": {}, "notificationRuleContainsUserName": "Włącz dla wiadomości z nazwą użytkownika", - "@notificationRuleContainsUserName": {}, "notificationRuleContainsUserNameDescription": "Włącza powiadomienia kiedy wiadomość zawiera Twoją nazwę użytkownika.", - "@notificationRuleContainsUserNameDescription": {}, "notificationRuleMaster": "Wyłącz wszystkie powiadomienia", - "@notificationRuleMaster": {}, "notificationRuleMasterDescription": "Zastępuje inne reguły i wyłącza wszystkie powiadomienia.", - "@notificationRuleMasterDescription": {}, "notificationRuleSuppressNotices": "Wyłącz dla automatycznych wiadomości", - "@notificationRuleSuppressNotices": {}, "notificationRuleSuppressNoticesDescription": "Wyłącza powiadomienia z automatycznych klientów, takich jak boty.", - "@notificationRuleSuppressNoticesDescription": {}, "notificationRuleInviteForMe": "Włącz dla zaproszeń", - "@notificationRuleInviteForMe": {}, "notificationRuleInviteForMeDescription": "Włącza powiadomienia o zaproszeniach do pokoju.", - "@notificationRuleInviteForMeDescription": {}, "notificationRuleMemberEvent": "Wyłącz dla zmian członkostwa", - "@notificationRuleMemberEvent": {}, "notificationRuleMemberEventDescription": "Wyłącza powiadomienia o zmianach członkostwa w pokoju.", - "@notificationRuleMemberEventDescription": {}, "notificationRuleIsUserMention": "Włącz dla wzmianek", - "@notificationRuleIsUserMention": {}, "notificationRuleIsUserMentionDescription": "Włącza powiadomienia o byciu wzmiankowanym w wiadomości.", - "@notificationRuleIsUserMentionDescription": {}, "notificationRuleContainsDisplayName": "Włącz dla wiadomości z nazwą wyświetlaną", - "@notificationRuleContainsDisplayName": {}, "notificationRuleContainsDisplayNameDescription": "Włącza powiadomienia o wiadomościach zawierających Twoją nazwę wyświetlaną.", - "@notificationRuleContainsDisplayNameDescription": {}, "notificationRuleIsRoomMention": "Włącz dla wzmianek pokoju", - "@notificationRuleIsRoomMention": {}, "notificationRuleIsRoomMentionDescription": "Włącza powiadomienia o wzmiankowaniu całego pokoju.", - "@notificationRuleIsRoomMentionDescription": {}, "notificationRuleRoomnotif": "Włącz dla powiadomień w pokoju", - "@notificationRuleRoomnotif": {}, "notificationRuleRoomnotifDescription": "Włącza powiadomienia o wiadomościach zawierających „@room”.", - "@notificationRuleRoomnotifDescription": {}, "notificationRuleTombstone": "Włącz dla „nagrobków”", - "@notificationRuleTombstone": {}, "notificationRuleTombstoneDescription": "Włącza powiadomienia o komunikatach dezaktywacji pokojów.", - "@notificationRuleTombstoneDescription": {}, "notificationRuleReaction": "Wyłącz dla reakcji", - "@notificationRuleReaction": {}, "notificationRuleReactionDescription": "Wyłącza powiadomienia o reakcjach.", - "@notificationRuleReactionDescription": {}, "notificationRuleSuppressEdits": "Wyłącz dla edycji", - "@notificationRuleSuppressEdits": {}, "notificationRuleSuppressEditsDescription": "Wyłącza powiadomienia o edycjach wiadomości.", - "@notificationRuleSuppressEditsDescription": {}, "notificationRuleCall": "Włącz dla połączeń", - "@notificationRuleCall": {}, "notificationRuleRoomServerAclDescription": "Wyłącza powiadomienia dla list kontroli dostępu (ACL) serwera.", - "@notificationRuleRoomServerAclDescription": {}, "notificationRuleRoomServerAcl": "Wyłącz dla list kontroli dostępu serwera", - "@notificationRuleRoomServerAcl": {}, "notificationRuleEncryptedRoomOneToOne": "Włącz dla szyfrowanych pokojów „jeden na jeden”", - "@notificationRuleEncryptedRoomOneToOne": {}, "notificationRuleCallDescription": "Włącza powiadomienia o przychodzących połączeniach.", - "@notificationRuleCallDescription": {}, "notificationRuleRoomOneToOne": "Włącz dla pokojów „jeden na jeden”", - "@notificationRuleRoomOneToOne": {}, "notificationRuleRoomOneToOneDescription": "Włącza powiadomienia o wiadomościach w pokojach „jeden na jeden” (one-to-one).", - "@notificationRuleRoomOneToOneDescription": {}, "notificationRuleMessage": "Włącz dla wiadomości", - "@notificationRuleMessage": {}, "unknownPushRule": "Nieznana reguła: '{rule}'", "@unknownPushRule": { "type": "String", @@ -2865,23 +2629,14 @@ } }, "notificationRuleEncryptedRoomOneToOneDescription": "Włącza powiadomienia o wiadomościach w szyfrowanych pokojach „jeden na jeden” (one-to-one).", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, "notificationRuleEncrypted": "Włącz dla zaszyfrowanych pokojów", - "@notificationRuleEncrypted": {}, "notificationRuleJitsi": "Włącz dla Jitsi", - "@notificationRuleJitsi": {}, "notificationRuleServerAcl": "Wyłącz dla komunikatów o listach kontroli dostępu serwera", - "@notificationRuleServerAcl": {}, "notificationRuleJitsiDescription": "Włącza powiadomienia o komunikatach widżetów Jitsi.", - "@notificationRuleJitsiDescription": {}, "notificationRuleMessageDescription": "Włącza powiadomienia o ogólnych wiadomościach.", - "@notificationRuleMessageDescription": {}, "notificationRuleEncryptedDescription": "Włącza powiadomienia o wiadomościach w zaszyfrowanych pokojach.", - "@notificationRuleEncryptedDescription": {}, "notificationRuleServerAclDescription": "Wyłącza powiadomienia o komunikatach o listach kontroli dostępu (ACL) serwera.", - "@notificationRuleServerAclDescription": {}, "newChatRequest": "📩 Nowa prośba o czat", - "@newChatRequest": {}, "synchronizingPleaseWaitCounter": " Synchronizowanie… ({percentage}%)", "@synchronizingPleaseWaitCounter": { "type": "String", @@ -2894,37 +2649,21 @@ "waitingForServer": "Oczekiwanie na serwer...", "@waitingForServer": {}, "previous": "Poprzedni", - "@previous": {}, "otherPartyNotLoggedIn": "Druga strona nie jest obecnie zalogowana i dlatego nie może odbierać wiadomości!", - "@otherPartyNotLoggedIn": {}, "deletePushRuleCanNotBeUndone": "Jeśli skasujesz to ustawienie powiadomień, nie będzie się dało tego cofnąć.", - "@deletePushRuleCanNotBeUndone": {}, "more": "Więcej", - "@more": {}, "shareKeysWith": "Udostępnij klucze...", - "@shareKeysWith": {}, "crossVerifiedDevicesIfEnabled": "Urządzenia zweryfikowane krzyżowo, jeśli włączone", - "@crossVerifiedDevicesIfEnabled": {}, "crossVerifiedDevices": "Urządzenia zweryfikowane krzyżowo", - "@crossVerifiedDevices": {}, "takeAPhoto": "Zrób zdjęcie", - "@takeAPhoto": {}, "recordAVideo": "Nagraj film", - "@recordAVideo": {}, "optionalMessage": "(Opcjonalna) wiadomość...", - "@optionalMessage": {}, "verifiedDevicesOnly": "Tylko zweryfikowane urządzenia", - "@verifiedDevicesOnly": {}, "shareKeysWithDescription": "Które urządzenia powinny być zaufane, aby mogły odczytywać Twoje wiadomości w zaszyfrowanych czatach?", - "@shareKeysWithDescription": {}, "allDevices": "Wszystkie urządzenia", - "@allDevices": {}, "notSupportedOnThisDevice": "Niewspierane na tym urządzeniu", - "@notSupportedOnThisDevice": {}, "commandHint_roomupgrade": "Zaktualizuj ten pokój do podanej wersji", - "@commandHint_roomupgrade": {}, "enterNewChat": "Dołącz do nowego czatu", - "@enterNewChat": {}, "countInvited": "{count} zaproszonych", "@countInvited": { "type": "String", @@ -2951,21 +2690,13 @@ "ignoreUser": "Ignoruj użytkownika", "@ignoreUser": {}, "approve": "Zaakceptuj", - "@approve": {}, "youHaveKnocked": "Zapukałeś/-aś", - "@youHaveKnocked": {}, "pleaseWaitUntilInvited": "Proszę zaczekać na zaproszenie przez kogoś z pokoju.", - "@pleaseWaitUntilInvited": {}, "commandHint_logout": "Wyloguj bieżące urządzenie", - "@commandHint_logout": {}, "commandHint_logoutall": "Wyloguj wszystkie aktywne urządzenia", - "@commandHint_logoutall": {}, "displayNavigationRail": "Pokazuj pasek nawigacyjny na urządzeniach mobilnych", - "@displayNavigationRail": {}, "customReaction": "Własna reakcja", - "@customReaction": {}, "moreEvents": "Więcej zdarzeń", - "@moreEvents": {}, "declineInvitation": "Odrzuć zaproszenie", "@declineInvitation": {} -} \ No newline at end of file +} From ece4628751cf1bd5aa621794155436658200460e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 21:34:00 +0000 Subject: [PATCH 225/333] build: (deps): Bump docker/build-push-action from 6 to 7 Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6...v7) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e7ec5c10..f769ec3c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -191,7 +191,7 @@ jobs: with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - name: Build and push Docker image - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . push: true From e0c20f249b40723719ba7539bdc3a8cdab902521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 7 Mar 2026 08:21:50 +0100 Subject: [PATCH 226/333] chore: Update redirect android scheme --- lib/config/app_config.dart | 2 +- lib/utils/sign_in_flows/oidc_login.dart | 2 +- lib/utils/sign_in_flows/sso_login.dart | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 0a3aa2dd..347554f6 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -31,7 +31,7 @@ abstract class AppConfig { static const String howDoIGetStickersTutorial = 'https://fluffy.chat/faq/#how_do_i_get_stickers'; static const String appId = 'im.fluffychat.FluffyChat'; - static const String appOpenUrlScheme = 'chat.fluffy'; + static const String appOpenUrlScheme = 'im.fluffychat'; static const String sourceCodeUrl = 'https://github.com/krille-chan/fluffychat'; diff --git a/lib/utils/sign_in_flows/oidc_login.dart b/lib/utils/sign_in_flows/oidc_login.dart index 3dac7079..46c94efa 100644 --- a/lib/utils/sign_in_flows/oidc_login.dart +++ b/lib/utils/sign_in_flows/oidc_login.dart @@ -21,7 +21,7 @@ Future oidcLoginFlow( Logs().i('Starting Matrix Native OIDC Flow...'); final redirectUrl = kIsWeb ? Uri.parse(html.window.location.href.split('#').first.split('?').first) - : (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) + : (PlatformInfos.isMobile || PlatformInfos.isMacOS) ? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login') : Uri.parse('http://localhost:3001/login'); diff --git a/lib/utils/sign_in_flows/sso_login.dart b/lib/utils/sign_in_flows/sso_login.dart index 325793c1..335cb339 100644 --- a/lib/utils/sign_in_flows/sso_login.dart +++ b/lib/utils/sign_in_flows/sso_login.dart @@ -13,15 +13,16 @@ Future ssoLoginFlow( BuildContext context, bool signUp, ) async { - Logs().i('Starting legacy SSO Flow...'); final redirectUrl = kIsWeb ? Uri.parse( html.window.location.href, ).resolveUri(Uri(pathSegments: ['auth.html'])).toString() - : (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) + : (PlatformInfos.isMobile || PlatformInfos.isMacOS) ? '${AppConfig.appOpenUrlScheme.toLowerCase()}://login' : 'http://localhost:3001//login'; + Logs().i('Starting legacy SSO Flow with redirect URL', redirectUrl); + final url = client.homeserver!.replace( path: '/_matrix/client/v3/login/sso/redirect', queryParameters: { From aba8c3faf2cf4b1e06ee5552b700c1f7b20a2a42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 8 Mar 2026 10:15:45 +0100 Subject: [PATCH 227/333] chore: Follow up matrix native oidc --- android/app/src/main/AndroidManifest.xml | 2 +- ios/Runner/Info.plist | 1 + lib/config/app_config.dart | 9 +------ lib/config/setting_keys.dart | 12 ++++++++- lib/pages/intro/intro_page.dart | 5 ++-- lib/pages/intro/intro_page_presenter.dart | 1 + lib/pages/settings/settings_view.dart | 5 ++-- lib/pages/sign_in/sign_in_page.dart | 10 +------ .../sign_in_flows/calc_redirect_url.dart | 27 +++++++++++++++++++ lib/utils/sign_in_flows/check_homeserver.dart | 2 ++ lib/utils/sign_in_flows/oidc_login.dart | 23 +++++----------- lib/utils/sign_in_flows/sso_login.dart | 18 +++---------- lib/widgets/layouts/login_scaffold.dart | 6 ++--- 13 files changed, 63 insertions(+), 58 deletions(-) create mode 100644 lib/utils/sign_in_flows/calc_redirect_url.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1b3f5182..5161a4d8 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -106,7 +106,7 @@ - + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 51765d1c..e828d171 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -35,6 +35,7 @@ ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER) im.fluffychat + chat.fluffy matrix diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 347554f6..d865b6ee 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -21,7 +21,6 @@ abstract class AppConfig { static const double spaceBorderRadius = 11.0; static const double columnWidth = 360.0; - static const String website = 'https://fluffy.chat'; static const String enablePushTutorial = 'https://fluffy.chat/faq/#push_without_google_services'; static const String encryptionTutorial = @@ -31,7 +30,7 @@ abstract class AppConfig { static const String howDoIGetStickersTutorial = 'https://fluffy.chat/faq/#how_do_i_get_stickers'; static const String appId = 'im.fluffychat.FluffyChat'; - static const String appOpenUrlScheme = 'im.fluffychat'; + static const String appOpenUrlScheme = 'chat.fluffy'; static const String sourceCodeUrl = 'https://github.com/krille-chan/fluffychat'; @@ -54,12 +53,6 @@ abstract class AppConfig { path: 'krille-chan/fluffychat/refs/heads/main/recommended_homeservers.json', ); - static final Uri privacyUrl = Uri( - scheme: 'https', - host: 'fluffy.chat', - path: '/en/privacy', - ); - static const String mainIsolatePortName = 'main_isolate'; static const String pushIsolatePortName = 'push_isolate'; } diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index d8522e95..f7d7a13e 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -55,7 +55,17 @@ enum AppSettings { enableSoftLogout('chat.fluffy.enable_soft_logout', false), enableMatrixNativeOIDC('chat.fluffy.enable_matrix_native_oidc', false), presetHomeserver('chat.fluffy.preset_homeserver', ''), - welcomeText('chat.fluffy.welcome_text', ''); + welcomeText('chat.fluffy.welcome_text', ''), + website('chat.fluffy.website_url', 'https://fluffy.chat'), + logoUrl( + 'chat.fluffy.logo_url', + 'https://fluffy.chat/assets/favicon.png', + ), + privacyPolicy( + 'chat.fluffy.privacy_policy_url', + 'https://fluffy.chat/en/privacy', + ), + tos('chat.fluffy.tos_url', 'https://fluffy.chat/en/tos'); final String key; final T defaultValue; diff --git a/lib/pages/intro/intro_page.dart b/lib/pages/intro/intro_page.dart index 46fd7e5d..95950bbc 100644 --- a/lib/pages/intro/intro_page.dart +++ b/lib/pages/intro/intro_page.dart @@ -2,10 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:go_router/go_router.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/intro/flows/restore_backup_flow.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -58,7 +57,7 @@ class IntroPage extends StatelessWidget { ), ), PopupMenuItem( - onTap: () => launchUrl(AppConfig.privacyUrl), + onTap: () => launchUrlString(AppSettings.privacyPolicy.value), child: Row( mainAxisSize: .min, children: [ diff --git a/lib/pages/intro/intro_page_presenter.dart b/lib/pages/intro/intro_page_presenter.dart index fa702bee..9188a4db 100644 --- a/lib/pages/intro/intro_page_presenter.dart +++ b/lib/pages/intro/intro_page_presenter.dart @@ -77,6 +77,7 @@ class _IntroPagePresenterState extends State { final client = await Matrix.of(context).getLoginClient(); await client.checkHomeserver(homeserverUrl); await client.oidcLogin(session: session, code: code, state: state); + if (context.mounted) context.go('/backup'); } catch (e, s) { Logs().w('Unable to login via OIDC', e, s); if (mounted) { diff --git a/lib/pages/settings/settings_view.dart b/lib/pages/settings/settings_view.dart index 20b84146..e8ad37df 100644 --- a/lib/pages/settings/settings_view.dart +++ b/lib/pages/settings/settings_view.dart @@ -3,8 +3,9 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -200,7 +201,7 @@ class SettingsView extends StatelessWidget { ListTile( leading: const Icon(Icons.privacy_tip_outlined), title: Text(L10n.of(context).privacy), - onTap: () => launchUrl(AppConfig.privacyUrl), + onTap: () => launchUrlString(AppSettings.privacyPolicy.value), ), ListTile( leading: const Icon(Icons.info_outline_rounded), diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index c5b49922..242ee57e 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -98,19 +98,11 @@ class SignInPage extends StatelessWidget { final website = server.website; return Semantics( identifier: 'homeserver_tile_$i', - child: RadioListTile.adaptive( + child: RadioListTile( value: server, enabled: state.loginLoading.connectionState != ConnectionState.waiting, - radioScaleFactor: - FluffyThemes.isColumnMode(context) || - { - TargetPlatform.iOS, - TargetPlatform.macOS, - }.contains(theme.platform) - ? 2 - : 1, title: Row( children: [ Expanded( diff --git a/lib/utils/sign_in_flows/calc_redirect_url.dart b/lib/utils/sign_in_flows/calc_redirect_url.dart new file mode 100644 index 00000000..ef0f800d --- /dev/null +++ b/lib/utils/sign_in_flows/calc_redirect_url.dart @@ -0,0 +1,27 @@ +import 'package:flutter/foundation.dart'; + +import 'package:universal_html/html.dart' as html; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; + +(Uri redirectUrl, String urlScheme) calcRedirectUrl({ + bool withAuthHtmlPath = false, +}) { + var redirectUrl = kIsWeb + ? Uri.parse(html.window.location.href.split('#').first.split('?').first) + : (PlatformInfos.isMobile || PlatformInfos.isMacOS) + ? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login') + : Uri.parse('http://localhost:3001/login'); + + if (kIsWeb && withAuthHtmlPath) { + redirectUrl = redirectUrl.resolveUri(Uri(pathSegments: ['auth.html'])); + } + + final urlScheme = + (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) + ? redirectUrl.scheme + : 'http://localhost:3001'; + + return (redirectUrl, urlScheme); +} diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index 5b143615..85f7a371 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/setting_keys.dart'; @@ -73,6 +74,7 @@ Future connectToHomeserverFlow( context.go('/backup'); } } catch (e, s) { + Logs().w('Unable to login', e, s); setState(AsyncSnapshot.withError(ConnectionState.done, e, s)); if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar( diff --git a/lib/utils/sign_in_flows/oidc_login.dart b/lib/utils/sign_in_flows/oidc_login.dart index 46c94efa..0fb9f2c7 100644 --- a/lib/utils/sign_in_flows/oidc_login.dart +++ b/lib/utils/sign_in_flows/oidc_login.dart @@ -6,12 +6,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:matrix/matrix.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:universal_html/html.dart' as html; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart'; Future oidcLoginFlow( Client client, @@ -19,24 +18,16 @@ Future oidcLoginFlow( bool signUp, ) async { Logs().i('Starting Matrix Native OIDC Flow...'); - final redirectUrl = kIsWeb - ? Uri.parse(html.window.location.href.split('#').first.split('?').first) - : (PlatformInfos.isMobile || PlatformInfos.isMacOS) - ? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login') - : Uri.parse('http://localhost:3001/login'); - final urlScheme = - (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) - ? redirectUrl.scheme - : 'http://localhost:3001'; + final (redirectUrl, urlScheme) = calcRedirectUrl(); - final clientUri = Uri.parse(AppConfig.website); + final clientUri = Uri.parse(AppSettings.website.value); final supportWebPlatform = kIsWeb && kReleaseMode && redirectUrl.scheme == 'https' && redirectUrl.host.contains(clientUri.host); - if (!supportWebPlatform) { + if (kIsWeb && !supportWebPlatform) { Logs().w( 'OIDC Application Type web is not supported. Using native now. Please use this instance not in production!', ); @@ -50,9 +41,9 @@ Future oidcLoginFlow( clientInformation: OidcClientInformation( clientName: AppSettings.applicationName.value, clientUri: clientUri, - logoUri: Uri.parse('https://fluffy.chat/assets/favicon.png'), - tosUri: null, - policyUri: AppConfig.privacyUrl, + logoUri: Uri.parse(AppSettings.logoUrl.value), + tosUri: Uri.parse(AppSettings.tos.value), + policyUri: Uri.parse(AppSettings.privacyPolicy.value), ), ); diff --git a/lib/utils/sign_in_flows/sso_login.dart b/lib/utils/sign_in_flows/sso_login.dart index 335cb339..1721a2ea 100644 --- a/lib/utils/sign_in_flows/sso_login.dart +++ b/lib/utils/sign_in_flows/sso_login.dart @@ -1,40 +1,28 @@ -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:matrix/matrix.dart'; -import 'package:universal_html/html.dart' as html; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart'; Future ssoLoginFlow( Client client, BuildContext context, bool signUp, ) async { - final redirectUrl = kIsWeb - ? Uri.parse( - html.window.location.href, - ).resolveUri(Uri(pathSegments: ['auth.html'])).toString() - : (PlatformInfos.isMobile || PlatformInfos.isMacOS) - ? '${AppConfig.appOpenUrlScheme.toLowerCase()}://login' - : 'http://localhost:3001//login'; + final (redirectUrl, urlScheme) = calcRedirectUrl(withAuthHtmlPath: true); Logs().i('Starting legacy SSO Flow with redirect URL', redirectUrl); final url = client.homeserver!.replace( path: '/_matrix/client/v3/login/sso/redirect', queryParameters: { - 'redirectUrl': redirectUrl, + 'redirectUrl': redirectUrl.toString(), 'action': signUp ? 'register' : 'login', }, ); - final urlScheme = - (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS) - ? Uri.parse(redirectUrl).scheme - : 'http://localhost:3001'; final result = await FlutterWebAuth2.authenticate( url: url.toString(), callbackUrlScheme: urlScheme, diff --git a/lib/widgets/layouts/login_scaffold.dart b/lib/widgets/layouts/login_scaffold.dart index 944ca391..49b36861 100644 --- a/lib/widgets/layouts/login_scaffold.dart +++ b/lib/widgets/layouts/login_scaffold.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:particles_network/particles_network.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -118,7 +118,7 @@ class _PrivacyButtons extends StatelessWidget { mainAxisAlignment: mainAxisAlignment, children: [ TextButton( - onPressed: () => launchUrlString(AppConfig.website), + onPressed: () => launchUrlString(AppSettings.website.value), child: Text(L10n.of(context).website, style: shadowTextStyle), ), TextButton( @@ -126,7 +126,7 @@ class _PrivacyButtons extends StatelessWidget { child: Text(L10n.of(context).help, style: shadowTextStyle), ), TextButton( - onPressed: () => launchUrl(AppConfig.privacyUrl), + onPressed: () => launchUrlString(AppSettings.privacyPolicy.value), child: Text(L10n.of(context).privacy, style: shadowTextStyle), ), TextButton( From bad0a549cb851df7b716f5e682868caea729694b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 8 Mar 2026 11:01:38 +0100 Subject: [PATCH 228/333] chore: Follow up remote logout handling --- lib/widgets/matrix.dart | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 60fd73b7..252ab213 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -257,7 +257,7 @@ class MatrixState extends State with WidgetsBindingObserver { }); onLogoutSub[name] ??= c.onLoginStateChanged.stream .where((state) => state == LoginState.loggedOut) - .listen((state) { + .listen((_) { final loggedInWithMultipleClients = widget.clients.length > 1; _cancelSubs(c.clientName); @@ -272,11 +272,9 @@ class MatrixState extends State with WidgetsBindingObserver { ).showSnackBar( SnackBar(content: Text(L10n.of(context).oneClientLoggedOut)), ); - - if (state != LoginState.loggedIn) { - FluffyChatApp.router.go('/rooms'); - } + return; } + FluffyChatApp.router.go('/'); }); onUiaRequest[name] ??= c.onUiaRequest.stream.listen(uiaRequestHandler); if (PlatformInfos.isWeb || PlatformInfos.isLinux) { From a3a2a37a143474370f1731a71510292046913b6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 8 Mar 2026 11:12:32 +0100 Subject: [PATCH 229/333] chore: Add reset button for config viewer --- lib/config/setting_keys.dart | 5 +++++ lib/l10n/intl_en.arb | 3 ++- lib/widgets/config_viewer.dart | 17 ++++++++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index f7d7a13e..c623ce6c 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -75,6 +75,11 @@ enum AppSettings { static SharedPreferences get store => _store!; static SharedPreferences? _store; + static Future reset({bool loadWebConfigFile = true}) async { + await AppSettings._store!.clear(); + await init(loadWebConfigFile: loadWebConfigFile); + } + static Future init({bool loadWebConfigFile = true}) async { if (AppSettings._store != null) return AppSettings.store; diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index ce842573..4226d4fd 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -2781,5 +2781,6 @@ "@mute": { "description": "This should be a very short string because there is not much space in the button!" }, - "createNewChat": "Create new chat" + "createNewChat": "Create new chat", + "reset": "Reset" } \ No newline at end of file diff --git a/lib/widgets/config_viewer.dart b/lib/widgets/config_viewer.dart index 82a9d4ba..8fb826d8 100644 --- a/lib/widgets/config_viewer.dart +++ b/lib/widgets/config_viewer.dart @@ -48,6 +48,11 @@ class _ConfigViewerState extends State { setState(() {}); } + Future _reset() async { + await AppSettings.reset(); + setState(() {}); + } + @override Widget build(BuildContext context) { final theme = Theme.of(context); @@ -55,8 +60,12 @@ class _ConfigViewerState extends State { appBar: AppBar( title: Text(L10n.of(context).advancedConfigurations), leading: BackButton(onPressed: () => context.go('/')), + actions: [ + TextButton(onPressed: _reset, child: Text(L10n.of(context).reset)), + ], ), body: Column( + crossAxisAlignment: .stretch, children: [ Container( margin: const EdgeInsets.all(16), @@ -81,7 +90,13 @@ class _ConfigViewerState extends State { value = appSetting.value.toString(); } if (appSetting is AppSettings) { - value = appSetting.value.toString(); + return SwitchListTile.adaptive( + title: Text(appSetting.name), + subtitle: Text(value), + value: appSetting.value, + onChanged: (value) => + _changeSetting(appSetting, store, (!value).toString()), + ); } if (appSetting is AppSettings) { value = appSetting.value.toString(); From 8f8309aa63a432d85983287790bd1bb115b1f47a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Fri, 6 Mar 2026 10:31:17 +0100 Subject: [PATCH 230/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (747 of 747 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index ed4886aa..9391c312 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -2787,5 +2787,10 @@ "removeAdminRights": "删除管理员权限", "powerLevel": "权限级别", "setPowerLevelDescription": "权限级别定义群成员在这个聊天室中可以做什么,取值范围 0 到 100。", - "owner": "所有者" -} \ No newline at end of file + "owner": "所有者", + "mute": "静音", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "新建聊天" +} From 4825135de2dca8d75ce6b47678b826be2d697d47 Mon Sep 17 00:00:00 2001 From: Jelv Date: Sat, 7 Mar 2026 10:51:57 +0100 Subject: [PATCH 231/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (747 of 747 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index 10c39668..3955a2b4 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -2786,5 +2786,10 @@ "removeAdminRights": "Verwijder beheerder-rechten", "powerLevel": "Rechtenniveau", "setPowerLevelDescription": "Rechtenniveau's definiëren wat een persoon mag doen in deze chat en variëren meestal tussen 0 en 100.", - "owner": "Eigenaar" -} \ No newline at end of file + "owner": "Eigenaar", + "mute": "Demp", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Creëer nieuw chat" +} From 1cfda2e338f83cb5f5489e17f5f58c5300413213 Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Fri, 6 Mar 2026 22:34:54 +0100 Subject: [PATCH 232/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (747 of 747 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 01c0e58c..8add5a41 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -2794,5 +2794,10 @@ "removeAdminRights": "Fjern admin-rettigheter", "powerLevel": "Styrkenivå", "setPowerLevelDescription": "Styrkenivåer definerer hva et medlem har lov til å gjøre i dette rommet, og varierer vanligvis mellom 0 og 100.", - "owner": "Eier" -} \ No newline at end of file + "owner": "Eier", + "mute": "Demp", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Opprett ny chat" +} From 9438594fa2d46817dd2a914475901785be995154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sat, 7 Mar 2026 11:44:16 +0100 Subject: [PATCH 233/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (747 of 747 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index 5750ca5d..080b6c72 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -2793,5 +2793,10 @@ "removeAdminRights": "Bain cearta riarthóra", "powerLevel": "Leibhéal cumhachta", "setPowerLevelDescription": "Sainmhíníonn leibhéil chumhachta cad a cheadaítear do bhall a dhéanamh sa seomra seo agus is gnách go mbíonn siad idir 0 agus 100.", - "owner": "Úinéir" -} \ No newline at end of file + "owner": "Úinéir", + "mute": "Balbhaigh", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Cruthaigh comhrá nua" +} From fc7eb6954c592f5cfd9c8e1e6d23bdd8a373c360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 9 Mar 2026 17:01:11 +0100 Subject: [PATCH 234/333] refactor: Make file events more fail safe for failed to send --- lib/pages/chat/events/audio_player.dart | 8 ++++---- lib/pages/chat/send_file_dialog.dart | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index f2edc232..f78345d3 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -165,11 +165,11 @@ class AudioPlayerState extends State { : null, ); - if (!kIsWeb) { + final attachmentUrl = widget.event.attachmentOrThumbnailMxcUrl(); + + if (!kIsWeb && attachmentUrl != null) { final tempDir = await getTemporaryDirectory(); - final fileName = Uri.encodeComponent( - widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last, - ); + final fileName = Uri.encodeComponent(attachmentUrl.pathSegments.last); file = File('${tempDir.path}/${fileName}_${matrixFile.name}'); await file.writeAsBytes(matrixFile.bytes); diff --git a/lib/pages/chat/send_file_dialog.dart b/lib/pages/chat/send_file_dialog.dart index 57f124b2..8ae0627b 100644 --- a/lib/pages/chat/send_file_dialog.dart +++ b/lib/pages/chat/send_file_dialog.dart @@ -1,8 +1,9 @@ +import 'package:async/async.dart' show Result; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cross_file/cross_file.dart'; -import 'package:matrix/matrix.dart'; +import 'package:matrix/matrix.dart' hide Result; import 'package:mime/mime.dart'; import 'package:fluffychat/config/app_config.dart'; @@ -53,8 +54,9 @@ class SendFileDialogState extends State { } scaffoldMessenger.showLoadingSnackBar(l10n.prepareSendingAttachment); Navigator.of(context, rootNavigator: false).pop(); - final clientConfig = await widget.room.client.getConfig(); - final maxUploadSize = clientConfig.mUploadSize ?? 100 * 1000 * 1000; + final clientConfig = await Result.capture(widget.room.client.getConfig()); + final maxUploadSize = + clientConfig.asValue?.value.mUploadSize ?? 100 * 1000 * 1000; for (final xfile in widget.files) { final MatrixFile file; From 85c21e61c30ea5e97cdcbc1e39c219f366f8995b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 9 Mar 2026 17:07:55 +0100 Subject: [PATCH 235/333] chore: Move website back to fluffychat.im --- android/app/src/main/AndroidManifest.xml | 2 +- ios/Runner/Info.plist | 1 - lib/config/app_config.dart | 10 +++++----- lib/config/setting_keys.dart | 8 ++++---- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5161a4d8..1b3f5182 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -106,7 +106,7 @@ - + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index e828d171..51765d1c 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -35,7 +35,6 @@ ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER) im.fluffychat - chat.fluffy matrix diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index d865b6ee..0dcb6c4c 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -22,15 +22,15 @@ abstract class AppConfig { static const double columnWidth = 360.0; static const String enablePushTutorial = - 'https://fluffy.chat/faq/#push_without_google_services'; + 'https://fluffychat.im/faq/#push_without_google_services'; static const String encryptionTutorial = - 'https://fluffy.chat/faq/#how_to_use_end_to_end_encryption'; + 'https://fluffychat.im/faq/#how_to_use_end_to_end_encryption'; static const String startChatTutorial = - 'https://fluffy.chat/faq/#how_do_i_find_other_users'; + 'https://fluffychat.im/faq/#how_do_i_find_other_users'; static const String howDoIGetStickersTutorial = - 'https://fluffy.chat/faq/#how_do_i_get_stickers'; + 'https://fluffychat.im/faq/#how_do_i_get_stickers'; static const String appId = 'im.fluffychat.FluffyChat'; - static const String appOpenUrlScheme = 'chat.fluffy'; + static const String appOpenUrlScheme = 'im.fluffychat'; static const String sourceCodeUrl = 'https://github.com/krille-chan/fluffychat'; diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index c623ce6c..627313ed 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -56,16 +56,16 @@ enum AppSettings { enableMatrixNativeOIDC('chat.fluffy.enable_matrix_native_oidc', false), presetHomeserver('chat.fluffy.preset_homeserver', ''), welcomeText('chat.fluffy.welcome_text', ''), - website('chat.fluffy.website_url', 'https://fluffy.chat'), + website('chat.fluffy.website_url', 'https://fluffychat.im'), logoUrl( 'chat.fluffy.logo_url', - 'https://fluffy.chat/assets/favicon.png', + 'https://fluffychat.im/assets/favicon.png', ), privacyPolicy( 'chat.fluffy.privacy_policy_url', - 'https://fluffy.chat/en/privacy', + 'https://fluffychat.im/en/privacy', ), - tos('chat.fluffy.tos_url', 'https://fluffy.chat/en/tos'); + tos('chat.fluffy.tos_url', 'https://fluffychat.im/en/tos'); final String key; final T defaultValue; From 47ac9c8f972d8dedb95f22c982b15e0846257e4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 9 Mar 2026 17:09:45 +0100 Subject: [PATCH 236/333] chore: Skip matrix notify for events from myself --- .github/workflows/matrix_notify.yaml | 1 + lib/pages/chat/send_file_dialog.dart | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/matrix_notify.yaml b/.github/workflows/matrix_notify.yaml index fe467280..f1583f11 100644 --- a/.github/workflows/matrix_notify.yaml +++ b/.github/workflows/matrix_notify.yaml @@ -8,6 +8,7 @@ on: jobs: notify: + if: ${{ (github.event_name == 'issues' && github.event.issue.user.login != 'krille-chan') || (github.event_name == 'pull_request_target' && github.event.pull_request.user.login != 'krille-chan') }} runs-on: ubuntu-latest steps: - name: Send notification to Matrix room diff --git a/lib/pages/chat/send_file_dialog.dart b/lib/pages/chat/send_file_dialog.dart index 8ae0627b..4e67b338 100644 --- a/lib/pages/chat/send_file_dialog.dart +++ b/lib/pages/chat/send_file_dialog.dart @@ -1,7 +1,7 @@ -import 'package:async/async.dart' show Result; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:async/async.dart' show Result; import 'package:cross_file/cross_file.dart'; import 'package:matrix/matrix.dart' hide Result; import 'package:mime/mime.dart'; From 1e763f05f5e69121b4f7b263e5eec0f184edae91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 9 Mar 2026 17:42:54 +0100 Subject: [PATCH 237/333] fix: Open deep links --- lib/config/routes.dart | 10 ++++- lib/pages/chat_list/chat_list.dart | 25 ++++-------- .../new_private_chat/new_private_chat.dart | 15 ++++++- lib/widgets/fluffy_chat_app.dart | 7 ++++ linux/flutter/generated_plugin_registrant.cc | 4 -- linux/flutter/generated_plugins.cmake | 1 - macos/Flutter/GeneratedPluginRegistrant.swift | 2 - pubspec.lock | 40 ------------------- pubspec.yaml | 1 - .../flutter/generated_plugin_registrant.cc | 3 -- windows/flutter/generated_plugins.cmake | 1 - 11 files changed, 37 insertions(+), 72 deletions(-) diff --git a/lib/config/routes.dart b/lib/config/routes.dart index a6d2d70c..6ae9d3b6 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -170,8 +170,14 @@ abstract class AppRoutes { ), GoRoute( path: 'newprivatechat', - pageBuilder: (context, state) => - defaultPageBuilder(context, state, const NewPrivateChat()), + pageBuilder: (context, state) => defaultPageBuilder( + context, + state, + NewPrivateChat( + key: ValueKey('new_chat_${state.uri.query}'), + deeplink: state.uri.queryParameters['deeplink'], + ), + ), redirect: loggedOutRedirect, ), GoRoute( diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index d8751f9c..75181bf0 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -1,9 +1,9 @@ import 'dart:async'; +import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:app_links/app_links.dart'; import 'package:cross_file/cross_file.dart'; import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; import 'package:go_router/go_router.dart'; @@ -11,6 +11,7 @@ import 'package:matrix/matrix.dart' as sdk; import 'package:matrix/matrix.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list_view.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; @@ -71,8 +72,6 @@ class ChatListController extends State StreamSubscription? _intentFileStreamSubscription; - StreamSubscription? _intentUriStreamSubscription; - late ActiveFilter activeFilter; String? _activeSpaceId; @@ -308,6 +307,12 @@ class ChatListController extends State void _processIncomingSharedMedia(List files) { if (files.isEmpty) return; + if (files.singleOrNull?.path.startsWith(AppConfig.deepLinkPrefix) == true) { + return; + } + + inspect(files); + showScaffoldDialog( context: context, builder: (context) => ShareScaffoldDialog( @@ -326,14 +331,6 @@ class ChatListController extends State ); } - Future _processIncomingUris(Uri? uri) async { - if (uri == null) return; - context.go('/rooms'); - WidgetsBinding.instance.addPostFrameCallback((_) { - UrlLauncher(context, uri.toString()).openMatrixToUrl(); - }); - } - void _initReceiveSharingIntent() { if (!PlatformInfos.isMobile) return; @@ -347,11 +344,6 @@ class ChatListController extends State _processIncomingSharedMedia, ); - // For receiving shared Uris - _intentUriStreamSubscription = AppLinks().uriLinkStream.listen( - _processIncomingUris, - ); - if (PlatformInfos.isAndroid) { final shortcuts = FlutterShortcuts(); shortcuts.initialize().then( @@ -394,7 +386,6 @@ class ChatListController extends State void dispose() { _intentDataStreamSubscription?.cancel(); _intentFileStreamSubscription?.cancel(); - _intentUriStreamSubscription?.cancel(); scrollController.removeListener(_onScroll); super.dispose(); } diff --git a/lib/pages/new_private_chat/new_private_chat.dart b/lib/pages/new_private_chat/new_private_chat.dart index 55435cc1..e5d8e202 100644 --- a/lib/pages/new_private_chat/new_private_chat.dart +++ b/lib/pages/new_private_chat/new_private_chat.dart @@ -17,7 +17,8 @@ import 'package:fluffychat/widgets/matrix.dart'; import '../../widgets/adaptive_dialogs/user_dialog.dart'; class NewPrivateChat extends StatefulWidget { - const NewPrivateChat({super.key}); + final String? deeplink; + const NewPrivateChat({super.key, required this.deeplink}); @override NewPrivateChatController createState() => NewPrivateChatController(); @@ -33,6 +34,18 @@ class NewPrivateChatController extends State { static const Duration _coolDown = Duration(milliseconds: 500); + @override + void initState() { + super.initState(); + + final deeplink = widget.deeplink; + if (deeplink != null) { + WidgetsBinding.instance.addPostFrameCallback((_) { + UrlLauncher(context, deeplink).openMatrixToUrl(); + }); + } + } + Future searchUsers([String? input]) async { final searchTerm = input ?? controller.text; if (searchTerm.isEmpty) { diff --git a/lib/widgets/fluffy_chat_app.dart b/lib/widgets/fluffy_chat_app.dart index 4a72d07d..af780379 100644 --- a/lib/widgets/fluffy_chat_app.dart +++ b/lib/widgets/fluffy_chat_app.dart @@ -4,6 +4,7 @@ import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/routes.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; @@ -37,6 +38,12 @@ class FluffyChatApp extends StatelessWidget { static final GoRouter router = GoRouter( routes: AppRoutes.routes, debugLogDiagnostics: true, + redirect: (context, state) { + if (state.uri.toString().startsWith(AppConfig.deepLinkPrefix)) { + return '/rooms/newprivatechat?deeplink=${state.uri}'; + } + return null; + }, ); @override diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index deccda1d..b586adbb 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -45,9 +44,6 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin"); flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar); - g_autoptr(FlPluginRegistrar) gtk_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); - gtk_plugin_register_with_registrar(gtk_registrar); g_autoptr(FlPluginRegistrar) handy_window_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin"); handy_window_plugin_register_with_registrar(handy_window_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 53413056..95cd5f00 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -10,7 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST file_selector_linux flutter_secure_storage_linux flutter_webrtc - gtk handy_window record_linux screen_retriever_linux diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 0e1ab0ca..a334837f 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,7 +5,6 @@ import FlutterMacOS import Foundation -import app_links import audio_session import desktop_drop import desktop_webview_window @@ -36,7 +35,6 @@ import window_manager import window_to_front func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin")) AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) DesktopWebviewWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWebviewWindowPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 982b471c..78d1b750 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -41,38 +41,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" - app_links: - dependency: "direct main" - description: - name: app_links - sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8" - url: "https://pub.dev" - source: hosted - version: "6.4.1" - app_links_linux: - dependency: transitive - description: - name: app_links_linux - sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 - url: "https://pub.dev" - source: hosted - version: "1.0.3" - app_links_platform_interface: - dependency: transitive - description: - name: app_links_platform_interface - sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - app_links_web: - dependency: transitive - description: - name: app_links_web - sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 - url: "https://pub.dev" - source: hosted - version: "1.0.4" archive: dependency: "direct main" description: @@ -807,14 +775,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.8" - gtk: - dependency: transitive - description: - name: gtk - sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c - url: "https://pub.dev" - source: hosted - version: "2.1.0" handy_window: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index aeeb8e91..99115e51 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,6 @@ environment: dependencies: animations: ^2.1.1 - app_links: ^6.4.1 archive: ^4.0.7 async: ^2.11.0 badges: ^3.1.2 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 0e75c643..42b9ae09 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,7 +6,6 @@ #include "generated_plugin_registrant.h" -#include #include #include #include @@ -26,8 +25,6 @@ #include void RegisterPlugins(flutter::PluginRegistry* registry) { - AppLinksPluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("AppLinksPluginCApi")); DesktopDropPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("DesktopDropPlugin")); DesktopWebviewWindowPluginRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 30709077..93b91c2e 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,7 +3,6 @@ # list(APPEND FLUTTER_PLUGIN_LIST - app_links desktop_drop desktop_webview_window dynamic_color From a2857ef36a559abe2571b7440f66798f298a25c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 9 Mar 2026 17:44:11 +0100 Subject: [PATCH 238/333] chore: Follow up user viewer --- .../adaptive_dialog_action.dart | 4 +- lib/widgets/adaptive_dialogs/user_dialog.dart | 78 ++++++++++--------- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart index 5848cf54..09e8d6ac 100644 --- a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart +++ b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart @@ -85,7 +85,7 @@ class AdaptiveDialogAction extends StatelessWidget { class AdaptiveDialogInkWell extends StatelessWidget { final Widget child; - final VoidCallback onTap; + final VoidCallback? onTap; final EdgeInsets padding; const AdaptiveDialogInkWell({ @@ -125,7 +125,7 @@ class AdaptiveDialogInkWell extends StatelessWidget { class AdaptiveIconTextButton extends StatelessWidget { final String label; final IconData icon; - final VoidCallback onTap; + final VoidCallback? onTap; const AdaptiveIconTextButton({ super.key, required this.label, diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index 4be6ba9d..674bd9c1 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -195,35 +195,39 @@ class UserDialog extends StatelessWidget { AdaptiveIconTextButton( label: L10n.of(context).block, icon: Icons.block_outlined, - onTap: () { - final router = GoRouter.of(context); - Navigator.of(context).pop(); - router.go( - '/rooms/settings/security/ignorelist', - extra: profile.userId, - ); - }, + onTap: client.userID == profile.userId + ? null + : () { + final router = GoRouter.of(context); + Navigator.of(context).pop(); + router.go( + '/rooms/settings/security/ignorelist', + extra: profile.userId, + ); + }, ), AdaptiveIconTextButton( label: L10n.of(context).report, icon: Icons.gavel_outlined, - onTap: () async { - Navigator.of(context).pop(); - final reason = await showTextInputDialog( - context: context, - title: L10n.of(context).whyDoYouWantToReportThis, - okLabel: L10n.of(context).report, - cancelLabel: L10n.of(context).cancel, - hintText: L10n.of(context).reason, - ); - if (reason == null || reason.isEmpty) return; - await showFutureLoadingDialog( - context: context, - future: () => Matrix.of( - context, - ).client.reportUser(profile.userId, reason), - ); - }, + onTap: client.userID == profile.userId + ? null + : () async { + Navigator.of(context).pop(); + final reason = await showTextInputDialog( + context: context, + title: L10n.of(context).whyDoYouWantToReportThis, + okLabel: L10n.of(context).report, + cancelLabel: L10n.of(context).cancel, + hintText: L10n.of(context).reason, + ); + if (reason == null || reason.isEmpty) return; + await showFutureLoadingDialog( + context: context, + future: () => Matrix.of( + context, + ).client.reportUser(profile.userId, reason), + ); + }, ), AdaptiveIconTextButton( label: L10n.of(context).share, @@ -236,17 +240,19 @@ class UserDialog extends StatelessWidget { ], ), AdaptiveDialogInkWell( - onTap: () async { - final router = GoRouter.of(context); - final roomIdResult = await showFutureLoadingDialog( - context: context, - future: () => client.startDirectChat(profile.userId), - ); - final roomId = roomIdResult.result; - if (roomId == null) return; - if (context.mounted) Navigator.of(context).pop(); - router.go('/rooms/$roomId'); - }, + onTap: client.userID == profile.userId + ? null + : () async { + final router = GoRouter.of(context); + final roomIdResult = await showFutureLoadingDialog( + context: context, + future: () => client.startDirectChat(profile.userId), + ); + final roomId = roomIdResult.result; + if (roomId == null) return; + if (context.mounted) Navigator.of(context).pop(); + router.go('/rooms/$roomId'); + }, child: Text( directChatRoomId == null ? L10n.of(context).createNewChat From e8ee58d6d9c3287912b7853dbf7834eb8160358d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 10 Mar 2026 09:06:03 +0100 Subject: [PATCH 239/333] refactor: Disable custom image resizer for macOS and windows --- lib/utils/client_manager.dart | 4 +++- lib/utils/platform_infos.dart | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 856a907a..ffb68792 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -123,7 +123,9 @@ abstract class ClientManager { // To make room emotes work 'im.ponies.room_emotes', }, - customImageResizer: customImageResizer, + customImageResizer: PlatformInfos.supportsCustomImageResizer + ? customImageResizer + : null, logLevel: kReleaseMode ? Level.warning : Level.verbose, database: await flutterMatrixSdkDatabaseBuilder(clientName), supportedLoginTypes: { diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index 0f225b73..1c1b2623 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -33,6 +33,9 @@ abstract class PlatformInfos { static bool get supportsVideoPlayer => !PlatformInfos.isWindows && !PlatformInfos.isLinux; + static bool get supportsCustomImageResizer => + PlatformInfos.isWeb || PlatformInfos.isMobile; + /// Web could also record in theory but currently only wav which is too large static bool get platformCanRecord => (isMobile || isMacOS || isWeb); From c90fdc3e7536d2c42f107cc229bd42bd6a52de04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 10 Mar 2026 09:13:57 +0100 Subject: [PATCH 240/333] chore: make sendTimelineEventTimeout configurable --- lib/config/setting_keys.dart | 3 ++- lib/utils/client_manager.dart | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 627313ed..471f8897 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -65,7 +65,8 @@ enum AppSettings { 'chat.fluffy.privacy_policy_url', 'https://fluffychat.im/en/privacy', ), - tos('chat.fluffy.tos_url', 'https://fluffychat.im/en/tos'); + tos('chat.fluffy.tos_url', 'https://fluffychat.im/en/tos'), + sendTimelineEventTimeout('chat.fluffy.send_timeline_event_timeout', 15); final String key; final T defaultValue; diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index ffb68792..bdb33f95 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -143,6 +143,9 @@ abstract class ClientManager { onSoftLogout: enableSoftLogout ? (client) => client.refreshAccessToken() : null, + sendTimelineEventTimeout: Duration( + seconds: AppSettings.sendTimelineEventTimeout.value, + ), ); } From a490a40379c28e0613d140117cfb06b390809557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 10 Mar 2026 09:29:45 +0100 Subject: [PATCH 241/333] chore: Adjust design --- lib/config/themes.dart | 2 +- .../invitation_selection/invitation_selection_view.dart | 5 ++--- lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart | 4 +++- lib/widgets/adaptive_dialogs/public_room_dialog.dart | 1 + lib/widgets/permission_slider_dialog.dart | 2 +- lib/widgets/qr_code_viewer.dart | 6 +++++- 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/config/themes.dart b/lib/config/themes.dart index 122eef91..42d83dc9 100644 --- a/lib/config/themes.dart +++ b/lib/config/themes.dart @@ -74,7 +74,7 @@ abstract class FluffyThemes { ), inputDecorationTheme: InputDecorationTheme( border: OutlineInputBorder( - borderRadius: BorderRadius.circular(AppConfig.borderRadius), + borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), ), contentPadding: const EdgeInsets.all(12), ), diff --git a/lib/pages/invitation_selection/invitation_selection_view.dart b/lib/pages/invitation_selection/invitation_selection_view.dart index 4db33841..562713d8 100644 --- a/lib/pages/invitation_selection/invitation_selection_view.dart +++ b/lib/pages/invitation_selection/invitation_selection_view.dart @@ -191,10 +191,9 @@ class _InviteContactListTile extends StatelessWidget { overflow: TextOverflow.ellipsis, style: TextStyle(color: theme.colorScheme.secondary), ), - trailing: TextButton.icon( + trailing: TextButton( onPressed: isMember ? null : onTap, - label: Text(isMember ? l10n.participant : l10n.invite), - icon: Icon(isMember ? Icons.check : Icons.add), + child: Text(isMember ? l10n.participant : l10n.invite), ), ); } diff --git a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart index 09e8d6ac..6fbc9a0c 100644 --- a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart +++ b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart @@ -108,7 +108,9 @@ class AdaptiveDialogInkWell extends StatelessWidget { ); } return Material( - color: theme.colorScheme.surfaceBright, + color: onTap == null + ? theme.colorScheme.surfaceContainer + : theme.colorScheme.surfaceBright, borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), child: InkWell( borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), diff --git a/lib/widgets/adaptive_dialogs/public_room_dialog.dart b/lib/widgets/adaptive_dialogs/public_room_dialog.dart index 97550756..bafa5864 100644 --- a/lib/widgets/adaptive_dialogs/public_room_dialog.dart +++ b/lib/widgets/adaptive_dialogs/public_room_dialog.dart @@ -185,6 +185,7 @@ class PublicRoomDialog extends StatelessWidget { style: theme.textTheme.bodyMedium ?.copyWith(fontSize: 10), ), + maxLines: 1, textAlign: TextAlign.center, ), ), diff --git a/lib/widgets/permission_slider_dialog.dart b/lib/widgets/permission_slider_dialog.dart index 1a0f2556..63cd0897 100644 --- a/lib/widgets/permission_slider_dialog.dart +++ b/lib/widgets/permission_slider_dialog.dart @@ -20,7 +20,7 @@ Future showPermissionChooser( child: Column( mainAxisSize: .min, crossAxisAlignment: .stretch, - spacing: 12.0, + spacing: 16.0, children: [ Text(L10n.of(context).setPowerLevelDescription), ValueListenableBuilder( diff --git a/lib/widgets/qr_code_viewer.dart b/lib/widgets/qr_code_viewer.dart index ac87d994..83c44e74 100644 --- a/lib/widgets/qr_code_viewer.dart +++ b/lib/widgets/qr_code_viewer.dart @@ -91,7 +91,11 @@ class QrCodeViewer extends StatelessWidget { margin: const EdgeInsets.all(32.0), padding: const EdgeInsets.all(32.0), decoration: BoxDecoration( - color: theme.colorScheme.primaryContainer, + border: Border.all( + color: theme.colorScheme.onPrimaryContainer, + width: 4, + ), + color: theme.colorScheme.surfaceBright, borderRadius: BorderRadius.circular(AppConfig.borderRadius), ), child: Column( From cd99f6a460632b68eb42c6e420ff04802547460e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 10 Mar 2026 09:38:13 +0100 Subject: [PATCH 242/333] chore: Remove converser from recommended homeservers as it doesn't have open registration --- recommended_homeservers.json | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/recommended_homeservers.json b/recommended_homeservers.json index ec2f3dc7..fe785234 100644 --- a/recommended_homeservers.json +++ b/recommended_homeservers.json @@ -10,16 +10,6 @@ "English" ] }, - { - "name": "converser.eu", - "website": "https://converser.eu", - "description": "A free and decentralized communication server.", - "reg_method": "oidc", - "languages": [ - "All", - "Français" - ] - }, { "name": "mozilla.org", "website": "https://mozilla.org", @@ -29,15 +19,6 @@ "All", "English" ] - }, - { - "name": "magdeburg.jetzt", - "website": "https://magdeburg.jetzt", - "reg_method": "oidc", - "languages": [ - "All", - "Deutsch" - ] } ] } \ No newline at end of file From 210ebdae6e19b0e40b68a823a50dda93e6919025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 10 Mar 2026 09:45:07 +0100 Subject: [PATCH 243/333] chore: Added deeplinks to test protocol --- .github/ISSUE_TEMPLATE/test_report.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/test_report.md b/.github/ISSUE_TEMPLATE/test_report.md index 9a7ed702..fb97739b 100644 --- a/.github/ISSUE_TEMPLATE/test_report.md +++ b/.github/ISSUE_TEMPLATE/test_report.md @@ -39,3 +39,6 @@ labels: test 10. Drag&Drop to send a file into a chat still works: - [ ] Web - [ ] Linux +11. Deeplinks are still working? https://matrix.to/#/@krille:janian.de + - [ ] Android + - [ ] iOS \ No newline at end of file From a7c89418ebc8513a5889a828ca468660c479ef2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 10 Mar 2026 10:04:08 +0100 Subject: [PATCH 244/333] chore: Implement pick SSO provider from dialog and add tchncs.de --- lib/utils/sign_in_flows/check_homeserver.dart | 2 +- lib/utils/sign_in_flows/sso_login.dart | 34 ++++++++++++++++++- recommended_homeservers.json | 11 ++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index 85f7a371..ed3e61c9 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -52,7 +52,7 @@ Future connectToHomeserverFlow( if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) { await oidcLoginFlow(client, context, signUp); } else if (supportsSso) { - await ssoLoginFlow(client, context, signUp); + await ssoLoginFlow(client, context, signUp, loginFlows); } else { if (signUp && regLink != null) { await launchUrlString(regLink); diff --git a/lib/utils/sign_in_flows/sso_login.dart b/lib/utils/sign_in_flows/sso_login.dart index 1721a2ea..7f7a924d 100644 --- a/lib/utils/sign_in_flows/sso_login.dart +++ b/lib/utils/sign_in_flows/sso_login.dart @@ -3,20 +3,52 @@ import 'package:flutter/material.dart'; import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; import 'package:matrix/matrix.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; Future ssoLoginFlow( Client client, BuildContext context, bool signUp, + List loginFlows, ) async { final (redirectUrl, urlScheme) = calcRedirectUrl(withAuthHtmlPath: true); Logs().i('Starting legacy SSO Flow with redirect URL', redirectUrl); + final ssoProviders = + (loginFlows + .firstWhere((flow) => flow.type == 'm.login.sso') + .additionalProperties['identity_providers'] + as List?) + ?.map( + (json) => ( + name: json['name'] as String, + id: json['id'] as String, + brand: json['brand'] as String?, + icon: json['icon'] as String?, + ), + ) + .toList(); + + final provider = ssoProviders == null + ? null + : await showModalActionPopup( + context: context, + title: L10n.of(context).logInTo(client.homeserver!.host), + actions: ssoProviders + .map( + (provider) => + AdaptiveModalAction(label: provider.name, value: provider), + ) + .toList(), + ); + final url = client.homeserver!.replace( - path: '/_matrix/client/v3/login/sso/redirect', + path: + '/_matrix/client/v3/login/sso/redirect${provider == null ? '' : '/${provider.id}'}', queryParameters: { 'redirectUrl': redirectUrl.toString(), 'action': signUp ? 'register' : 'login', diff --git a/recommended_homeservers.json b/recommended_homeservers.json index fe785234..fef60184 100644 --- a/recommended_homeservers.json +++ b/recommended_homeservers.json @@ -19,6 +19,17 @@ "All", "English" ] + }, + { + "name": "tchncs.de", + "website": "https://tchncs.de", + "description": "A general homeserver. Owner also hosts other FOSS services.", + "reg_method": "oidc", + "languages": [ + "All", + "English", + "Deutsch" + ] } ] } \ No newline at end of file From 14ce0a5927d57ca88d5bf923ca6d8d731022bb7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 10 Mar 2026 14:24:30 +0100 Subject: [PATCH 245/333] chore: Follow up sso on android --- android/app/src/main/AndroidManifest.xml | 2 +- lib/pages/sign_in/utils/sort_homeservers.dart | 24 ------------------- .../view_model/sign_in_view_model.dart | 3 --- 3 files changed, 1 insertion(+), 28 deletions(-) delete mode 100644 lib/pages/sign_in/utils/sort_homeservers.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 1b3f5182..fb7a1399 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -106,7 +106,7 @@ - + diff --git a/lib/pages/sign_in/utils/sort_homeservers.dart b/lib/pages/sign_in/utils/sort_homeservers.dart deleted file mode 100644 index 18f30dfc..00000000 --- a/lib/pages/sign_in/utils/sort_homeservers.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; - -int sortHomeservers(PublicHomeserverData a, PublicHomeserverData b) { - return _calcHomeserverScore(b).compareTo(_calcHomeserverScore(a)); -} - -int _calcHomeserverScore(PublicHomeserverData homeserver) { - var score = 0; - if (homeserver.description?.isNotEmpty == true) score++; - if (homeserver.website?.isNotEmpty == true) score++; - score += (homeserver.languages?.length ?? 0); - score += (homeserver.features?.length ?? 0); - score += (homeserver.onlineStatus ?? 0); - if (homeserver.ipv6 == true) score++; - if (homeserver.isp?.isNotEmpty == true) score++; - if (homeserver.privacy?.isNotEmpty == true) score++; - if (homeserver.rules?.isNotEmpty == true) score++; - if (homeserver.version?.isNotEmpty == true) score++; - if (homeserver.usingVanillaReg == true) score--; - if (homeserver.regLink != null) score--; - if (homeserver.regMethod != 'SSO') score--; - if (homeserver.regMethod == 'In-house Element') score--; - return score; -} diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart index 5760ce2e..411dcc50 100644 --- a/lib/pages/sign_in/view_model/sign_in_view_model.dart +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -7,7 +7,6 @@ import 'package:matrix/matrix_api_lite/utils/logs.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/pages/sign_in/utils/sort_homeservers.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/pages/sign_in/view_model/sign_in_state.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -74,8 +73,6 @@ class SignInViewModel extends ValueNotifier { }); } - publicHomeservers.sort(sortHomeservers); - final defaultServer = publicHomeservers.singleWhereOrNull( (server) => server.name == AppSettings.defaultHomeserver.value, ); From 5e368b9df09a33c6b6588df80b25d73b4874a5aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 10 Mar 2026 15:50:27 +0100 Subject: [PATCH 246/333] chore: Follow up sso on android --- android/app/src/main/AndroidManifest.xml | 2 +- lib/pages/intro/intro_page.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index fb7a1399..12d88e56 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -106,7 +106,7 @@ - + diff --git a/lib/pages/intro/intro_page.dart b/lib/pages/intro/intro_page.dart index 95950bbc..4d56fc1a 100644 --- a/lib/pages/intro/intro_page.dart +++ b/lib/pages/intro/intro_page.dart @@ -68,7 +68,7 @@ class IntroPage extends StatelessWidget { ), ), PopupMenuItem( - value: () => PlatformInfos.showDialog(context), + onTap: () => PlatformInfos.showDialog(context), child: Row( mainAxisSize: .min, children: [ From 2d9710d2b4d887084d74e7d86d0c690490ce3e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D=E0=AE=A8?= =?UTF-8?q?=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D?= Date: Sun, 8 Mar 2026 18:51:46 +0100 Subject: [PATCH 247/333] chore(translations): Translated using Weblate (Tamil) Currently translated at 100.0% (747 of 747 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ta/ --- lib/l10n/intl_ta.arb | 5746 ++++++++++++++++++++---------------------- 1 file changed, 2786 insertions(+), 2960 deletions(-) diff --git a/lib/l10n/intl_ta.arb b/lib/l10n/intl_ta.arb index 7c667352..4e2b6aa2 100644 --- a/lib/l10n/intl_ta.arb +++ b/lib/l10n/intl_ta.arb @@ -1,2962 +1,2788 @@ { - "@@last_modified": "2021-08-14 12:41:09.826673", - "acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது", - "@acceptedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "accept": "ஏற்றுக்கொள்", - "@accept": { - "type": "String", - "placeholders": {} - }, - "about": "பற்றி", - "@about": { - "type": "String", - "placeholders": {} - }, - "sendCanceled": "அனுப்பப்பட்டது ரத்து செய்யப்பட்டது", - "@sendCanceled": {}, - "chatDetails": "அரட்டை விவரங்கள்", - "@chatDetails": { - "type": "String", - "placeholders": {} - }, - "globalChatId": "உலகளாவிய அரட்டை ஐடி", - "@globalChatId": {}, - "accessAndVisibility": "அணுகல் மற்றும் தெரிவுநிலை", - "@accessAndVisibility": {}, - "onlineKeyBackupEnabled": "நிகழ்நிலை விசை காப்புப்பிரதி இயக்கப்பட்டது", - "@onlineKeyBackupEnabled": { - "type": "String", - "placeholders": {} - }, - "recoveryKey": "மீட்பு விசை", - "@recoveryKey": {}, - "setStatus": "நிலையை அமைக்கவும்", - "@setStatus": { - "type": "String", - "placeholders": {} - }, - "title": "பஞ்சுபோன்ற", - "@title": { - "description": "Title for the application", - "type": "String", - "placeholders": {} - }, - "verify": "சரிபார்க்கவும்", - "@verify": { - "type": "String", - "placeholders": {} - }, - "verifyStart": "சரிபார்ப்பைத் தொடங்கவும்", - "@verifyStart": { - "type": "String", - "placeholders": {} - }, - "unsupportedAndroidVersion": "ஆதரிக்கப்படாத ஆண்ட்ராய்டு பதிப்பு", - "@unsupportedAndroidVersion": {}, - "invitedBy": "{user} அழைத்தார்", - "@invitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "commandHint_sendraw": "மூல சாதொபொகு ஐ அனுப்புங்கள்", - "@commandHint_sendraw": {}, - "passwordIsWrong": "நீங்கள் உள்ளிட்ட கடவுச்சொல் தவறு", - "@passwordIsWrong": {}, - "completedKeyVerification": "{sender} நிறைவு செய்யப்பட்ட விசை சரிபார்ப்பு", - "@completedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "incomingMessages": "உள்வரும் செய்திகள்", - "@incomingMessages": {}, - "password": "கடவுச்சொல்", - "@password": { - "type": "String", - "placeholders": {} - }, - "emptyChat": "வெற்று அரட்டை", - "@emptyChat": { - "type": "String", - "placeholders": {} - }, - "encrypted": "குறியாக்கப்பட்டது", - "@encrypted": { - "type": "String", - "placeholders": {} - }, - "reject": "நிராகரிக்கவும்", - "@reject": { - "type": "String", - "placeholders": {} - }, - "importNow": "இப்போது இறக்குமதி செய்யுங்கள்", - "@importNow": {}, - "changedTheChatAvatar": "{username} அரட்டை அவதாரத்தை மாற்றியது", - "@changedTheChatAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "chooseAStrongPassword": "வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க", - "@chooseAStrongPassword": { - "type": "String", - "placeholders": {} - }, - "commandHint_me": "உங்களை விவரிக்கவும்", - "@commandHint_me": { - "type": "String", - "description": "Usage hint for the command /me" - }, - "commandHint_unban": "இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரைத் தடுக்கிறது", - "@commandHint_unban": { - "type": "String", - "description": "Usage hint for the command /unban" - }, - "countParticipants": "{count} பங்கேற்பாளர்கள்", - "@countParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "editDisplayname": "காட்சி பெயர் திருத்து", - "@editDisplayname": { - "type": "String", - "placeholders": {} - }, - "fileName": "கோப்பு பெயர்", - "@fileName": { - "type": "String", - "placeholders": {} - }, - "hasWithdrawnTheInvitationFor": "{targetName} க்கான அழைப்பை {username} திரும்பப் பெற்றுள்ளார்", - "@hasWithdrawnTheInvitationFor": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "removedBy": "{username} ஆல் அகற்றப்பட்டது", - "@removedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "requestPermission": "இசைவு கோருங்கள்", - "@requestPermission": { - "type": "String", - "placeholders": {} - }, - "user": "பயனர்", - "@user": {}, - "optionalRedactReason": "(விரும்பினால்) இந்த செய்தியை மாற்றியமைப்பதற்கான காரணம் ...", - "@optionalRedactReason": {}, - "device": "சாதனம்", - "@device": { - "type": "String", - "placeholders": {} - }, - "contactHasBeenInvitedToTheGroup": "குழுவிற்கு தொடர்பு அழைக்கப்பட்டுள்ளது", - "@contactHasBeenInvitedToTheGroup": { - "type": "String", - "placeholders": {} - }, - "passphraseOrKey": "கடவுச்சொல் அல்லது மீட்பு விசை", - "@passphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "select": "தேர்ந்தெடு", - "@select": {}, - "compareEmojiMatch": "தயவுசெய்து ஈமோசிகளை ஒப்பிடுக", - "@compareEmojiMatch": { - "type": "String", - "placeholders": {} - }, - "fromTheInvitation": "அழைப்பிலிருந்து", - "@fromTheInvitation": { - "type": "String", - "placeholders": {} - }, - "help": "உதவி", - "@help": { - "type": "String", - "placeholders": {} - }, - "invited": "அழைக்கப்பட்டார்", - "@invited": { - "type": "String", - "placeholders": {} - }, - "invitedUsersOnly": "பயனர்களை மட்டுமே அழைத்தது", - "@invitedUsersOnly": { - "type": "String", - "placeholders": {} - }, - "kickedAndBanned": "🙅 {username} உதைத்து {targetName} ஐத் தடை செய்தார்", - "@kickedAndBanned": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "mention": "குறிப்பு", - "@mention": { - "type": "String", - "placeholders": {} - }, - "newVerificationRequest": "புதிய சரிபார்ப்பு கோரிக்கை!", - "@newVerificationRequest": { - "type": "String", - "placeholders": {} - }, - "shareInviteLink": "இணைப்பைப் பகிரவும்", - "@shareInviteLink": {}, - "pickImage": "ஒரு படத்தைத் தேர்ந்தெடுக்கவும்", - "@pickImage": { - "type": "String", - "placeholders": {} - }, - "pin": "முள்", - "@pin": { - "type": "String", - "placeholders": {} - }, - "unavailable": "கிடைக்கவில்லை", - "@unavailable": { - "type": "String", - "placeholders": {} - }, - "voiceCall": "குரல் அழைப்பு", - "@voiceCall": {}, - "youKickedAndBanned": "🙅 நீங்கள் உதைத்து தடைசெய்துள்ளீர்கள் {user}", - "@youKickedAndBanned": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youKicked": "👞 {user}ஐ உதைத்துள்ளீர்கள்", - "@youKicked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "storeInAppleKeyChain": "ஆப்பிள் கீச்சினில் சேமிக்கவும்", - "@storeInAppleKeyChain": {}, - "searchForUsers": "@Users ஐத் தேடுங்கள் ...", - "@searchForUsers": {}, - "pleaseEnterYourCurrentPassword": "உங்கள் தற்போதைய கடவுச்சொல்லை உள்ளிடவும்", - "@pleaseEnterYourCurrentPassword": {}, - "anyoneCanJoin": "யார் வேண்டுமானாலும் சேரலாம்", - "@anyoneCanJoin": { - "type": "String", - "placeholders": {} - }, - "archive": "காப்பகம்", - "@archive": { - "type": "String", - "placeholders": {} - }, - "banFromChat": "அரட்டையிலிருந்து தடை", - "@banFromChat": { - "type": "String", - "placeholders": {} - }, - "cancel": "ரத்துசெய்", - "@cancel": { - "type": "String", - "placeholders": {} - }, - "edit": "தொகு", - "@edit": { - "type": "String", - "placeholders": {} - }, - "iHaveClickedOnLink": "நான் இணைப்பைக் சொடுக்கு செய்துள்ளேன்", - "@iHaveClickedOnLink": { - "type": "String", - "placeholders": {} - }, - "pleaseClickOnLink": "மின்னஞ்சலில் உள்ள இணைப்பைக் சொடுக்கு செய்து தொடரவும்.", - "@pleaseClickOnLink": { - "type": "String", - "placeholders": {} - }, - "changeTheme": "உங்கள் பாணியை மாற்றவும்", - "@changeTheme": { - "type": "String", - "placeholders": {} - }, - "fontSize": "எழுத்துரு அளவு", - "@fontSize": { - "type": "String", - "placeholders": {} - }, - "cantOpenUri": "யூரி {uri} வேலை ஐ திறக்க முடியாது", - "@cantOpenUri": { - "type": "String", - "placeholders": { - "uri": { - "type": "String" - } - } - }, - "repeatPassword": "கடவுச்சொல்லை மீண்டும் செய்யவும்", - "@repeatPassword": {}, - "youRejectedTheInvitation": "நீங்கள் அழைப்பை நிராகரித்தீர்கள்", - "@youRejectedTheInvitation": {}, - "confirmMatrixId": "உங்கள் கணக்கை நீக்க உங்கள் மேட்ரிக்ச் ஐடியை உறுதிப்படுத்தவும்.", - "@confirmMatrixId": {}, - "supposedMxid": "இது {mxid} be ஆக இருக்க வேண்டும்", - "@supposedMxid": { - "type": "String", - "placeholders": { - "mxid": { - "type": "String" - } - } - }, - "commandHint_googly": "சில கூகிள் கண்களை அனுப்பவும்", - "@commandHint_googly": {}, - "commandHint_cuddle": "ஒரு கசப்பு அனுப்பவும்", - "@commandHint_cuddle": {}, - "importEmojis": "ஈமோசிகளை இறக்குமதி செய்யுங்கள்", - "@importEmojis": {}, - "exportEmotePack": "எமோட் பேக் .zip என ஏற்றுமதி செய்யுங்கள்", - "@exportEmotePack": {}, - "replace": "மாற்றவும்", - "@replace": {}, - "tryAgain": "மீண்டும் முயற்சிக்கவும்", - "@tryAgain": {}, - "pushNotificationsNotAvailable": "புச் அறிவிப்புகள் கிடைக்கவில்லை", - "@pushNotificationsNotAvailable": {}, - "blockUsername": "பயனர்பெயரை புறக்கணிக்கவும்", - "@blockUsername": {}, - "start": "தொடங்கு", - "@start": {}, - "chatBackup": "அரட்டை காப்புப்பிரதி", - "@chatBackup": { - "type": "String", - "placeholders": {} - }, - "send": "அனுப்பு", - "@send": { - "type": "String", - "placeholders": {} - }, - "theyDontMatch": "அவர்கள் பொருந்தவில்லை", - "@theyDontMatch": { - "type": "String", - "placeholders": {} - }, - "sendMessages": "செய்திகளை அனுப்பவும்", - "@sendMessages": { - "type": "String", - "placeholders": {} - }, - "fluffychat": "பஞ்சுபோன்ற", - "@fluffychat": { - "type": "String", - "placeholders": {} - }, - "downloadFile": "கோப்பைப் பதிவிறக்கவும்", - "@downloadFile": { - "type": "String", - "placeholders": {} - }, - "createNewSpace": "புதிய இடம்", - "@createNewSpace": { - "type": "String", - "placeholders": {} - }, - "synchronizingPleaseWait": "ஒத்திசைத்தல்… தயவுசெய்து காத்திருங்கள்.", - "@synchronizingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "unknownEncryptionAlgorithm": "அறியப்படாத குறியாக்க வழிமுறை", - "@unknownEncryptionAlgorithm": { - "type": "String", - "placeholders": {} - }, - "unverified": "சரிபார்க்கப்படாதது", - "@unverified": {}, - "unmuteChat": "மாறுதல் அரட்டை", - "@unmuteChat": { - "type": "String", - "placeholders": {} - }, - "verifyTitle": "பிற கணக்கை சரிபார்க்கிறது", - "@verifyTitle": { - "type": "String", - "placeholders": {} - }, - "videoCall": "வீடியோ அழைப்பு", - "@videoCall": { - "type": "String", - "placeholders": {} - }, - "visibleForAllParticipants": "பங்கேற்பாளர்கள் அனைவருக்கும் தெரியும்", - "@visibleForAllParticipants": { - "type": "String", - "placeholders": {} - }, - "voiceMessage": "குரல் செய்தி", - "@voiceMessage": { - "type": "String", - "placeholders": {} - }, - "reopenChat": "அரட்டையை மீண்டும் திறக்கவும்", - "@reopenChat": {}, - "formattedMessages": "வடிவமைக்கப்பட்ட செய்திகள்", - "@formattedMessages": {}, - "darkTheme": "இருண்ட", - "@darkTheme": { - "type": "String", - "placeholders": {} - }, - "guestsAreForbidden": "விருந்தினர்கள் தடைசெய்யப்பட்டுள்ளனர்", - "@guestsAreForbidden": { - "type": "String", - "placeholders": {} - }, - "guestsCanJoin": "விருந்தினர்கள் சேரலாம்", - "@guestsCanJoin": { - "type": "String", - "placeholders": {} - }, - "commandHint_invite": "கொடுக்கப்பட்ட பயனரை இந்த அறைக்கு அழைக்கவும்", - "@commandHint_invite": { - "type": "String", - "description": "Usage hint for the command /invite" - }, - "commandHint_op": "கொடுக்கப்பட்ட பயனரின் ஆற்றல் மட்டத்தை அமைக்கவும் (இயல்புநிலை: 50)", - "@commandHint_op": { - "type": "String", - "description": "Usage hint for the command /op" - }, - "commandHint_plain": "வடிவமைக்கப்படாத உரையை அனுப்பவும்", - "@commandHint_plain": { - "type": "String", - "description": "Usage hint for the command /plain" - }, - "commandMissing": "{command} என்பது கட்டளை அல்ல.", - "@commandMissing": { - "type": "String", - "placeholders": { - "command": { - "type": "String" - } + "@@last_modified": "2021-08-14 12:41:09.826673", + "acceptedTheInvitation": "👍 {username} அழைப்பை ஏற்றுக்கொண்டது", + "@acceptedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } }, - "description": "State that {command} is not a valid /command." - }, - "moderator": "மதிப்பீட்டாளர்", - "@moderator": { - "type": "String", - "placeholders": {} - }, - "shareLocation": "இருப்பிடத்தைப் பகிரவும்", - "@shareLocation": { - "type": "String", - "placeholders": {} - }, - "addEmail": "மின்னஞ்சல் சேர்க்கவும்", - "@addEmail": { - "type": "String", - "placeholders": {} - }, - "all": "அனைத்தும்", - "@all": { - "type": "String", - "placeholders": {} - }, - "lightTheme": "ஒளி", - "@lightTheme": { - "type": "String", - "placeholders": {} - }, - "allChats": "அனைத்து அரட்டைகளும்", - "@allChats": { - "type": "String", - "placeholders": {} - }, - "sendOnEnter": "Enter ஐ அனுப்பவும்", - "@sendOnEnter": {}, - "dehydrate": "ஏற்றுமதி அமர்வு மற்றும் சாதனத்தை துடைக்கவும்", - "@dehydrate": {}, - "ok": "சரி", - "@ok": { - "type": "String", - "placeholders": {} - }, - "configureChat": "அரட்டையை உள்ளமைக்கவும்", - "@configureChat": { - "type": "String", - "placeholders": {} - }, - "deviceId": "சாதன ஐடி", - "@deviceId": { - "type": "String", - "placeholders": {} - }, - "isTyping": "தட்டச்சு செய்கிறது…", - "@isTyping": { - "type": "String", - "placeholders": {} - }, - "joinedTheChat": "👋 {username} அரட்டையில் சேர்ந்தார்", - "@joinedTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "noConnectionToTheServer": "சேவையகத்துடன் எந்த தொடர்பும் இல்லை", - "@noConnectionToTheServer": { - "type": "String", - "placeholders": {} - }, - "noEmotesFound": "உணர்ச்சிகள் எதுவும் காணப்படவில்லை. 😕", - "@noEmotesFound": { - "type": "String", - "placeholders": {} - }, - "notifications": "அறிவிப்புகள்", - "@notifications": { - "type": "String", - "placeholders": {} - }, - "oopsPushError": "அச்சச்சோ! துரதிர்ச்டவசமாக, புச் அறிவிப்புகளை அமைக்கும் போது பிழை ஏற்பட்டது.", - "@oopsPushError": { - "type": "String", - "placeholders": {} - }, - "oopsSomethingWentWrong": "அச்சச்சோ, ஏதோ தவறு நடந்தது…", - "@oopsSomethingWentWrong": { - "type": "String", - "placeholders": {} - }, - "bundleName": "மூட்டை பெயர்", - "@bundleName": {}, - "enableMultiAccounts": "(பீட்டா) இந்த சாதனத்தில் பல கணக்குகளை இயக்கவும்", - "@enableMultiAccounts": {}, - "remove": "அகற்று", - "@remove": { - "type": "String", - "placeholders": {} - }, - "recoveryKeyLost": "மீட்பு விசை இழந்ததா?", - "@recoveryKeyLost": {}, - "sendAMessage": "ஒரு செய்தியை அனுப்பவும்", - "@sendAMessage": { - "type": "String", - "placeholders": {} - }, - "spaceIsPublic": "இடம் பொது", - "@spaceIsPublic": { - "type": "String", - "placeholders": {} - }, - "transferFromAnotherDevice": "மற்றொரு சாதனத்திலிருந்து மாற்றவும்", - "@transferFromAnotherDevice": { - "type": "String", - "placeholders": {} - }, - "visibleForEveryone": "அனைவருக்கும் தெரியும்", - "@visibleForEveryone": { - "type": "String", - "placeholders": {} - }, - "weSentYouAnEmail": "நாங்கள் உங்களுக்கு ஒரு மின்னஞ்சல் அனுப்பினோம்", - "@weSentYouAnEmail": { - "type": "String", - "placeholders": {} - }, - "report": "அறிக்கை", - "@report": {}, - "verifyOtherDevice": "Sevice பிற சாதனத்தை சரிபார்க்கவும்", - "@verifyOtherDevice": {}, - "startedACall": "{senderName} அழைப்பைத் தொடங்கினார்", - "@startedACall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "userSentUnknownEvent": "{username} ஒரு {type} நிகழ்வை அனுப்பியது", - "@userSentUnknownEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "type": { - "type": "String" - } - } - }, - "verified": "சரிபார்க்கப்பட்டது", - "@verified": { - "type": "String", - "placeholders": {} - }, - "verifySuccess": "நீங்கள் வெற்றிகரமாக சரிபார்த்தீர்கள்!", - "@verifySuccess": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerNumbers": "பங்குதாரர் எண்களை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", - "@waitingPartnerNumbers": { - "type": "String", - "placeholders": {} - }, - "warning": "எச்சரிக்கை!", - "@warning": { - "type": "String", - "placeholders": {} - }, - "pinMessage": "அறைக்கு முள்", - "@pinMessage": {}, - "unlockOldMessages": "பழைய செய்திகளைத் திறக்கவும்", - "@unlockOldMessages": {}, - "serverLimitReached": "சேவையக வரம்பு அடைந்தது! {seconds} விநாடிகள் காத்திருக்கிறது ...", - "@serverLimitReached": { - "type": "integer", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "acceptedKeyVerification": "{sender} ஏற்றுக்கொள்ளப்பட்ட விசை சரிபார்ப்பு", - "@acceptedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "copyToClipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கவும்", - "@copyToClipboard": { - "type": "String", - "placeholders": {} - }, - "createGroup": "குழுவை உருவாக்கவும்", - "@createGroup": {}, - "editBundlesForAccount": "இந்த கணக்கிற்கான மூட்டைகளைத் திருத்தவும்", - "@editBundlesForAccount": {}, - "unpin": "மூள்நீக்கு", - "@unpin": { - "type": "String", - "placeholders": {} - }, - "emojis": "ஈமோசிகள்", - "@emojis": {}, - "jumpToLastReadMessage": "கடைசி வாசிப்பு செய்திக்கு செல்லவும்", - "@jumpToLastReadMessage": {}, - "commandHint_markasgroup": "குழுவாக குறி", - "@commandHint_markasgroup": {}, - "commandHint_html": "உஉகுமொ வடிவமைக்கப்பட்ட உரையை அனுப்பவும்", - "@commandHint_html": { - "type": "String", - "description": "Usage hint for the command /html" - }, - "commandHint_kick": "இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரை அகற்றவும்", - "@commandHint_kick": { - "type": "String", - "description": "Usage hint for the command /kick" - }, - "deleteMessage": "செய்தியை நீக்கு", - "@deleteMessage": { - "type": "String", - "placeholders": {} - }, - "messageInfo": "செய்தி தகவல்", - "@messageInfo": {}, - "sentAFile": "📁 {username} கோப்பை அனுப்பியுள்ளார்", - "@sentAFile": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "readUpToHere": "இங்கே படிக்கவும்", - "@readUpToHere": {}, - "chatDescriptionHasBeenChanged": "அரட்டை விளக்கம் மாற்றப்பட்டது", - "@chatDescriptionHasBeenChanged": {}, - "reportMessage": "செய்தி அறிக்கை", - "@reportMessage": { - "type": "String", - "placeholders": {} - }, - "kickFromChat": "அரட்டையிலிருந்து கிக்", - "@kickFromChat": { - "type": "String", - "placeholders": {} - }, - "redactedAnEvent": "{username} ஒரு நிகழ்வை மறுவடிவமைத்தது", - "@redactedAnEvent": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "opacity": "ஒளிபுகாநிலை:", - "@opacity": {}, - "blur": "மங்கலானது:", - "@blur": {}, - "setWallpaper": "வால்பேப்பரை அமைக்கவும்", - "@setWallpaper": {}, - "statusExampleMessage": "இன்று நீங்கள் எப்படி இருக்கிறீர்கள்?", - "@statusExampleMessage": { - "type": "String", - "placeholders": {} - }, - "tooManyRequestsWarning": "பல கோரிக்கைகள். தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும்!", - "@tooManyRequestsWarning": { - "type": "String", - "placeholders": {} - }, - "unblockDevice": "சாதனத்தைத் தடைசெய்க", - "@unblockDevice": { - "type": "String", - "placeholders": {} - }, - "unknownDevice": "தெரியாத சாதனம்", - "@unknownDevice": { - "type": "String", - "placeholders": {} - }, - "storeSecurlyOnThisDevice": "இந்த சாதனத்தில் பாதுகாப்பாக சேமிக்கவும்", - "@storeSecurlyOnThisDevice": {}, - "screenSharingTitle": "திரை பகிர்வு", - "@screenSharingTitle": {}, - "newGroup": "புதிய குழு", - "@newGroup": {}, - "noOtherDevicesFound": "வேறு சாதனங்கள் எதுவும் கிடைக்கவில்லை", - "@noOtherDevicesFound": {}, - "sendRoomNotifications": "ஒரு @ROOM அறிவிப்புகளை அனுப்பவும்", - "@sendRoomNotifications": {}, - "generatingVideoThumbnail": "வீடியோ சிறு உருவத்தை உருவாக்குதல் ...", - "@generatingVideoThumbnail": {}, - "reply": "பதில்", - "@reply": { - "type": "String", - "placeholders": {} - }, - "askSSSSSign": "மற்ற நபரில் கையெழுத்திட, தயவுசெய்து உங்கள் பாதுகாப்பான கடை பாச்ஃபிரேச் அல்லது மீட்பு விசையை உள்ளிடவும்.", - "@askSSSSSign": { - "type": "String", - "placeholders": {} - }, - "areGuestsAllowedToJoin": "விருந்தினர் பயனர்கள் சேர அனுமதிக்கப்படுகிறார்களா", - "@areGuestsAllowedToJoin": { - "type": "String", - "placeholders": {} - }, - "areYouSureYouWantToLogout": "நீங்கள் நிச்சயமாக வெளியேற விரும்புகிறீர்களா?", - "@areYouSureYouWantToLogout": { - "type": "String", - "placeholders": {} - }, - "aboutHomeserver": "{homeserver} பற்றி", - "@aboutHomeserver": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "swipeRightToLeftToReply": "பதிலளிக்க வலமிருந்து இடமாக ச்வைப் செய்யவும்", - "@swipeRightToLeftToReply": {}, - "unread": "படிக்காதது", - "@unread": {}, - "changedTheChatDescriptionTo": "{username} பயனர்பெயர் the அரட்டை விளக்கத்தை மாற்றியது: '{description}'", - "@changedTheChatDescriptionTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "description": { - "type": "String" - } - } - }, - "dateAndTimeOfDay": "{date}, {timeOfDay}", - "@dateAndTimeOfDay": { - "type": "String", - "placeholders": { - "date": { - "type": "String" - }, - "timeOfDay": { - "type": "String" - } - } - }, - "deleteAccount": "கணக்கை நீக்கு", - "@deleteAccount": { - "type": "String", - "placeholders": {} - }, - "deviceKeys": "சாதன விசைகள்:", - "@deviceKeys": {}, - "noUsersFoundWithQuery": "துரதிர்ச்டவசமாக \"{query}\" உடன் எந்த பயனரையும் காண முடியவில்லை. நீங்கள் ஒரு எழுத்துப்பிழை செய்தீர்களா என்பதை சரிபார்க்கவும்.", - "@noUsersFoundWithQuery": { - "type": "String", - "placeholders": { - "query": { - "type": "String" - } - } - }, - "jump": "தாவு", - "@jump": {}, - "yourGlobalUserIdIs": "உங்கள் உலகளாவிய பயனர் ஐடி: ", - "@yourGlobalUserIdIs": {}, - "publicSpaces": "பொது இடங்கள்", - "@publicSpaces": {}, - "discover": "கண்டுபிடி", - "@discover": {}, - "commandHint_unignore": "கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை இணைக்கவும்", - "@commandHint_unignore": {}, - "prepareSendingAttachment": "அனுப்பும் இணைப்பைத் தயாரிக்கவும் ...", - "@prepareSendingAttachment": {}, - "sendingAttachment": "இணைப்பை அனுப்புகிறது ...", - "@sendingAttachment": {}, - "continueText": "தொடரவும்", - "@continueText": {}, - "welcomeText": "ஏய் ஏய் 👋 இது பஞ்சுபோன்றது. Https://matrix.org உடன் இணக்கமான எந்த ஓம்சர்வரில் நீங்கள் உள்நுழையலாம். பின்னர் யாருடனும் அரட்டையடிக்கவும். இது ஒரு பெரிய பரவலாக்கப்பட்ட செய்தியிடல் நெட்வொர்க்!", - "@welcomeText": {}, - "name": "பெயர்", - "@name": {}, - "username": "பயனர்பெயர்", - "@username": { - "type": "String", - "placeholders": {} - }, - "whoCanPerformWhichAction": "எந்த செயலைச் செய்ய முடியும்", - "@whoCanPerformWhichAction": { - "type": "String", - "placeholders": {} - }, - "whoIsAllowedToJoinThisGroup": "இந்த குழுவில் சேர யார் அனுமதிக்கப்படுகிறார்கள்", - "@whoIsAllowedToJoinThisGroup": { - "type": "String", - "placeholders": {} - }, - "youAreNoLongerParticipatingInThisChat": "இந்த அரட்டையில் நீங்கள் இனி பங்கேற்கவில்லை", - "@youAreNoLongerParticipatingInThisChat": { - "type": "String", - "placeholders": {} - }, - "yourPublicKey": "உங்கள் பொது விசை", - "@yourPublicKey": { - "type": "String", - "placeholders": {} - }, - "time": "நேரம்", - "@time": {}, - "openChat": "திறந்த அரட்டை", - "@openChat": {}, - "markAsRead": "படித்தபடி குறி", - "@markAsRead": {}, - "reportUser": "பயனர் புகாரளிக்கவும்", - "@reportUser": {}, - "dismiss": "தள்ளுபடி", - "@dismiss": {}, - "reactedWith": "{sender} {reaction} உடன் பதிலளித்தார்", - "@reactedWith": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - }, - "reaction": { - "type": "String" - } - } - }, - "placeCall": "அழைப்பு இடு", - "@placeCall": {}, - "videoCallsBetaWarning": "வீடியோ அழைப்புகள் தற்போது பீட்டாவில் உள்ளன என்பதை நினைவில் கொள்க. அவர்கள் எதிர்பார்த்தபடி வேலை செய்யக்கூடாது அல்லது எல்லா தளங்களிலும் வேலை செய்யக்கூடாது.", - "@videoCallsBetaWarning": {}, - "experimentalVideoCalls": "சோதனை வீடியோ அழைப்புகள்", - "@experimentalVideoCalls": {}, - "noOneCanJoin": "யாரும் சேர முடியாது", - "@noOneCanJoin": {}, - "newSpace": "புதிய இடம்", - "@newSpace": {}, - "wasDirectChatDisplayName": "வெற்று அரட்டை ({oldDisplayName})", - "@wasDirectChatDisplayName": { - "type": "String", - "placeholders": { - "oldDisplayName": { - "type": "String" - } - } - }, - "openLinkInBrowser": "உலாவியில் திறந்த இணைப்பை திறக்கவும்", - "@openLinkInBrowser": {}, - "reportErrorDescription": "😭 ஓ இல்லை. ஏதோ தவறு நடந்தது. நீங்கள் விரும்பினால், இந்த பிழையை டெவலப்பர்களிடம் புகாரளிக்கலாம்.", - "@reportErrorDescription": {}, - "invite": "அழைக்கவும்", - "@invite": {}, - "wrongPinEntered": "தவறான முள் நுழைந்தது! {seconds} விநாடிகளில் மீண்டும் முயற்சிக்கவும் ...", - "@wrongPinEntered": { - "type": "String", - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "pleaseEnterANumber": "தயவுசெய்து 0 ஐ விட அதிகமான எண்ணை உள்ளிடவும்", - "@pleaseEnterANumber": {}, - "kickUserDescription": "பயனர் அரட்டையிலிருந்து வெளியேற்றப்படுகிறார், ஆனால் தடை செய்யப்படவில்லை. பொது அரட்டைகளில், பயனர் எந்த நேரத்திலும் மீண்டும் சேரலாம்.", - "@kickUserDescription": {}, - "learnMore": "மேலும் அறிக", - "@learnMore": {}, - "chatCanBeDiscoveredViaSearchOnServer": "{server}", - "@chatCanBeDiscoveredViaSearchOnServer": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "knockRestricted": "நாக் தடை", - "@knockRestricted": {}, - "bannedUser": "{username} தடைசெய்யப்பட்ட {targetName}", - "@bannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "blockDevice": "தொகுதி சாதனம்", - "@blockDevice": { - "type": "String", - "placeholders": {} - }, - "blocked": "தடுக்கப்பட்டது", - "@blocked": { - "type": "String", - "placeholders": {} - }, - "changeDeviceName": "சாதனத்தின் பெயரை மாற்றவும்", - "@changeDeviceName": { - "type": "String", - "placeholders": {} - }, - "changedTheDisplaynameTo": "{username} அவற்றின் காட்சி பெயர்: '{displayname}'", - "@changedTheDisplaynameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "displayname": { - "type": "String" - } - } - }, - "changedTheGuestAccessRules": "{username} விருந்தினர் அணுகல் விதிகளை மாற்றியது", - "@changedTheGuestAccessRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheProfileAvatar": "{username} அவர்களின் அவதாரத்தை மாற்றியது", - "@changedTheProfileAvatar": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheRoomAliases": "{username} அறை மாற்றுப்பெயர்களை மாற்றியது", - "@changedTheRoomAliases": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changeTheNameOfTheGroup": "குழுவின் பெயரை மாற்றவும்", - "@changeTheNameOfTheGroup": { - "type": "String", - "placeholders": {} - }, - "chats": "அரட்டைகள்", - "@chats": { - "type": "String", - "placeholders": {} - }, - "clearArchive": "தெளிவான காப்பகம்", - "@clearArchive": {}, - "close": "மூடு", - "@close": { - "type": "String", - "placeholders": {} - }, - "commandHint_create": "வெற்று குழு அரட்டையை உருவாக்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்", - "@commandHint_create": { - "type": "String", - "description": "Usage hint for the command /create" - }, - "compareNumbersMatch": "எண்களை ஒப்பிடுக", - "@compareNumbersMatch": { - "type": "String", - "placeholders": {} - }, - "copiedToClipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்டது", - "@copiedToClipboard": { - "type": "String", - "placeholders": {} - }, - "copy": "நகலெடு", - "@copy": { - "type": "String", - "placeholders": {} - }, - "couldNotDecryptMessage": "செய்தியை மறைகுறியாக்க முடியவில்லை: {error}", - "@couldNotDecryptMessage": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "create": "உருவாக்கு", - "@create": { - "type": "String", - "placeholders": {} - }, - "chatPermissions": "அரட்டை அனுமதிகள்", - "@chatPermissions": {}, - "editRoomAliases": "அறை மாற்றுப்பெயர்களைத் திருத்து", - "@editRoomAliases": { - "type": "String", - "placeholders": {} - }, - "editRoomAvatar": "அறை அவதார் திருத்து", - "@editRoomAvatar": { - "type": "String", - "placeholders": {} - }, - "forward": "முன்னோக்கி", - "@forward": { - "type": "String", - "placeholders": {} - }, - "fromJoining": "சேருவதிலிருந்து", - "@fromJoining": { - "type": "String", - "placeholders": {} - }, - "groupWith": "{displayname} உடன் குழு", - "@groupWith": { - "type": "String", - "placeholders": { - "displayname": { - "type": "String" - } - } - }, - "hideRedactedMessages": "சரிசெய்யப்பட்ட செய்திகளை மறைக்கவும்", - "@hideRedactedMessages": {}, - "hideRedactedMessagesBody": "யாராவது ஒரு செய்தியை மாற்றியமைத்தால், இந்த செய்தி இனி அரட்டையில் காணப்படாது.", - "@hideRedactedMessagesBody": {}, - "howOffensiveIsThisContent": "இந்த உள்ளடக்கம் எவ்வளவு ஆபத்தானது?", - "@howOffensiveIsThisContent": { - "type": "String", - "placeholders": {} - }, - "inoffensive": "செயலற்றது", - "@inoffensive": { - "type": "String", - "placeholders": {} - }, - "inviteContact": "தொடர்பை அழைக்கவும்", - "@inviteContact": { - "type": "String", - "placeholders": {} - }, - "kicked": "👞 {username} {targetName} ஐ உதைத்தார்", - "@kicked": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "lastActiveAgo": "கடைசியாக செயலில்: {localizedTimeShort}", - "@lastActiveAgo": { - "type": "String", - "placeholders": { - "localizedTimeShort": { - "type": "String" - } - } - }, - "leftTheChat": "அரட்டையை விட்டு வெளியேறினார்", - "@leftTheChat": { - "type": "String", - "placeholders": {} - }, - "loadCountMoreParticipants": "ஏற்றவும் {count} மேலும் பங்கேற்பாளர்கள்", - "@loadCountMoreParticipants": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dehydrateWarning": "இந்த செயலை செயல்தவிர்க்க முடியாது. காப்புப்பிரதி கோப்பை பாதுகாப்பாக சேமித்து வைக்கவும்.", - "@dehydrateWarning": {}, - "loadMore": "மேலும் ஏற்றவும்…", - "@loadMore": { - "type": "String", - "placeholders": {} - }, - "logout": "வெளியேற்றம்", - "@logout": { - "type": "String", - "placeholders": {} - }, - "messagesStyle": "செய்திகள்:", - "@messagesStyle": {}, - "needPantalaimonWarning": "இப்போதைக்கு இறுதி முதல் இறுதி குறியாக்கத்தைப் பயன்படுத்த உங்களுக்கு பாண்டலாயமன் தேவை என்பதை நினைவில் கொள்க.", - "@needPantalaimonWarning": { - "type": "String", - "placeholders": {} - }, - "newMessageInFluffyChat": "Fuf பஞ்சுபோன்ற புதிய செய்தி", - "@newMessageInFluffyChat": { - "type": "String", - "placeholders": {} - }, - "noEncryptionForPublicRooms": "அறை இனி பகிரங்கமாக அணுக முடியாதவுடன் மட்டுமே நீங்கள் குறியாக்கத்தை செயல்படுத்த முடியும்.", - "@noEncryptionForPublicRooms": { - "type": "String", - "placeholders": {} - }, - "noMatrixServer": "{server1} என்பது மேட்ரிக்ஸ் சர்வர் இல்லை, அதற்கு பதிலாக {server2} ஐ பயன்படுத்தவா?", - "@noMatrixServer": { - "type": "String", - "placeholders": { - "server1": { - "type": "String" - }, - "server2": { - "type": "String" - } - } - }, - "noPermission": "இசைவு இல்லை", - "@noPermission": { - "type": "String", - "placeholders": {} - }, - "noRoomsFound": "அறைகள் எதுவும் கிடைக்கவில்லை…", - "@noRoomsFound": { - "type": "String", - "placeholders": {} - }, - "numUsersTyping": "{count} பயனர்கள் தட்டச்சு செய்கிறார்கள்…", - "@numUsersTyping": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "offensive": "தாக்குதல்", - "@offensive": { - "type": "String", - "placeholders": {} - }, - "openCamera": "திறந்த கேமரா", - "@openCamera": { - "type": "String", - "placeholders": {} - }, - "addAccount": "கணக்கைச் சேர்க்கவும்", - "@addAccount": {}, - "openInMaps": "வரைபடங்களில் திறந்திருக்கும்", - "@openInMaps": { - "type": "String", - "placeholders": {} - }, - "link": "இணைப்பு", - "@link": {}, - "serverRequiresEmail": "இந்த சேவையகம் பதிவுக்கு உங்கள் மின்னஞ்சல் முகவரியை சரிபார்க்க வேண்டும்.", - "@serverRequiresEmail": {}, - "passwordForgotten": "கடவுச்சொல் மறந்துவிட்டது", - "@passwordForgotten": { - "type": "String", - "placeholders": {} - }, - "passwordHasBeenChanged": "கடவுச்சொல் மாற்றப்பட்டுள்ளது", - "@passwordHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "pleaseChooseAPasscode": "பாச் குறியீட்டைத் தேர்வுசெய்க", - "@pleaseChooseAPasscode": { - "type": "String", - "placeholders": {} - }, - "publicRooms": "பொது அறைகள்", - "@publicRooms": { - "type": "String", - "placeholders": {} - }, - "removeAllOtherDevices": "மற்ற எல்லா சாதனங்களையும் அகற்றவும்", - "@removeAllOtherDevices": { - "type": "String", - "placeholders": {} - }, - "roomHasBeenUpgraded": "அறை மேம்படுத்தப்பட்டுள்ளது", - "@roomHasBeenUpgraded": { - "type": "String", - "placeholders": {} - }, - "roomVersion": "அறை பதிப்பு", - "@roomVersion": { - "type": "String", - "placeholders": {} - }, - "saveFile": "கோப்பை சேமி", - "@saveFile": { - "type": "String", - "placeholders": {} - }, - "sentAnAudio": "🎤 {username} ஆடியோவை அனுப்பியுள்ளார்", - "@sentAnAudio": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAPicture": "🖼️ {username} படத்தை அனுப்பியுள்ளார்", - "@sentAPicture": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentAVideo": "🎥 {username} ஒரு வீடியோவை அனுப்பியுள்ளார்", - "@sentAVideo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "settings": "அமைப்புகள்", - "@settings": { - "type": "String", - "placeholders": {} - }, - "sharedTheLocation": "{username} அவற்றின் இருப்பிடத்தைப் பகிர்ந்து கொண்டது", - "@sharedTheLocation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "showPassword": "கடவுச்சொல்லைக் காட்டு", - "@showPassword": { - "type": "String", - "placeholders": {} - }, - "submit": "சமர்ப்பிக்கவும்", - "@submit": { - "type": "String", - "placeholders": {} - }, - "tryToSendAgain": "மீண்டும் அனுப்ப முயற்சிக்கவும்", - "@tryToSendAgain": { - "type": "String", - "placeholders": {} - }, - "sendTypingNotifications": "தட்டச்சு அறிவிப்புகளை அனுப்பவும்", - "@sendTypingNotifications": {}, - "enterAnEmailAddress": "மின்னஞ்சல் முகவரியை உள்ளிடவும்", - "@enterAnEmailAddress": { - "type": "String", - "placeholders": {} - }, - "blockListDescription": "உங்களை தொந்தரவு செய்யும் பயனர்களைத் தடுக்கலாம். உங்கள் தனிப்பட்ட தொகுதி பட்டியலில் பயனர்களிடமிருந்து எந்த செய்திகளையும் அல்லது அறை அழைப்புகளையும் நீங்கள் பெற முடியாது.", - "@blockListDescription": {}, - "incorrectPassphraseOrKey": "தவறான கடவுச்சொல் அல்லது மீட்பு விசை", - "@incorrectPassphraseOrKey": { - "type": "String", - "placeholders": {} - }, - "loadingPleaseWait": "ஏற்றுகிறது… தயவுசெய்து காத்திருங்கள்.", - "@loadingPleaseWait": { - "type": "String", - "placeholders": {} - }, - "no": "இல்லை", - "@no": { - "type": "String", - "placeholders": {} - }, - "youHaveBeenBannedFromThisChat": "இந்த அரட்டையிலிருந்து உங்களுக்கு தடை விதிக்கப்பட்டுள்ளது", - "@youHaveBeenBannedFromThisChat": { - "type": "String", - "placeholders": {} - }, - "messageType": "செய்தி வகை", - "@messageType": {}, - "databaseMigrationTitle": "தரவுத்தளம் உகந்ததாக உள்ளது", - "@databaseMigrationTitle": {}, - "usersMustKnock": "பயனர்கள் தட்ட வேண்டும்", - "@usersMustKnock": {}, - "allSpaces": "அனைத்து இடங்களும்", - "@allSpaces": {}, - "importFromZipFile": ".Zip கோப்பிலிருந்து இறக்குமதி செய்யுங்கள்", - "@importFromZipFile": {}, - "activatedEndToEndEncryption": "{username} இறுதி குறியாக்கத்திற்கு செயல்படுத்தப்பட்ட முடிவு", - "@activatedEndToEndEncryption": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "addToSpace": "விண்வெளியில் சேர்க்கவும்", - "@addToSpace": {}, - "commandHint_hug": "கட்டிப்பிடிக்கவும்", - "@commandHint_hug": {}, - "cuddleContent": "{senderName} பெயர் you உங்களை கசக்குகிறது", - "@cuddleContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "hugContent": "{senderName} உங்களை அணைத்துக்கொள்கிறது", - "@hugContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "appLock": "பயன்பாட்டு பூட்டு", - "@appLock": { - "type": "String", - "placeholders": {} - }, - "appLockDescription": "முள் குறியீட்டைக் கொண்டு பயன்படுத்தாதபோது பயன்பாட்டைப் பூட்டவும்", - "@appLockDescription": {}, - "googlyEyesContent": "{senderName} உங்களுக்கு கூகிள் கண்களை அனுப்புகிறது", - "@googlyEyesContent": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "areYouSure": "நீங்கள் உறுதியாக இருக்கிறீர்களா?", - "@areYouSure": { - "type": "String", - "placeholders": {} - }, - "askVerificationRequest": "{username}பயனர்பெயர் இருந்து இலிருந்து இந்த சரிபார்ப்பு கோரிக்கையை ஏற்றுக்கொள்ளவா?", - "@askVerificationRequest": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "autoplayImages": "அனிமேசன் செய்யப்பட்ட ச்டிக்கர்கள் மற்றும் உணர்ச்சிகளை தானாக இயக்கவும்", - "@autoplayImages": { - "type": "String", - "placeholder": {} - }, - "badServerLoginTypesException": "உள்நாட்டு வகைகளை ஓம்சர்வர் ஆதரிக்கிறது:\n {serverVersions}\n ஆனால் இந்த பயன்பாடு மட்டுமே ஆதரிக்கிறது:\n {supportedVersions}", - "@badServerLoginTypesException": { - "type": "String", - "placeholders": { - "serverVersions": { - "type": "String" - }, - "supportedVersions": { - "type": "String" - } - } - }, - "noChatsFoundHere": "இங்கே அரட்டைகள் எதுவும் காணப்படவில்லை. கீழே உள்ள பொத்தானைப் பயன்படுத்தி ஒருவருடன் புதிய அரட்டையைத் தொடங்கவும். ⤵️", - "@noChatsFoundHere": {}, - "space": "இடைவெளி", - "@space": {}, - "banned": "தடைசெய்யப்பட்டது", - "@banned": { - "type": "String", - "placeholders": {} - }, - "changedTheChatNameTo": "{username} அரட்டை பெயரை மாற்றியது: '{chatname}'", - "@changedTheChatNameTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "chatname": { - "type": "String" - } - } - }, - "changedTheHistoryVisibilityTo": "{username} வரலாற்று தெரிவுநிலையை மாற்றியது: {rules}", - "@changedTheHistoryVisibilityTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheJoinRules": "{username} சேர விதிகளை மாற்றியது", - "@changedTheJoinRules": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheJoinRulesTo": "{username} சேர விதிகளை மாற்றியது: {joinRules}", - "@changedTheJoinRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "joinRules": { - "type": "String" - } - } - }, - "changedTheRoomInvitationLink": "{username} அழைப்பிதழ் இணைப்பை மாற்றியது", - "@changedTheRoomInvitationLink": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changePassword": "கடவுச்சொல்லை மாற்றவும்", - "@changePassword": { - "type": "String", - "placeholders": {} - }, - "changeTheHomeserver": "ஓம்சர்வரை மாற்றவும்", - "@changeTheHomeserver": { - "type": "String", - "placeholders": {} - }, - "changeYourAvatar": "உங்கள் அவதாரத்தை மாற்றவும்", - "@changeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "channelCorruptedDecryptError": "குறியாக்கம் சிதைந்துள்ளது", - "@channelCorruptedDecryptError": { - "type": "String", - "placeholders": {} - }, - "chat": "அரட்டை", - "@chat": { - "type": "String", - "placeholders": {} - }, - "yourChatBackupHasBeenSetUp": "உங்கள் அரட்டை காப்புப்பிரதி அமைக்கப்பட்டுள்ளது.", - "@yourChatBackupHasBeenSetUp": {}, - "chatBackupDescription": "உங்கள் பழைய செய்திகள் மீட்பு விசையுடன் பாதுகாக்கப்படுகின்றன. நீங்கள் அதை இழக்கவில்லை என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.", - "@chatBackupDescription": { - "type": "String", - "placeholders": {} - }, - "commandHint_markasdm": "கொடுக்கப்பட்ட மேட்ரிக்சிற்கான நேரடி செய்தி அறையாக குறிக்கவும்", - "@commandHint_markasdm": {}, - "commandHint_ban": "கொடுக்கப்பட்ட பயனரை இந்த அறையிலிருந்து தடை செய்யுங்கள்", - "@commandHint_ban": { - "type": "String", - "description": "Usage hint for the command /ban" - }, - "commandHint_clearcache": "தெளிவான தற்காலிக சேமிப்பு", - "@commandHint_clearcache": { - "type": "String", - "description": "Usage hint for the command /clearcache" - }, - "commandHint_discardsession": "அமர்வை நிராகரிக்கவும்", - "@commandHint_discardsession": { - "type": "String", - "description": "Usage hint for the command /discardsession" - }, - "commandHint_myroomavatar": "இந்த அறைக்கு உங்கள் படத்தை அமைக்கவும் (MXC-URI எழுதியது)", - "@commandHint_myroomavatar": { - "type": "String", - "description": "Usage hint for the command /myroomavatar" - }, - "commandHint_myroomnick": "இந்த அறைக்கு உங்கள் காட்சி பெயரை அமைக்கவும்", - "@commandHint_myroomnick": { - "type": "String", - "description": "Usage hint for the command /myroomnick" - }, - "commandInvalid": "கட்டளை தவறானது", - "@commandInvalid": { - "type": "String" - }, - "contentHasBeenReported": "உள்ளடக்கம் சேவையக நிர்வாகிகளுக்கு தெரிவிக்கப்பட்டுள்ளது", - "@contentHasBeenReported": { - "type": "String", - "placeholders": {} - }, - "createdTheChat": "💬 {username} அரட்டையை உருவாக்கினார்", - "@createdTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "currentlyActive": "தற்போது செயலில் உள்ளது", - "@currentlyActive": { - "type": "String", - "placeholders": {} - }, - "deactivateAccountWarning": "இது உங்கள் பயனர் கணக்கை செயலிழக்கச் செய்யும். இதை செயல்தவிர்க்க முடியாது! நீங்கள் உறுதியாக இருக்கிறீர்களா?", - "@deactivateAccountWarning": { - "type": "String", - "placeholders": {} - }, - "defaultPermissionLevel": "புதிய பயனர்களுக்கான இயல்புநிலை இசைவு நிலை", - "@defaultPermissionLevel": { - "type": "String", - "placeholders": {} - }, - "delete": "நீக்கு", - "@delete": { - "type": "String", - "placeholders": {} - }, - "devices": "சாதனங்கள்", - "@devices": { - "type": "String", - "placeholders": {} - }, - "directChats": "நேரடி அரட்டைகள்", - "@directChats": { - "type": "String", - "placeholders": {} - }, - "displaynameHasBeenChanged": "காட்சி பெயர் மாற்றப்பட்டுள்ளது", - "@displaynameHasBeenChanged": { - "type": "String", - "placeholders": {} - }, - "editBlockedServers": "தடுக்கப்பட்ட சேவையகங்களைத் திருத்து", - "@editBlockedServers": { - "type": "String", - "placeholders": {} - }, - "emoteExists": "எமோட் ஏற்கனவே உள்ளது!", - "@emoteExists": { - "type": "String", - "placeholders": {} - }, - "emoteInvalid": "தவறான எமோட் சார்ட்கோட்!", - "@emoteInvalid": { - "type": "String", - "placeholders": {} - }, - "emoteKeyboardNoRecents": "அண்மைக் காலத்தில் பயன்படுத்தப்பட்ட உணர்ச்சிகள் இங்கே தோன்றும் ...", - "@emoteKeyboardNoRecents": { - "type": "String", - "placeholders": {} - }, - "emotePacks": "அறைக்கு எமோட் பொதிகள்", - "@emotePacks": { - "type": "String", - "placeholders": {} - }, - "emoteSettings": "எமோட் அமைப்புகள்", - "@emoteSettings": { - "type": "String", - "placeholders": {} - }, - "accessAndVisibilityDescription": "இந்த அரட்டையில் யார் சேர அனுமதிக்கப்படுகிறார்கள், அரட்டையை எவ்வாறு கண்டுபிடிப்பது.", - "@accessAndVisibilityDescription": {}, - "calls": "அழைப்புகள்", - "@calls": {}, - "customEmojisAndStickers": "தனிப்பயன் ஈமோசிகள் மற்றும் ச்டிக்கர்கள்", - "@customEmojisAndStickers": {}, - "customEmojisAndStickersBody": "எந்தவொரு அரட்டையிலும் பயன்படுத்தக்கூடிய தனிப்பயன் ஈமோசிகள் அல்லது ச்டிக்கர்களைச் சேர்க்கவும் அல்லது பகிரவும்.", - "@customEmojisAndStickersBody": {}, - "emoteShortcode": "சார்ட்கோட் எமோட்", - "@emoteShortcode": { - "type": "String", - "placeholders": {} - }, - "enableEmotesGlobally": "உலகளவில் எமோட் பேக்கை இயக்கவும்", - "@enableEmotesGlobally": { - "type": "String", - "placeholders": {} - }, - "enableEncryption": "குறியாக்கத்தை இயக்கவும்", - "@enableEncryption": { - "type": "String", - "placeholders": {} - }, - "enableEncryptionWarning": "நீங்கள் இனி குறியாக்கத்தை முடக்க முடியாது. நீங்கள் உறுதியாக இருக்கிறீர்களா?", - "@enableEncryptionWarning": { - "type": "String", - "placeholders": {} - }, - "encryptionNotEnabled": "குறியாக்கம் இயக்கப்படவில்லை", - "@encryptionNotEnabled": { - "type": "String", - "placeholders": {} - }, - "encryption": "குறியாக்கம்", - "@encryption": { - "type": "String", - "placeholders": {} - }, - "endedTheCall": "{senderName} அழைப்பை முடித்தார்", - "@endedTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "homeserver": "ஓம்சர்வர்", - "@homeserver": {}, - "errorObtainingLocation": "இருப்பிடத்தைப் பெறுவதில் பிழை: {error}", - "@errorObtainingLocation": { - "type": "String", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "everythingReady": "எல்லாம் தயாராக!", - "@everythingReady": { - "type": "String", - "placeholders": {} - }, - "extremeOffensive": "மிகவும் தாக்குதல்", - "@extremeOffensive": { - "type": "String", - "placeholders": {} - }, - "group": "குழு", - "@group": { - "type": "String", - "placeholders": {} - }, - "chatDescription": "அரட்டை விளக்கம்", - "@chatDescription": {}, - "groupIsPublic": "குழு பொது", - "@groupIsPublic": { - "type": "String", - "placeholders": {} - }, - "hideRedactedEvents": "திருத்தப்பட்ட நிகழ்வுகளை மறைக்கவும்", - "@hideRedactedEvents": { - "type": "String", - "placeholders": {} - }, - "hideInvalidOrUnknownMessageFormats": "தவறான அல்லது அறியப்படாத செய்தி வடிவங்களை மறைக்கவும்", - "@hideInvalidOrUnknownMessageFormats": {}, - "id": "ஐடி", - "@id": { - "type": "String", - "placeholders": {} - }, - "block": "தொகுதி", - "@block": {}, - "inviteContactToGroup": "{groupName} க்கு தொடர்பை அழை", - "@inviteContactToGroup": { - "type": "String", - "placeholders": { - "groupName": { - "type": "String" - } - } - }, - "noChatDescriptionYet": "அரட்டை விளக்கம் இதுவரை உருவாக்கப்படவில்லை.", - "@noChatDescriptionYet": {}, - "invalidServerName": "தவறான சேவையக பெயர்", - "@invalidServerName": {}, - "redactMessageDescription": "இந்த உரையாடலில் பங்கேற்பாளர்கள் அனைவருக்கும் செய்தி திருத்தப்படும். இதை செயல்தவிர்க்க முடியாது.", - "@redactMessageDescription": {}, - "invitedUser": "📩 {username} {targetName} அழைக்கப்பட்டார்", - "@invitedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "inviteText": "{username} உங்களை பஞ்சுபோன்றதாக அழைத்தது.\n 1. FulufyChat.im ஐப் பார்வையிட்டு பயன்பாட்டை நிறுவவும்\n 2. பதிவு செய்யுங்கள் அல்லது உள்நுழைக\n 3. அழைப்பிதழ் இணைப்பைத் திறக்கவும்:\n {link}", - "@inviteText": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "joinRoom": "அறையில் சேரவும்", - "@joinRoom": { - "type": "String", - "placeholders": {} - }, - "leave": "விடுப்பு", - "@leave": { - "type": "String", - "placeholders": {} - }, - "hydrate": "காப்பு கோப்பிலிருந்து மீட்டமைக்கவும்", - "@hydrate": {}, - "locationDisabledNotice": "இருப்பிட சேவைகள் முடக்கப்பட்டுள்ளன. தயவுசெய்து உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள அவர்களுக்கு உதவவும்.", - "@locationDisabledNotice": { - "type": "String", - "placeholders": {} - }, - "locationPermissionDeniedNotice": "இருப்பிட இசைவு மறுக்கப்பட்டது. உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள தயவுசெய்து அவர்களுக்கு வழங்குங்கள்.", - "@locationPermissionDeniedNotice": { - "type": "String", - "placeholders": {} - }, - "login": "புகுபதிவு", - "@login": { - "type": "String", - "placeholders": {} - }, - "logInTo": "{homeserver} இல் உள்நுழைக", - "@logInTo": { - "type": "String", - "placeholders": { - "homeserver": { - "type": "String" - } - } - }, - "messages": "செய்திகள்", - "@messages": { - "type": "String", - "placeholders": {} - }, - "muteChat": "முடக்கு அரட்டை", - "@muteChat": { - "type": "String", - "placeholders": {} - }, - "newChat": "புதிய அரட்டை", - "@newChat": { - "type": "String", - "placeholders": {} - }, - "next": "அடுத்தது", - "@next": { - "type": "String", - "placeholders": {} - }, - "none": "எதுவுமில்லை", - "@none": { - "type": "String", - "placeholders": {} - }, - "noPasswordRecoveryDescription": "உங்கள் கடவுச்சொல்லை மீட்டெடுப்பதற்கான வழியை நீங்கள் இன்னும் சேர்க்கவில்லை.", - "@noPasswordRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "openAppToReadMessages": "செய்திகளைப் படிக்க பயன்பாட்டைத் திறக்கவும்", - "@openAppToReadMessages": { - "type": "String", - "placeholders": {} - }, - "oneClientLoggedOut": "உங்கள் வாடிக்கையாளர்களில் ஒருவர் உள்நுழைந்துள்ளார்", - "@oneClientLoggedOut": {}, - "addToBundle": "மூட்டையில் சேர்க்கவும்", - "@addToBundle": {}, - "or": "அல்லது", - "@or": { - "type": "String", - "placeholders": {} - }, - "overview": "கண்ணோட்டம்", - "@overview": {}, - "passwordRecoverySettings": "கடவுச்சொல் மீட்பு அமைப்புகள்", - "@passwordRecoverySettings": {}, - "passwordRecovery": "கடவுச்சொல் மீட்பு", - "@passwordRecovery": { - "type": "String", - "placeholders": {} - }, - "play": "{fileName} இயக்கு", - "@play": { - "type": "String", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "pleaseEnter4Digits": "பயன்பாட்டு பூட்டை முடக்க 4 இலக்கங்களை உள்ளிடவும் அல்லது காலியாக விடவும்.", - "@pleaseEnter4Digits": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourPassword": "உங்கள் கடவுச்சொல்லை உள்ளிடவும்", - "@pleaseEnterYourPassword": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourPin": "உங்கள் முள் உள்ளிடவும்", - "@pleaseEnterYourPin": { - "type": "String", - "placeholders": {} - }, - "pleaseEnterYourUsername": "உங்கள் பயனர்பெயரை உள்ளிடவும்", - "@pleaseEnterYourUsername": { - "type": "String", - "placeholders": {} - }, - "pleaseFollowInstructionsOnWeb": "வலைத்தளத்தின் வழிமுறைகளைப் பின்பற்றி அடுத்து தட்டவும்.", - "@pleaseFollowInstructionsOnWeb": { - "type": "String", - "placeholders": {} - }, - "privacy": "தனியுரிமை", - "@privacy": { - "type": "String", - "placeholders": {} - }, - "reason": "காரணம்", - "@reason": { - "type": "String", - "placeholders": {} - }, - "redactedByBecause": "{username} ஆல் திருத்தப்பட்டது ஏனெனில்: \"{reason}\"", - "@redactedByBecause": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "reason": { - "type": "String" - } - } - }, - "register": "பதிவு செய்யுங்கள்", - "@register": { - "type": "String", - "placeholders": {} - }, - "rejectedTheInvitation": "{username} அழைப்பை நிராகரித்தது", - "@rejectedTheInvitation": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "unbanFromChat": "அரட்டையிலிருந்து தடையின்றி", - "@unbanFromChat": { - "type": "String", - "placeholders": {} - }, - "removeYourAvatar": "உங்கள் அவதாரத்தை அகற்று", - "@removeYourAvatar": { - "type": "String", - "placeholders": {} - }, - "replaceRoomWithNewerVersion": "புதிய பதிப்போடு அறையை மாற்றவும்", - "@replaceRoomWithNewerVersion": { - "type": "String", - "placeholders": {} - }, - "sendAsText": "உரையாக அனுப்பவும்", - "@sendAsText": { - "type": "String" - }, - "sendAudio": "ஆடியோ அனுப்பவும்", - "@sendAudio": { - "type": "String", - "placeholders": {} - }, - "sendImage": "படத்தை அனுப்பு", - "@sendImage": { - "type": "String", - "placeholders": {} - }, - "sendImages": "{count} படத்தை அனுப்பு", - "@sendImages": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "sendVideo": "வீடியோ அனுப்பவும்", - "@sendVideo": { - "type": "String", - "placeholders": {} - }, - "sentASticker": "😊 {username} ஒரு ச்டிக்கரை அனுப்பியது", - "@sentASticker": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "sentCallInformations": "{senderName} அனுப்பப்பட்ட அழைப்பு செய்தி", - "@sentCallInformations": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "setAsCanonicalAlias": "முதன்மையான மாற்றுப்பெயராக அமைக்கவும்", - "@setAsCanonicalAlias": { - "type": "String", - "placeholders": {} - }, - "setChatDescription": "அரட்டை விளக்கத்தை அமைக்கவும்", - "@setChatDescription": {}, - "share": "பங்கு", - "@share": { - "type": "String", - "placeholders": {} - }, - "presencesToggle": "பிற பயனர்களிடமிருந்து நிலை செய்திகளைக் காட்டு", - "@presencesToggle": { - "type": "String", - "placeholders": {} - }, - "skip": "தவிர்", - "@skip": { - "type": "String", - "placeholders": {} - }, - "sourceCode": "மூலக் குறியீடு", - "@sourceCode": { - "type": "String", - "placeholders": {} - }, - "spaceName": "விண்வெளி பெயர்", - "@spaceName": { - "type": "String", - "placeholders": {} - }, - "status": "நிலை", - "@status": { - "type": "String", - "placeholders": {} - }, - "systemTheme": "மண்டலம்", - "@systemTheme": { - "type": "String", - "placeholders": {} - }, - "theyMatch": "அவர்கள் பொருந்துகிறார்கள்", - "@theyMatch": { - "type": "String", - "placeholders": {} - }, - "unbannedUser": "{username} தடைசெய்யப்படாத {targetName}", - "@unbannedUser": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "targetName": { - "type": "String" - } - } - }, - "unknownEvent": "அறியப்படாத நிகழ்வு '{type}'", - "@unknownEvent": { - "type": "String", - "placeholders": { - "type": { - "type": "String" - } - } - }, - "userAndOthersAreTyping": "{username} மற்றும் {count} மற்றவர்கள் தட்டச்சு செய்கிறார்கள்…", - "@userAndOthersAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "userIsTyping": "{username} தட்டச்சு செய்கிறது…", - "@userIsTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "waitingPartnerAcceptRequest": "கூட்டாளர் கோரிக்கையை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", - "@waitingPartnerAcceptRequest": { - "type": "String", - "placeholders": {} - }, - "waitingPartnerEmoji": "பங்குதாரர் ஈமோசியை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", - "@waitingPartnerEmoji": { - "type": "String", - "placeholders": {} - }, - "sender": "அனுப்புநர்", - "@sender": {}, - "openGallery": "திறந்த கேலரி", - "@openGallery": {}, - "whyDoYouWantToReportThis": "இதை ஏன் புகாரளிக்க விரும்புகிறீர்கள்?", - "@whyDoYouWantToReportThis": { - "type": "String", - "placeholders": {} - }, - "wipeChatBackup": "புதிய மீட்பு விசையை உருவாக்க உங்கள் அரட்டை காப்புப்பிரதியைத் துடைக்கவா?", - "@wipeChatBackup": { - "type": "String", - "placeholders": {} - }, - "withTheseAddressesRecoveryDescription": "இந்த முகவரிகள் மூலம் உங்கள் கடவுச்சொல்லை மீட்டெடுக்கலாம்.", - "@withTheseAddressesRecoveryDescription": { - "type": "String", - "placeholders": {} - }, - "writeAMessage": "ஒரு செய்தியை எழுதுங்கள்…", - "@writeAMessage": { - "type": "String", - "placeholders": {} - }, - "yes": "ஆம்", - "@yes": { - "type": "String", - "placeholders": {} - }, - "removeFromSpace": "இடத்திலிருந்து அகற்று", - "@removeFromSpace": {}, - "pleaseEnterRecoveryKeyDescription": "உங்கள் பழைய செய்திகளைத் திறக்க, முந்தைய அமர்வில் உருவாக்கப்பட்ட உங்கள் மீட்பு விசையை உள்ளிடவும். உங்கள் மீட்பு விசை உங்கள் கடவுச்சொல் அல்ல.", - "@pleaseEnterRecoveryKeyDescription": {}, - "confirmEventUnpin": "நிகழ்வை நிரந்தரமாக அவிழ்ப்பது உறுதி?", - "@confirmEventUnpin": {}, - "youJoinedTheChat": "நீங்கள் அரட்டையில் சேர்ந்தீர்கள்", - "@youJoinedTheChat": {}, - "youAcceptedTheInvitation": "👍 நீங்கள் அழைப்பை ஏற்றுக்கொண்டீர்கள்", - "@youAcceptedTheInvitation": {}, - "youBannedUser": "நீங்கள் {user} தடை செய்தீர்கள்", - "@youBannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youHaveWithdrawnTheInvitationFor": "{user}க்கான அழைப்பை திரும்பப் பெற்றுவிட்டீர்கள்", - "@youHaveWithdrawnTheInvitationFor": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youInvitedBy": "📩 நீங்கள் {user} ஆல் அழைக்கப்பட்டுள்ளீர்கள்", - "@youInvitedBy": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youInvitedUser": "📩 {user} ஐ அழைத்தீர்கள்", - "@youInvitedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "youUnbannedUser": "நீங்கள் {user} தடைசெய்யவில்லை", - "@youUnbannedUser": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "hasKnocked": "🚪 {user} தட்டியது", - "@hasKnocked": { - "placeholders": { - "user": { - "type": "String" - } - } - }, - "knock": "தட்டவும்", - "@knock": {}, - "users": "பயனர்கள்", - "@users": {}, - "storeInSecureStorageDescription": "மீட்பு விசையை இந்த சாதனத்தின் பாதுகாப்பான சேமிப்பகத்தில் சேமிக்கவும்.", - "@storeInSecureStorageDescription": {}, - "saveKeyManuallyDescription": "கணினி பகிர்வு உரையாடல் அல்லது கிளிப்போர்டைத் தூண்டுவதன் மூலம் இந்த விசையை கைமுறையாக சேமிக்கவும்.", - "@saveKeyManuallyDescription": {}, - "storeInAndroidKeystore": "ஆண்ட்ராய்டு கீச்டோரில் சேமிக்கவும்", - "@storeInAndroidKeystore": {}, - "countFiles": "{count} கோப்புகள்", - "@countFiles": { - "placeholders": { - "count": { - "type": "int" - } - } - }, - "custom": "தனிப்பயன்", - "@custom": {}, - "foregroundServiceRunning": "முன்புற பணி இயங்கும்போது இந்த அறிவிப்பு தோன்றும்.", - "@foregroundServiceRunning": {}, - "screenSharingDetail": "உங்கள் திரையை FUFFYCHAT இல் பகிர்கிறீர்கள்", - "@screenSharingDetail": {}, - "whyIsThisMessageEncrypted": "இந்த செய்தி ஏன் படிக்க முடியாதது?", - "@whyIsThisMessageEncrypted": {}, - "noKeyForThisMessage": "இந்த சாதனத்தில் உங்கள் கணக்கில் கையொப்பமிடுவதற்கு முன்பு செய்தி அனுப்பப்பட்டால் இது நிகழலாம்.\n\n அனுப்புநர் உங்கள் சாதனத்தைத் தடுத்துள்ளார் அல்லது இணைய இணைப்பில் ஏதேனும் தவறு ஏற்பட்டுள்ளது.\n\n மற்றொரு அமர்வில் செய்தியைப் படிக்க முடியுமா? அதிலிருந்து செய்தியை மாற்றலாம்! அமைப்புகள்> சாதனங்களுக்குச் சென்று, உங்கள் சாதனங்கள் ஒருவருக்கொருவர் சரிபார்த்துள்ளன என்பதை உறுதிப்படுத்தவும். அடுத்த முறை நீங்கள் அறையைத் திறக்கும்போது, இரண்டு அமர்வுகளும் முன்னணியில் இருக்கும்போது, விசைகள் தானாகவே அனுப்பப்படும்.\n\n வெளியேறும்போது அல்லது சாதனங்களை மாற்றும்போது விசைகளை இழக்க நீங்கள் விரும்பவில்லையா? அமைப்புகளில் அரட்டை காப்புப்பிரதியை நீங்கள் இயக்கியுள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.", - "@noKeyForThisMessage": {}, - "hidePresences": "நிலை பட்டியலை மறைக்கவா?", - "@hidePresences": {}, - "doNotShowAgain": "மீண்டும் காட்ட வேண்டாம்", - "@doNotShowAgain": {}, - "newSpaceDescription": "உங்கள் அரட்டைகளை ஒருங்கிணைத்து தனியார் அல்லது பொது சமூகங்களை உருவாக்க இடைவெளிகள் உங்களை அனுமதிக்கிறது.", - "@newSpaceDescription": {}, - "disableEncryptionWarning": "பாதுகாப்பு காரணங்களுக்காக நீங்கள் ஒரு அரட்டையில் குறியாக்கத்தை முடக்க முடியாது, அது இதற்கு முன்பு இயக்கப்பட்டிருக்கிறது.", - "@disableEncryptionWarning": {}, - "sorryThatsNotPossible": "மன்னிக்கவும் ... அது சாத்தியமில்லை", - "@sorryThatsNotPossible": {}, - "noBackupWarning": "எச்சரிக்கை! அரட்டை காப்புப்பிரதியை இயக்காமல், உங்கள் மறைகுறியாக்கப்பட்ட செய்திகளுக்கான அணுகலை இழப்பீர்கள். வெளியேறுவதற்கு முன் முதலில் அரட்டை காப்புப்பிரதியை இயக்க மிகவும் பரிந்துரைக்கப்படுகிறது.", - "@noBackupWarning": {}, - "fileIsTooBigForServer": "அனுப்ப முடியவில்லை! சேவையகம் {max} வரை இணைப்புகளை மட்டுமே ஆதரிக்கிறது.", - "@fileIsTooBigForServer": { - "type": "String", - "placeholders": { - "max": { - "type": "String" - } - } - }, - "fileHasBeenSavedAt": "கோப்பு {path}", - "@fileHasBeenSavedAt": { - "type": "String", - "placeholders": { - "path": { - "type": "String" - } - } - }, - "inviteGroupChat": "📨 குழு அரட்டை அழைப்பு", - "@inviteGroupChat": {}, - "invalidInput": "தவறான உள்ளீடு!", - "@invalidInput": {}, - "archiveRoomDescription": "அரட்டை காப்பகத்திற்கு நகர்த்தப்படும். மற்ற பயனர்கள் நீங்கள் அரட்டையை விட்டுவிட்டீர்கள் என்பதைக் காண முடியும்.", - "@archiveRoomDescription": {}, - "removeDevicesDescription": "நீங்கள் இந்த சாதனத்திலிருந்து வெளியேறுவீர்கள், இனி செய்திகளைப் பெற முடியாது.", - "@removeDevicesDescription": {}, - "banUserDescription": "பயனர் அரட்டையிலிருந்து தடைசெய்யப்படுவார், மேலும் அவை தடைசெய்யப்படாத வரை மீண்டும் அரட்டையில் நுழைய முடியாது.", - "@banUserDescription": {}, - "makeAdminDescription": "இந்த பயனர் நிர்வாகியை நீங்கள் செய்தவுடன், இதை நீங்கள் செயல்தவிர்க்க முடியாமல் போகலாம், ஏனெனில் அவை உங்களைப் போன்ற அதே அனுமதிகளைக் கொண்டிருக்கும்.", - "@makeAdminDescription": {}, - "knocking": "தட்டுதல்", - "@knocking": {}, - "searchChatsRooms": "#Chats, Us பயனர்களைத் தேடுங்கள் ...", - "@searchChatsRooms": {}, - "nothingFound": "எதுவும் கிடைக்கவில்லை ...", - "@nothingFound": {}, - "groupName": "குழு பெயர்", - "@groupName": {}, - "createGroupAndInviteUsers": "ஒரு குழுவை உருவாக்கி பயனர்களை அழைக்கவும்", - "@createGroupAndInviteUsers": {}, - "groupCanBeFoundViaSearch": "தேடல் வழியாக குழுவை காணலாம்", - "@groupCanBeFoundViaSearch": {}, - "wrongRecoveryKey": "மன்னிக்கவும் ... இது சரியான மீட்பு விசையாகத் தெரியவில்லை.", - "@wrongRecoveryKey": {}, - "databaseMigrationBody": "தயவுசெய்து காத்திருங்கள். இது ஒரு கணம் ஆகலாம்.", - "@databaseMigrationBody": {}, - "newPassword": "புதிய கடவுச்சொல்", - "@newPassword": {}, - "pleaseChooseAStrongPassword": "வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க", - "@pleaseChooseAStrongPassword": {}, - "passwordsDoNotMatch": "கடவுச்சொற்கள் பொருந்தவில்லை", - "@passwordsDoNotMatch": {}, - "joinSpace": "விண்வெளியில் சேரவும்", - "@joinSpace": {}, - "addChatOrSubSpace": "அரட்டை அல்லது துணை இடத்தைச் சேர்க்கவும்", - "@addChatOrSubSpace": {}, - "initAppError": "பயன்பாட்டைத் தொடங்கும்போது பிழை ஏற்பட்டது", - "@initAppError": {}, - "sessionLostBody": "உங்கள் அமர்வு தொலைந்துவிட்டது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", - "@sessionLostBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "sendTypingNotificationsDescription": "அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு புதிய செய்தியைத் தட்டச்சு செய்யும் போது காணலாம்.", - "@sendTypingNotificationsDescription": {}, - "sendReadReceiptsDescription": "அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு செய்தியைப் படிக்கும்போது பார்க்கலாம்.", - "@sendReadReceiptsDescription": {}, - "formattedMessagesDescription": "மார்க் டவுனைப் பயன்படுத்தி தைரியமான உரை போன்ற பணக்கார செய்தி உள்ளடக்கத்தைக் காண்பி.", - "@formattedMessagesDescription": {}, - "verifyOtherUser": "Poser மற்ற பயனரை சரிபார்க்கவும்", - "@verifyOtherUser": {}, - "verifyOtherUserDescription": "நீங்கள் மற்றொரு பயனரைச் சரிபார்த்தால், நீங்கள் உண்மையில் யாருக்கு எழுதுகிறீர்கள் என்பது உங்களுக்குத் தெரியும் என்பதை நீங்கள் உறுதியாக நம்பலாம். 💪\n\nநீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, நீங்களும் மற்ற பயனரும் பயன்பாட்டில் ஒரு பாப்அப்பைக் காண்பீர்கள். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள்.\n\nஇதைச் செய்வதற்கான சிறந்த வழி வீடியோ அழைப்பைச் சந்திப்பது அல்லது தொடங்குவது. 👭", - "@verifyOtherUserDescription": {}, - "verifyOtherDeviceDescription": "நீங்கள் மற்றொரு சாதனத்தைச் சரிபார்க்கும்போது, அந்தச் சாதனங்கள் விசைகளைப் பரிமாறிக்கொள்ளலாம், உங்கள் ஒட்டுமொத்த பாதுகாப்பை அதிகரிக்கும். 💪 நீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, இரண்டு சாதனங்களிலும் பயன்பாட்டில் ஒரு பாப்அப் தோன்றும். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள். நீங்கள் சரிபார்ப்பைத் தொடங்குவதற்கு முன்பு இரண்டு சாதனங்களையும் எளிதில் வைத்திருப்பது நல்லது. 🤳", - "@verifyOtherDeviceDescription": {}, - "canceledKeyVerification": "{sender} ரத்து செய்யப்பட்ட விசை சரிபார்ப்பு", - "@canceledKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "isReadyForKeyVerification": "விசை சரிபார்ப்பிற்கு {sender} தயாராக உள்ளார்", - "@isReadyForKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "requestedKeyVerification": "{sender} கோரப்பட்ட விசை சரிபார்ப்பு", - "@requestedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "transparent": "வெளிப்படையானது", - "@transparent": {}, - "stickers": "ச்டிக்கர்கள்", - "@stickers": {}, - "commandHint_ignore": "கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை புறக்கணிக்கவும்", - "@commandHint_ignore": {}, - "unreadChatsInApp": "{appname}: {unread} படிக்காத அரட்டைகள்", - "@unreadChatsInApp": { - "type": "String", - "placeholders": { - "appname": { - "type": "String" - }, - "unread": { - "type": "String" - } - } - }, - "thereAreCountUsersBlocked": "இப்போது {count} பயனர்கள் தடுக்கப்பட்டுள்ளனர்.", - "@thereAreCountUsersBlocked": { - "type": "String", - "count": {} - }, - "restricted": "தடைசெய்யப்பட்டது", - "@restricted": {}, - "moderatorLevel": "{level} - மதிப்பீட்டாளர்", - "@moderatorLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "adminLevel": "{level} - நிர்வாகி", - "@adminLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "changeGeneralChatSettings": "பொது அரட்டை அமைப்புகளை மாற்றவும்", - "@changeGeneralChatSettings": {}, - "inviteOtherUsers": "இந்த அரட்டைக்கு மற்ற பயனர்களை அழைக்கவும்", - "@inviteOtherUsers": {}, - "changeTheChatPermissions": "அரட்டை அனுமதிகளை மாற்றவும்", - "@changeTheChatPermissions": {}, - "changeTheVisibilityOfChatHistory": "அரட்டை வரலாற்றின் தெரிவுநிலையை மாற்றவும்", - "@changeTheVisibilityOfChatHistory": {}, - "changeTheCanonicalRoomAlias": "முக்கிய பொது அரட்டை முகவரியை மாற்றவும்", - "@changeTheCanonicalRoomAlias": {}, - "changeTheDescriptionOfTheGroup": "அரட்டையின் விளக்கத்தை மாற்றவும்", - "@changeTheDescriptionOfTheGroup": {}, - "chatPermissionsDescription": "இந்த அரட்டையில் சில செயல்களுக்கு எந்த ஆற்றல் நிலை தேவை என்பதை வரையறுக்கவும். 0, 50 மற்றும் 100 ஆற்றல் நிலைகள் பொதுவாக பயனர்கள், மதிப்பீட்டாளர்கள் மற்றும் நிர்வாகிகளைக் குறிக்கின்றன, ஆனால் எந்த தரமும் சாத்தியமாகும்.", - "@chatPermissionsDescription": {}, - "updateInstalled": "🎉 புதுப்பிப்பு {version} நிறுவப்பட்டது!", - "@updateInstalled": { - "type": "String", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "changelog": "மாற்றபதிவு", - "@changelog": {}, - "calculatingFileSize": "கோப்பு அளவைக் கணக்கிடுகிறது ...", - "@calculatingFileSize": {}, - "compressVideo": "அமைக்கும் வீடியோ ...", - "@compressVideo": {}, - "sendingAttachmentCountOfCount": "{length} இன் இணைப்பு {index}ஐ அனுப்புகிறது...", - "@sendingAttachmentCountOfCount": { - "type": "integer", - "placeholders": { - "index": { - "type": "int" - }, - "length": { - "type": "int" - } - } - }, - "oneOfYourDevicesIsNotVerified": "உங்கள் சாதனங்களில் ஒன்று சரிபார்க்கப்படவில்லை", - "@oneOfYourDevicesIsNotVerified": {}, - "noticeChatBackupDeviceVerification": "குறிப்பு: உங்கள் எல்லா சாதனங்களையும் அரட்டை காப்புப்பிரதியுடன் இணைக்கும்போது, அவை தானாகவே சரிபார்க்கப்படும்.", - "@noticeChatBackupDeviceVerification": {}, - "manageAccount": "கணக்கை நிர்வகிக்கவும்", - "@manageAccount": {}, - "noContactInformationProvided": "சேவையகம் எந்த சரியான தொடர்பு தகவலையும் வழங்காது", - "@noContactInformationProvided": {}, - "contactServerAdmin": "சேவையக நிர்வாகி தொடர்பு", - "@contactServerAdmin": {}, - "contactServerSecurity": "சேவையக பாதுகாப்பைத் தொடர்பு கொள்ளுங்கள்", - "@contactServerSecurity": {}, - "supportPage": "உதவி பக்கம்", - "@supportPage": {}, - "serverInformation": "சேவையக தகவல்:", - "@serverInformation": {}, - "version": "பதிப்பு", - "@version": {}, - "website": "வலைத்தளம்", - "@website": {}, - "compress": "சுருக்க", - "@compress": {}, - "alwaysUse24HourFormat": "தவறு", - "@alwaysUse24HourFormat": { - "description": "Set to true to always display time of day in 24 hour format." - }, - "admin": "நிர்வாகி", - "@admin": { - "type": "String", - "placeholders": {} - }, - "alias": "மாற்றுப்பெயர்", - "@alias": { - "type": "String", - "placeholders": {} - }, - "answeredTheCall": "{senderName} அழைப்புக்கு பதிலளித்தார்", - "@answeredTheCall": { - "type": "String", - "placeholders": { - "senderName": { - "type": "String" - } - } - }, - "commandHint_react": "ஒரு எதிர்வினையாக பதிலை அனுப்பவும்", - "@commandHint_react": { - "type": "String", - "description": "Usage hint for the command /react" - }, - "commandHint_send": "உரையை அனுப்பவும்", - "@commandHint_send": { - "type": "String", - "description": "Usage hint for the command /send" - }, - "removeFromBundle": "இந்த மூட்டையிலிருந்து அகற்றவும்", - "@removeFromBundle": {}, - "pushRules": "தள்ளி விதிகள்", - "@pushRules": { - "type": "String", - "placeholders": {} - }, - "recording": "பதிவு", - "@recording": { - "type": "String", - "placeholders": {} - }, - "redactedBy": "{username} ஆல் திருத்தப்பட்டது", - "@redactedBy": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "directChat": "நேரடி அரட்டை", - "@directChat": {}, - "redactMessage": "திருத்தும் செய்தி", - "@redactMessage": { - "type": "String", - "placeholders": {} - }, - "userAndUserAreTyping": "{username} மற்றும் {username2} தட்டச்சு செய்கின்றன…", - "@userAndUserAreTyping": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "username2": { - "type": "String" - } - } - }, - "userLeftTheChat": "🚪 {username} அரட்டையை விட்டு வெளியேறினார்", - "@userLeftTheChat": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "visibilityOfTheChatHistory": "அரட்டை வரலாற்றின் தெரிவுநிலை", - "@visibilityOfTheChatHistory": { - "type": "String", - "placeholders": {} - }, - "you": "நீங்கள்", - "@you": { - "type": "String", - "placeholders": {} - }, - "unsupportedAndroidVersionLong": "இந்த அம்சத்திற்கு புதிய ஆண்ட்ராய்டு பதிப்பு தேவைப்படுகிறது. புதுப்பிப்புகள் அல்லது பரம்பரை OS ஆதரவை சரிபார்க்கவும்.", - "@unsupportedAndroidVersionLong": {}, - "setColorTheme": "வண்ண கருப்பொருள் அமைக்கவும்:", - "@setColorTheme": {}, - "roomUpgradeDescription": "அரட்டை பின்னர் புதிய அறை பதிப்பில் மீண்டும் உருவாக்கப்படும். பங்கேற்பாளர்கள் அனைவருக்கும் புதிய அரட்டைக்கு மாற வேண்டும் என்று அறிவிக்கப்படும். அறை பதிப்புகள் பற்றி மேலும் அறிய https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, - "account": "கணக்கு", - "@account": { - "type": "String", - "placeholders": {} - }, - "groups": "குழுக்கள்", - "@groups": { - "type": "String", - "placeholders": {} - }, - "blockedUsers": "தடுக்கப்பட்ட பயனர்கள்", - "@blockedUsers": {}, - "leaveEmptyToClearStatus": "உங்கள் நிலையை அழிக்க காலியாக விடவும்.", - "@leaveEmptyToClearStatus": {}, - "thisDevice": "இந்த சாதனம்:", - "@thisDevice": {}, - "gallery": "கேலரி", - "@gallery": {}, - "files": "கோப்புகள்", - "@files": {}, - "noDatabaseEncryption": "இந்த மேடையில் தரவுத்தள குறியாக்கம் ஆதரிக்கப்படவில்லை", - "@noDatabaseEncryption": {}, - "goToSpace": "விண்வெளிக்குச் செல்லுங்கள்: {space}", - "@goToSpace": { - "type": "String", - "space": {} - }, - "markAsUnread": "படிக்காத எனக் குறிக்கவும்", - "@markAsUnread": {}, - "userLevel": "{level} - பயனர்", - "@userLevel": { - "type": "String", - "placeholders": { - "level": { - "type": "int" - } - } - }, - "notAnImage": "படக் கோப்பு அல்ல.", - "@notAnImage": {}, - "encryptThisChat": "இந்த அரட்டையை குறியாக்கவும்", - "@encryptThisChat": {}, - "publicChatAddresses": "பொது அரட்டை முகவரிகள்", - "@publicChatAddresses": {}, - "createNewAddress": "புதிய முகவரியை உருவாக்கவும்", - "@createNewAddress": {}, - "boldText": "தைரியமான உரை", - "@boldText": {}, - "italicText": "சாய்வு உரை", - "@italicText": {}, - "strikeThrough": "ச்ட்ரைகெத்ரோ", - "@strikeThrough": {}, - "pleaseFillOut": "தயவுசெய்து நிரப்பவும்", - "@pleaseFillOut": {}, - "invalidUrl": "தவறான முகவரி", - "@invalidUrl": {}, - "addLink": "இணைப்பைச் சேர்க்கவும்", - "@addLink": {}, - "searchIn": "அரட்டையில் தேடு \"{chat}\" ...", - "@searchIn": { - "type": "String", - "placeholders": { - "chat": { - "type": "String" - } - } - }, - "searchMore": "மேலும் தேடுங்கள் ...", - "@searchMore": {}, - "startedKeyVerification": "{sender} விசை சரிபார்ப்பைத் தொடங்கினார்", - "@startedKeyVerification": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - } - } - }, - "loginWithMatrixId": "மேட்ரிக்ச்-ஐடியுடன் உள்நுழைக", - "@loginWithMatrixId": {}, - "doesNotSeemToBeAValidHomeserver": "இணக்கமான ஓம்சர்வர் என்று தெரியவில்லை. தவறான URL?", - "@doesNotSeemToBeAValidHomeserver": {}, - "noMoreChatsFound": "இனி அரட்டைகள் கிடைக்கவில்லை ...", - "@noMoreChatsFound": {}, - "spaces": "இடங்கள்", - "@spaces": {}, - "changedTheChatPermissions": "{username} அரட்டை அனுமதிகளை மாற்றியுள்ளார்", - "@changedTheChatPermissions": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "changedTheGuestAccessRulesTo": "{username} விருந்தினர் அணுகல் விதிகளை மாற்றியது: {rules}", - "@changedTheGuestAccessRulesTo": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - }, - "rules": { - "type": "String" - } - } - }, - "changedTheHistoryVisibility": "{username} வரலாற்று தெரிவுநிலையை மாற்றியது", - "@changedTheHistoryVisibility": { - "type": "String", - "placeholders": { - "username": { - "type": "String" - } - } - }, - "commandHint_join": "கொடுக்கப்பட்ட அறையில் சேரவும்", - "@commandHint_join": { - "type": "String", - "description": "Usage hint for the command /join" - }, - "commandHint_dm": "நேரடி அரட்டையைத் தொடங்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்", - "@commandHint_dm": { - "type": "String", - "description": "Usage hint for the command /dm" - }, - "commandHint_leave": "இந்த அறையை விட்டு விடுங்கள்", - "@commandHint_leave": { - "type": "String", - "description": "Usage hint for the command /leave" - }, - "unbanUserDescription": "அவர்கள் முயற்சித்தால் பயனர் மீண்டும் அரட்டையை உள்ளிட முடியும்.", - "@unbanUserDescription": {}, - "restoreSessionBody": "ஆப்ஸ் இப்போது உங்கள் அமர்வை காப்புப்பிரதியிலிருந்து மீட்டெடுக்க முயற்சிக்கிறது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", - "@restoreSessionBody": { - "type": "String", - "placeholders": { - "url": { - "type": "String" - }, - "error": { - "type": "String" - } - } - }, - "sendReadReceipts": "வாசிப்பு ரசீதுகளை அனுப்பவும்", - "@sendReadReceipts": {}, - "unableToJoinChat": "அரட்டையில் சேர முடியவில்லை. ஒருவேளை மற்ற கட்சி ஏற்கனவே உரையாடலை மூடியிருக்கலாம்.", - "@unableToJoinChat": {}, - "noGoogleServicesWarning": "ஃபயர்பேச் முகில் செய்தி உங்கள் சாதனத்தில் கிடைக்கவில்லை. இன்னும் புச் அறிவிப்புகளைப் பெற, NTFY ஐ நிறுவ பரிந்துரைக்கிறோம். NTFY அல்லது மற்றொரு ஒருங்கிணைந்த புச் வழங்குநருடன் நீங்கள் தரவு பாதுகாப்பான வழியில் புச் அறிவிப்புகளைப் பெறலாம். நீங்கள் பிளேச்டோரிலிருந்து அல்லது எஃப்-டிராய்டிலிருந்து NTFY ஐ பதிவிறக்கம் செய்யலாம்.", - "@noGoogleServicesWarning": { - "type": "String", - "placeholders": {} - }, - "scanQrCode": "QR குறியீட்டை ச்கேன் செய்யுங்கள்", - "@scanQrCode": {}, - "obtainingLocation": "இருப்பிடத்தைப் பெறுதல்…", - "@obtainingLocation": { - "type": "String", - "placeholders": {} - }, - "offline": "இணையமில்லாமல்", - "@offline": { - "type": "String", - "placeholders": {} - }, - "online": "ஆன்லைனில்", - "@online": { - "type": "String", - "placeholders": {} - }, - "participant": "பங்கேற்பாளர்", - "@participant": { - "type": "String", - "placeholders": {} - }, - "search": "தேடல்", - "@search": { - "type": "String", - "placeholders": {} - }, - "security": "பாதுகாப்பு", - "@security": { - "type": "String", - "placeholders": {} - }, - "sendFile": "கோப்பு அனுப்பவும்", - "@sendFile": { - "type": "String", - "placeholders": {} - }, - "ignoreUser": "பயனரை புறக்கணிக்கவும்", - "@ignoreUser": {}, - "commandHint_roomupgrade": "கொடுக்கப்பட்ட அறை பதிப்பிற்கு இந்த அறையை மேம்படுத்தவும்", - "@commandHint_roomupgrade": {}, - "checkList": "சரிபார்ப்பு பட்டியல்", - "@checkList": {}, - "countInvited": "{count} அழைக்கப்பட்டது", - "@countInvited": { - "type": "String", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "synchronizingPleaseWaitCounter": " ஒத்திசைத்தல்… ({percentage}%)", - "@synchronizingPleaseWaitCounter": { - "type": "String", - "placeholders": { - "percentage": { - "type": "String" - } - } - }, - "previous": "முந்தைய", - "@previous": {}, - "otherPartyNotLoggedIn": "மற்ற கட்சி தற்போது உள்நுழைந்திருக்கவில்லை, எனவே செய்திகளைப் பெற முடியாது!", - "@otherPartyNotLoggedIn": {}, - "appWantsToUseForLogin": "உள்நுழைய '{server}' ஐப் பயன்படுத்தவும்", - "@appWantsToUseForLogin": { - "type": "String", - "placeholders": { - "server": { - "type": "String" - } - } - }, - "appWantsToUseForLoginDescription": "உங்களைப் பற்றிய தகவல்களைப் பகிர பயன்பாடு மற்றும் வலைத்தளத்தை இதன்மூலம் அனுமதிக்கிறீர்கள்.", - "@appWantsToUseForLoginDescription": {}, - "open": "திற", - "@open": {}, - "waitingForServer": "சேவையகத்திற்காக காத்திருக்கிறது ...", - "@waitingForServer": {}, - "newChatRequest": "அரட்டை கோரிக்கை", - "@newChatRequest": {}, - "contentNotificationSettings": "உள்ளடக்க அறிவிப்பு அமைப்புகள்", - "@contentNotificationSettings": {}, - "generalNotificationSettings": "பொது அறிவிப்பு அமைப்புகள்", - "@generalNotificationSettings": {}, - "roomNotificationSettings": "அறை அறிவிப்பு அமைப்புகள்", - "@roomNotificationSettings": {}, - "userSpecificNotificationSettings": "பயனர் குறிப்பிட்ட அறிவிப்பு அமைப்புகள்", - "@userSpecificNotificationSettings": {}, - "otherNotificationSettings": "பிற அறிவிப்பு அமைப்புகள்", - "@otherNotificationSettings": {}, - "notificationRuleContainsUserName": "பயனர் பெயரைக் கொண்டுள்ளது", - "@notificationRuleContainsUserName": {}, - "notificationRuleContainsUserNameDescription": "ஒரு செய்தியில் அவற்றின் பயனர்பெயர் இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleContainsUserNameDescription": {}, - "notificationRuleMaster": "அனைத்து அறிவிப்புகளையும் முடக்குகிறது", - "@notificationRuleMaster": {}, - "notificationRuleMasterDescription": "மற்ற எல்லா விதிகளையும் மீறி அனைத்து அறிவிப்புகளையும் முடக்குகிறது.", - "@notificationRuleMasterDescription": {}, - "notificationRuleSuppressNotices": "தானியங்கு செய்திகளை அடக்கவும்", - "@notificationRuleSuppressNotices": {}, - "notificationRuleSuppressNoticesDescription": "போட்ச் போன்ற தானியங்கி வாடிக்கையாளர்களிடமிருந்து அறிவிப்புகளை அடக்குகிறது.", - "@notificationRuleSuppressNoticesDescription": {}, - "notificationRuleInviteForMe": "எனக்கு அழைக்கவும்", - "@notificationRuleInviteForMe": {}, - "notificationRuleInviteForMeDescription": "ஒரு அறைக்கு அழைக்கப்படும்போது பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleInviteForMeDescription": {}, - "notificationRuleMemberEvent": "உறுப்பினர் நிகழ்வு", - "@notificationRuleMemberEvent": {}, - "notificationRuleMemberEventDescription": "உறுப்பினர் நிகழ்வுகளுக்கான அறிவிப்புகளை அடக்குகிறது.", - "@notificationRuleMemberEventDescription": {}, - "notificationRuleIsUserMention": "பயனர் குறிப்பு", - "@notificationRuleIsUserMention": {}, - "notificationRuleIsUserMentionDescription": "ஒரு செய்தியில் நேரடியாக குறிப்பிடப்படும்போது பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleIsUserMentionDescription": {}, - "notificationRuleContainsDisplayName": "காட்சி பெயரைக் கொண்டுள்ளது", - "@notificationRuleContainsDisplayName": {}, - "notificationRuleContainsDisplayNameDescription": "ஒரு செய்தியில் அவற்றின் காட்சி பெயர் இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleContainsDisplayNameDescription": {}, - "notificationRuleIsRoomMention": "அறை குறிப்பு", - "@notificationRuleIsRoomMention": {}, - "notificationRuleIsRoomMentionDescription": "ஒரு அறை குறிப்பு இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleIsRoomMentionDescription": {}, - "notificationRuleRoomnotif": "அறை அறிவிப்பு", - "@notificationRuleRoomnotif": {}, - "notificationRuleRoomnotifDescription": "ஒரு செய்தியில் '@ROOM' இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleRoomnotifDescription": {}, - "notificationRuleTombstone": "கல்லறை", - "@notificationRuleTombstone": {}, - "notificationRuleTombstoneDescription": "அறை செயலிழக்கச் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleTombstoneDescription": {}, - "notificationRuleReaction": "எதிர்வினை", - "@notificationRuleReaction": {}, - "notificationRuleReactionDescription": "எதிர்வினைகளுக்கான அறிவிப்புகளை அடக்குகிறது.", - "@notificationRuleReactionDescription": {}, - "notificationRuleRoomServerAcl": "அறை சேவையகம் ACL", - "@notificationRuleRoomServerAcl": {}, - "notificationRuleRoomServerAclDescription": "அறை சேவையக அணுகல் கட்டுப்பாட்டு பட்டியல்களுக்கான (ACL) அறிவிப்புகளை அடக்குகிறது.", - "@notificationRuleRoomServerAclDescription": {}, - "notificationRuleSuppressEdits": "திருத்தங்களை அடக்கவும்", - "@notificationRuleSuppressEdits": {}, - "notificationRuleSuppressEditsDescription": "திருத்தப்பட்ட செய்திகளுக்கான அறிவிப்புகளை அடக்குகிறது.", - "@notificationRuleSuppressEditsDescription": {}, - "notificationRuleCall": "அழை", - "@notificationRuleCall": {}, - "notificationRuleCallDescription": "அழைப்புகள் பற்றி பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleCallDescription": {}, - "notificationRuleEncryptedRoomOneToOne": "மறைகுறியாக்கப்பட்ட அறை ஒன்றுக்கு ஒன்று", - "@notificationRuleEncryptedRoomOneToOne": {}, - "notificationRuleEncryptedRoomOneToOneDescription": "மறைகுறியாக்கப்பட்ட ஒன்றுக்கு ஒன்று அறைகளில் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, - "notificationRuleRoomOneToOne": "அறை ஒன்று", - "@notificationRuleRoomOneToOne": {}, - "notificationRuleRoomOneToOneDescription": "ஒருவருக்கு ஒன்று அறைகளில் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleRoomOneToOneDescription": {}, - "notificationRuleMessage": "செய்தி", - "@notificationRuleMessage": {}, - "notificationRuleMessageDescription": "பொதுவான செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleMessageDescription": {}, - "notificationRuleEncrypted": "குறியாக்கப்பட்டது", - "@notificationRuleEncrypted": {}, - "notificationRuleEncryptedDescription": "மறைகுறியாக்கப்பட்ட அறைகளில் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleEncryptedDescription": {}, - "notificationRuleJitsi": "சியோட்ச்", - "@notificationRuleJitsi": {}, - "notificationRuleJitsiDescription": "சிட்சி விட்செட் நிகழ்வுகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", - "@notificationRuleJitsiDescription": {}, - "notificationRuleServerAcl": "சேவையக ACL நிகழ்வுகளை அடக்கவும்", - "@notificationRuleServerAcl": {}, - "notificationRuleServerAclDescription": "சேவையக ACL நிகழ்வுகளுக்கான அறிவிப்புகளை அடக்குகிறது.", - "@notificationRuleServerAclDescription": {}, - "unknownPushRule": "அறியப்படாத புச் விதி '{rule}'", - "@unknownPushRule": { - "type": "String", - "placeholders": { - "rule": { - "type": "String" - } - } - }, - "sentVoiceMessage": "🎙️{duration} - {sender} இலிருந்து குரல் செய்தி", - "@sentVoiceMessage": { - "type": "String", - "placeholders": { - "sender": { - "type": "String" - }, - "duration": { - "type": "String" - } - } - }, - "deletePushRuleCanNotBeUndone": "இந்த அறிவிப்பு அமைப்பை நீங்கள் நீக்கினால், இதை செயல்தவிர்க்க முடியாது.", - "@deletePushRuleCanNotBeUndone": {}, - "more": "மேலும்", - "@more": {}, - "shareKeysWith": "விசைகளைப் பகிரவும் ...", - "@shareKeysWith": {}, - "shareKeysWithDescription": "மறைகுறியாக்கப்பட்ட அரட்டைகளில் உங்கள் செய்திகளுடன் படிக்க எந்த சாதனங்களை நம்ப வேண்டும்?", - "@shareKeysWithDescription": {}, - "allDevices": "அனைத்து சாதனங்களும்", - "@allDevices": {}, - "crossVerifiedDevicesIfEnabled": "இயக்கப்பட்டால் சரிபார்க்கப்பட்ட சாதனங்களை குறுக்கு", - "@crossVerifiedDevicesIfEnabled": {}, - "crossVerifiedDevices": "குறுக்கு சரிபார்க்கப்பட்ட சாதனங்கள்", - "@crossVerifiedDevices": {}, - "verifiedDevicesOnly": "சரிபார்க்கப்பட்ட சாதனங்கள் மட்டுமே", - "@verifiedDevicesOnly": {}, - "takeAPhoto": "புகைப்படம் எடுக்கவும்", - "@takeAPhoto": {}, - "recordAVideo": "வீடியோவைப் பதிவுசெய்க", - "@recordAVideo": {}, - "optionalMessage": "(விரும்பினால்) செய்தி ...", - "@optionalMessage": {}, - "notSupportedOnThisDevice": "இந்த சாதனத்தில் ஆதரிக்கப்படவில்லை", - "@notSupportedOnThisDevice": {}, - "enterNewChat": "புதிய அரட்டையை உள்ளிடவும்", - "@enterNewChat": {}, - "approve": "ஒப்புதல்", - "@approve": {}, - "youHaveKnocked": "நீங்கள் தட்டிவிட்டீர்கள்", - "@youHaveKnocked": {}, - "pleaseWaitUntilInvited": "அறையில் இருந்து யாராவது உங்களை அழைக்கும் வரை தயவுசெய்து இப்போது காத்திருங்கள்.", - "@pleaseWaitUntilInvited": {}, - "commandHint_logout": "உங்கள் தற்போதைய சாதனத்தை பதிவு செய்க", - "@commandHint_logout": {}, - "commandHint_logoutall": "அனைத்து செயலில் உள்ள சாதனங்களையும் அனுப்புகிறது", - "@commandHint_logoutall": {}, - "displayNavigationRail": "மொபைலில் வழிசெலுத்தல் ரெயிலைக் காட்டு", - "@displayNavigationRail": {}, - "customReaction": "தனிப்பயன் எதிர்வினை", - "@customReaction": {}, - "moreEvents": "மேலும் நிகழ்வுகள்", - "@moreEvents": {}, - "declineInvitation": "அழைப்பை நிராகரிக்கவும்", - "@declineInvitation": {} -} \ No newline at end of file + "accept": "ஏற்றுக்கொள்", + "@accept": { + "type": "String", + "placeholders": {} + }, + "about": "பற்றி", + "@about": { + "type": "String", + "placeholders": {} + }, + "sendCanceled": "அனுப்பப்பட்டது ரத்து செய்யப்பட்டது", + "chatDetails": "அரட்டை விவரங்கள்", + "@chatDetails": { + "type": "String", + "placeholders": {} + }, + "globalChatId": "உலகளாவிய அரட்டை ஐடி", + "accessAndVisibility": "அணுகல் மற்றும் தெரிவுநிலை", + "onlineKeyBackupEnabled": "நிகழ்நிலை விசை காப்புப்பிரதி இயக்கப்பட்டது", + "@onlineKeyBackupEnabled": { + "type": "String", + "placeholders": {} + }, + "recoveryKey": "மீட்பு விசை", + "setStatus": "நிலையை அமைக்கவும்", + "@setStatus": { + "type": "String", + "placeholders": {} + }, + "title": "பஞ்சுபோன்ற", + "@title": { + "description": "Title for the application", + "type": "String", + "placeholders": {} + }, + "verify": "சரிபார்க்கவும்", + "@verify": { + "type": "String", + "placeholders": {} + }, + "verifyStart": "சரிபார்ப்பைத் தொடங்கவும்", + "@verifyStart": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersion": "ஆதரிக்கப்படாத ஆண்ட்ராய்டு பதிப்பு", + "invitedBy": "{user} அழைத்தார்", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "commandHint_sendraw": "மூல சாதொபொகு ஐ அனுப்புங்கள்", + "passwordIsWrong": "நீங்கள் உள்ளிட்ட கடவுச்சொல் தவறு", + "completedKeyVerification": "{sender} நிறைவு செய்யப்பட்ட விசை சரிபார்ப்பு", + "@completedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "incomingMessages": "உள்வரும் செய்திகள்", + "password": "கடவுச்சொல்", + "@password": { + "type": "String", + "placeholders": {} + }, + "emptyChat": "வெற்று அரட்டை", + "@emptyChat": { + "type": "String", + "placeholders": {} + }, + "encrypted": "குறியாக்கப்பட்டது", + "@encrypted": { + "type": "String", + "placeholders": {} + }, + "reject": "நிராகரிக்கவும்", + "@reject": { + "type": "String", + "placeholders": {} + }, + "importNow": "இப்போது இறக்குமதி", + "changedTheChatAvatar": "{username} அரட்டை அவதாரத்தை மாற்றியது", + "@changedTheChatAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "chooseAStrongPassword": "வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க", + "@chooseAStrongPassword": { + "type": "String", + "placeholders": {} + }, + "commandHint_me": "உங்களை விவரிக்கவும்", + "@commandHint_me": { + "type": "String", + "description": "Usage hint for the command /me" + }, + "commandHint_unban": "இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரைத் தடுக்கிறது", + "@commandHint_unban": { + "type": "String", + "description": "Usage hint for the command /unban" + }, + "countParticipants": "{count} பங்கேற்பாளர்கள்", + "@countParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editDisplayname": "காட்சி பெயர் திருத்து", + "@editDisplayname": { + "type": "String", + "placeholders": {} + }, + "fileName": "கோப்பு பெயர்", + "@fileName": { + "type": "String", + "placeholders": {} + }, + "hasWithdrawnTheInvitationFor": "{targetName} க்கான அழைப்பை {username} திரும்பப் பெற்றுள்ளார்", + "@hasWithdrawnTheInvitationFor": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "removedBy": "{username} ஆல் அகற்றப்பட்டது", + "@removedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "requestPermission": "இசைவு கோருங்கள்", + "@requestPermission": { + "type": "String", + "placeholders": {} + }, + "user": "பயனர்", + "optionalRedactReason": "(விரும்பினால்) இந்த செய்தியை மாற்றியமைப்பதற்கான காரணம் ...", + "device": "சாதனம்", + "@device": { + "type": "String", + "placeholders": {} + }, + "contactHasBeenInvitedToTheGroup": "குழுவிற்கு தொடர்பு அழைக்கப்பட்டுள்ளது", + "@contactHasBeenInvitedToTheGroup": { + "type": "String", + "placeholders": {} + }, + "passphraseOrKey": "கடவுச்சொல் அல்லது மீட்பு விசை", + "@passphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "select": "தேர்ந்தெடு", + "compareEmojiMatch": "தயவுசெய்து ஈமோசிகளை ஒப்பிடுக", + "@compareEmojiMatch": { + "type": "String", + "placeholders": {} + }, + "fromTheInvitation": "அழைப்பிலிருந்து", + "@fromTheInvitation": { + "type": "String", + "placeholders": {} + }, + "help": "உதவி", + "@help": { + "type": "String", + "placeholders": {} + }, + "invited": "அழைக்கப்பட்டார்", + "@invited": { + "type": "String", + "placeholders": {} + }, + "invitedUsersOnly": "பயனர்களை மட்டுமே அழைத்தது", + "@invitedUsersOnly": { + "type": "String", + "placeholders": {} + }, + "kickedAndBanned": "🙅 {username} உதைத்து {targetName} ஐத் தடை செய்தார்", + "@kickedAndBanned": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "mention": "குறிப்பு", + "@mention": { + "type": "String", + "placeholders": {} + }, + "newVerificationRequest": "புதிய சரிபார்ப்பு கோரிக்கை!", + "@newVerificationRequest": { + "type": "String", + "placeholders": {} + }, + "shareInviteLink": "இணைப்பைப் பகிரவும்", + "pickImage": "ஒரு படத்தைத் தேர்ந்தெடுக்கவும்", + "@pickImage": { + "type": "String", + "placeholders": {} + }, + "pin": "முள்", + "@pin": { + "type": "String", + "placeholders": {} + }, + "unavailable": "கிடைக்கவில்லை", + "@unavailable": { + "type": "String", + "placeholders": {} + }, + "voiceCall": "குரல் அழைப்பு", + "youKickedAndBanned": "🙅 நீங்கள் உதைத்து தடைசெய்துள்ளீர்கள் {user}", + "@youKickedAndBanned": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youKicked": "👞 {user}ஐ உதைத்துள்ளீர்கள்", + "@youKicked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "storeInAppleKeyChain": "ஆப்பிள் கீச்சினில் சேமிக்கவும்", + "searchForUsers": "@Users ஐத் தேடுங்கள் ...", + "pleaseEnterYourCurrentPassword": "உங்கள் தற்போதைய கடவுச்சொல்லை உள்ளிடவும்", + "anyoneCanJoin": "யார் வேண்டுமானாலும் சேரலாம்", + "@anyoneCanJoin": { + "type": "String", + "placeholders": {} + }, + "archive": "காப்பகம்", + "@archive": { + "type": "String", + "placeholders": {} + }, + "banFromChat": "அரட்டையிலிருந்து தடை", + "@banFromChat": { + "type": "String", + "placeholders": {} + }, + "cancel": "ரத்துசெய்", + "@cancel": { + "type": "String", + "placeholders": {} + }, + "edit": "தொகு", + "@edit": { + "type": "String", + "placeholders": {} + }, + "iHaveClickedOnLink": "நான் இணைப்பைக் சொடுக்கு செய்துள்ளேன்", + "@iHaveClickedOnLink": { + "type": "String", + "placeholders": {} + }, + "pleaseClickOnLink": "மின்னஞ்சலில் உள்ள இணைப்பைக் சொடுக்கு செய்து தொடரவும்.", + "@pleaseClickOnLink": { + "type": "String", + "placeholders": {} + }, + "changeTheme": "உங்கள் பாணியை மாற்றவும்", + "@changeTheme": { + "type": "String", + "placeholders": {} + }, + "fontSize": "எழுத்துரு அளவு", + "@fontSize": { + "type": "String", + "placeholders": {} + }, + "cantOpenUri": "யூரி {uri} வேலை ஐ திறக்க முடியாது", + "@cantOpenUri": { + "type": "String", + "placeholders": { + "uri": { + "type": "String" + } + } + }, + "repeatPassword": "மீண்டும் கடவுச்சொல்", + "youRejectedTheInvitation": "நீங்கள் அழைப்பை நிராகரித்தீர்கள்", + "confirmMatrixId": "உங்கள் கணக்கை நீக்க உங்கள் மேட்ரிக்ச் ஐடியை உறுதிப்படுத்தவும்.", + "supposedMxid": "இது {mxid} be ஆக இருக்க வேண்டும்", + "@supposedMxid": { + "type": "String", + "placeholders": { + "mxid": { + "type": "String" + } + } + }, + "commandHint_googly": "சில கூகிள் கண்களை அனுப்பவும்", + "commandHint_cuddle": "ஒரு கசப்பு அனுப்பவும்", + "importEmojis": "ஈமோசிகளை இறக்குமதி", + "exportEmotePack": "எமோட் பேக் .zip என ஏற்றுமதி", + "replace": "மாற்று", + "tryAgain": "மீண்டும் முயற்சிக்கவும்", + "pushNotificationsNotAvailable": "புச் அறிவிப்புகள் கிடைக்கவில்லை", + "blockUsername": "பயனர்பெயரை புறக்கணிக்கவும்", + "start": "தொடங்கு", + "chatBackup": "அரட்டை காப்புப்பிரதி", + "@chatBackup": { + "type": "String", + "placeholders": {} + }, + "send": "அனுப்பு", + "@send": { + "type": "String", + "placeholders": {} + }, + "theyDontMatch": "அவர்கள் பொருந்தவில்லை", + "@theyDontMatch": { + "type": "String", + "placeholders": {} + }, + "sendMessages": "செய்திகளை அனுப்பவும்", + "@sendMessages": { + "type": "String", + "placeholders": {} + }, + "fluffychat": "பஞ்சுபோன்ற", + "@fluffychat": { + "type": "String", + "placeholders": {} + }, + "downloadFile": "கோப்பைப் பதிவிறக்கவும்", + "@downloadFile": { + "type": "String", + "placeholders": {} + }, + "createNewSpace": "புதிய இடம்", + "@createNewSpace": { + "type": "String", + "placeholders": {} + }, + "synchronizingPleaseWait": "ஒத்திசைத்தல்… தயவுசெய்து காத்திருங்கள்.", + "@synchronizingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "unknownEncryptionAlgorithm": "அறியப்படாத குறியாக்க வழிமுறை", + "@unknownEncryptionAlgorithm": { + "type": "String", + "placeholders": {} + }, + "unverified": "சரிபார்க்கப்படாதது", + "unmuteChat": "மாறுதல் அரட்டை", + "@unmuteChat": { + "type": "String", + "placeholders": {} + }, + "verifyTitle": "பிற கணக்கை சரிபார்க்கிறது", + "@verifyTitle": { + "type": "String", + "placeholders": {} + }, + "videoCall": "வீடியோ அழைப்பு", + "@videoCall": { + "type": "String", + "placeholders": {} + }, + "visibleForAllParticipants": "பங்கேற்பாளர்கள் அனைவருக்கும் தெரியும்", + "@visibleForAllParticipants": { + "type": "String", + "placeholders": {} + }, + "voiceMessage": "குரல் செய்தி", + "@voiceMessage": { + "type": "String", + "placeholders": {} + }, + "reopenChat": "அரட்டையை மீண்டும் திறக்கவும்", + "formattedMessages": "வடிவமைக்கப்பட்ட செய்திகள்", + "darkTheme": "இருண்ட", + "@darkTheme": { + "type": "String", + "placeholders": {} + }, + "guestsAreForbidden": "விருந்தினர்கள் தடைசெய்யப்பட்டுள்ளனர்", + "@guestsAreForbidden": { + "type": "String", + "placeholders": {} + }, + "guestsCanJoin": "விருந்தினர்கள் சேரலாம்", + "@guestsCanJoin": { + "type": "String", + "placeholders": {} + }, + "commandHint_invite": "கொடுக்கப்பட்ட பயனரை இந்த அறைக்கு அழைக்கவும்", + "@commandHint_invite": { + "type": "String", + "description": "Usage hint for the command /invite" + }, + "commandHint_op": "கொடுக்கப்பட்ட பயனரின் ஆற்றல் மட்டத்தை அமைக்கவும் (இயல்புநிலை: 50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "commandHint_plain": "வடிவமைக்கப்படாத உரையை அனுப்பவும்", + "@commandHint_plain": { + "type": "String", + "description": "Usage hint for the command /plain" + }, + "commandMissing": "{command} என்பது கட்டளை அல்ல.", + "@commandMissing": { + "type": "String", + "placeholders": { + "command": { + "type": "String" + } + }, + "description": "State that {command} is not a valid /command." + }, + "moderator": "மதிப்பீட்டாளர்", + "@moderator": { + "type": "String", + "placeholders": {} + }, + "shareLocation": "இருப்பிடத்தைப் பகிரவும்", + "@shareLocation": { + "type": "String", + "placeholders": {} + }, + "addEmail": "மின்னஞ்சல் சேர்க்கவும்", + "@addEmail": { + "type": "String", + "placeholders": {} + }, + "all": "அனைத்தும்", + "@all": { + "type": "String", + "placeholders": {} + }, + "lightTheme": "ஒளி", + "@lightTheme": { + "type": "String", + "placeholders": {} + }, + "allChats": "அனைத்து அரட்டைகளும்", + "@allChats": { + "type": "String", + "placeholders": {} + }, + "sendOnEnter": "Enter ஐ அனுப்பவும்", + "dehydrate": "ஏற்றுமதி அமர்வு மற்றும் சாதனத்தை துடைக்கவும்", + "ok": "சரி", + "@ok": { + "type": "String", + "placeholders": {} + }, + "configureChat": "அரட்டையை உள்ளமைக்கவும்", + "@configureChat": { + "type": "String", + "placeholders": {} + }, + "deviceId": "சாதன ஐடி", + "@deviceId": { + "type": "String", + "placeholders": {} + }, + "isTyping": "தட்டச்சு செய்கிறது…", + "@isTyping": { + "type": "String", + "placeholders": {} + }, + "joinedTheChat": "👋 {username} அரட்டையில் சேர்ந்தார்", + "@joinedTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "noConnectionToTheServer": "சேவையகத்துடன் எந்த தொடர்பும் இல்லை", + "@noConnectionToTheServer": { + "type": "String", + "placeholders": {} + }, + "noEmotesFound": "உணர்ச்சிகள் எதுவும் காணப்படவில்லை. 😕", + "@noEmotesFound": { + "type": "String", + "placeholders": {} + }, + "notifications": "அறிவிப்புகள்", + "@notifications": { + "type": "String", + "placeholders": {} + }, + "oopsPushError": "அச்சச்சோ! துரதிர்ச்டவசமாக, புச் அறிவிப்புகளை அமைக்கும் போது பிழை ஏற்பட்டது.", + "@oopsPushError": { + "type": "String", + "placeholders": {} + }, + "oopsSomethingWentWrong": "அச்சச்சோ, ஏதோ தவறு நடந்தது…", + "@oopsSomethingWentWrong": { + "type": "String", + "placeholders": {} + }, + "bundleName": "மூட்டை பெயர்", + "enableMultiAccounts": "(பீட்டா) இந்த சாதனத்தில் பல கணக்குகளை இயக்கவும்", + "remove": "அகற்று", + "@remove": { + "type": "String", + "placeholders": {} + }, + "recoveryKeyLost": "மீட்பு விசை இழந்ததா?", + "sendAMessage": "ஒரு செய்தியை அனுப்பவும்", + "@sendAMessage": { + "type": "String", + "placeholders": {} + }, + "spaceIsPublic": "இடம் பொது", + "@spaceIsPublic": { + "type": "String", + "placeholders": {} + }, + "transferFromAnotherDevice": "மற்றொரு சாதனத்திலிருந்து மாற்றவும்", + "@transferFromAnotherDevice": { + "type": "String", + "placeholders": {} + }, + "visibleForEveryone": "அனைவருக்கும் தெரியும்", + "@visibleForEveryone": { + "type": "String", + "placeholders": {} + }, + "weSentYouAnEmail": "நாங்கள் உங்களுக்கு ஒரு மின்னஞ்சல் அனுப்பினோம்", + "@weSentYouAnEmail": { + "type": "String", + "placeholders": {} + }, + "report": "அறிக்கை", + "verifyOtherDevice": "Sevice பிற சாதனத்தை சரிபார்க்கவும்", + "startedACall": "{senderName} அழைப்பைத் தொடங்கினார்", + "@startedACall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "userSentUnknownEvent": "{username} ஒரு {type} நிகழ்வை அனுப்பியது", + "@userSentUnknownEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "type": { + "type": "String" + } + } + }, + "verified": "சரிபார்க்கப்பட்டது", + "@verified": { + "type": "String", + "placeholders": {} + }, + "verifySuccess": "நீங்கள் வெற்றிகரமாக சரிபார்த்தீர்கள்!", + "@verifySuccess": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerNumbers": "பங்குதாரர் எண்களை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", + "@waitingPartnerNumbers": { + "type": "String", + "placeholders": {} + }, + "warning": "எச்சரிக்கை!", + "@warning": { + "type": "String", + "placeholders": {} + }, + "pinMessage": "அறைக்கு முள்", + "unlockOldMessages": "பழைய செய்திகளைத் திறக்கவும்", + "serverLimitReached": "சேவையக வரம்பு அடைந்தது! {seconds} விநாடிகள் காத்திருக்கிறது ...", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "acceptedKeyVerification": "{sender} ஏற்றுக்கொள்ளப்பட்ட விசை சரிபார்ப்பு", + "@acceptedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "copyToClipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கவும்", + "@copyToClipboard": { + "type": "String", + "placeholders": {} + }, + "createGroup": "குழுவை உருவாக்கவும்", + "editBundlesForAccount": "இந்த கணக்கிற்கான மூட்டைகளைத் திருத்தவும்", + "unpin": "மூள்நீக்கு", + "@unpin": { + "type": "String", + "placeholders": {} + }, + "emojis": "ஈமோசிகள்", + "jumpToLastReadMessage": "கடைசி வாசிப்பு செய்திக்கு செல்லவும்", + "commandHint_markasgroup": "குழுவாக குறி", + "commandHint_html": "உஉகுமொ வடிவமைக்கப்பட்ட உரையை அனுப்பவும்", + "@commandHint_html": { + "type": "String", + "description": "Usage hint for the command /html" + }, + "commandHint_kick": "இந்த அறையிலிருந்து கொடுக்கப்பட்ட பயனரை அகற்றவும்", + "@commandHint_kick": { + "type": "String", + "description": "Usage hint for the command /kick" + }, + "deleteMessage": "செய்தியை நீக்கு", + "@deleteMessage": { + "type": "String", + "placeholders": {} + }, + "messageInfo": "செய்தி தகவல்", + "sentAFile": "📁 {username} கோப்பை அனுப்பியுள்ளார்", + "@sentAFile": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "readUpToHere": "இங்கே படிக்கவும்", + "chatDescriptionHasBeenChanged": "அரட்டை விளக்கம் மாற்றப்பட்டது", + "reportMessage": "செய்தி அறிக்கை", + "@reportMessage": { + "type": "String", + "placeholders": {} + }, + "kickFromChat": "அரட்டையிலிருந்து கிக்", + "@kickFromChat": { + "type": "String", + "placeholders": {} + }, + "redactedAnEvent": "{username} ஒரு நிகழ்வை மறுவடிவமைத்தது", + "@redactedAnEvent": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "opacity": "ஒளிபுகாநிலை:", + "blur": "மங்கலானது:", + "setWallpaper": "வால்பேப்பரை அமைக்கவும்", + "statusExampleMessage": "இன்று நீங்கள் எப்படி இருக்கிறீர்கள்?", + "@statusExampleMessage": { + "type": "String", + "placeholders": {} + }, + "tooManyRequestsWarning": "பல கோரிக்கைகள். தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும்!", + "@tooManyRequestsWarning": { + "type": "String", + "placeholders": {} + }, + "unblockDevice": "சாதனத்தைத் தடைசெய்க", + "@unblockDevice": { + "type": "String", + "placeholders": {} + }, + "unknownDevice": "தெரியாத சாதனம்", + "@unknownDevice": { + "type": "String", + "placeholders": {} + }, + "storeSecurlyOnThisDevice": "இந்த சாதனத்தில் பாதுகாப்பாக சேமிக்கவும்", + "screenSharingTitle": "திரை பகிர்வு", + "newGroup": "புதிய குழு", + "noOtherDevicesFound": "வேறு சாதனங்கள் எதுவும் கிடைக்கவில்லை", + "sendRoomNotifications": "ஒரு @room அறிவிப்புகளை அனுப்பவும்", + "generatingVideoThumbnail": "வீடியோ சிறு உருவத்தை உருவாக்குதல் ...", + "reply": "பதில்", + "@reply": { + "type": "String", + "placeholders": {} + }, + "askSSSSSign": "மற்ற நபரில் கையெழுத்திட, தயவுசெய்து உங்கள் பாதுகாப்பான கடை பாச்ஃபிரேச் அல்லது மீட்பு விசையை உள்ளிடவும்.", + "@askSSSSSign": { + "type": "String", + "placeholders": {} + }, + "areGuestsAllowedToJoin": "விருந்தினர் பயனர்கள் சேர அனுமதிக்கப்படுகிறார்களா?", + "@areGuestsAllowedToJoin": { + "type": "String", + "placeholders": {} + }, + "areYouSureYouWantToLogout": "நீங்கள் நிச்சயமாக வெளியேற விரும்புகிறீர்களா?", + "@areYouSureYouWantToLogout": { + "type": "String", + "placeholders": {} + }, + "aboutHomeserver": "{homeserver} பற்றி", + "@aboutHomeserver": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "swipeRightToLeftToReply": "பதிலளிக்க வலமிருந்து இடமாக ச்வைப் செய்யவும்", + "unread": "படிக்காதது", + "changedTheChatDescriptionTo": "{username} பயனர்பெயர் the அரட்டை விளக்கத்தை மாற்றியது: '{description}'", + "@changedTheChatDescriptionTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "description": { + "type": "String" + } + } + }, + "dateAndTimeOfDay": "{date}, {timeOfDay}", + "@dateAndTimeOfDay": { + "type": "String", + "placeholders": { + "date": { + "type": "String" + }, + "timeOfDay": { + "type": "String" + } + } + }, + "deleteAccount": "கணக்கை நீக்கு", + "@deleteAccount": { + "type": "String", + "placeholders": {} + }, + "deviceKeys": "சாதன விசைகள்:", + "noUsersFoundWithQuery": "துரதிர்ச்டவசமாக \"{query}\" உடன் எந்த பயனரையும் காண முடியவில்லை. நீங்கள் ஒரு எழுத்துப்பிழை செய்தீர்களா என்பதை சரிபார்க்கவும்.", + "@noUsersFoundWithQuery": { + "type": "String", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "jump": "தாவு", + "yourGlobalUserIdIs": "உங்கள் உலகளாவிய பயனர் ஐடி: ", + "publicSpaces": "பொது இடங்கள்", + "discover": "கண்டுபிடி", + "commandHint_unignore": "கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை இணைக்கவும்", + "prepareSendingAttachment": "அனுப்பும் இணைப்பைத் தயாரிக்கவும் ...", + "sendingAttachment": "இணைப்பை அனுப்புகிறது ...", + "continueText": "தொடரவும்", + "welcomeText": "ஏய் ஏய் 👋 இது பஞ்சுபோன்றது. Https://matrix.org உடன் இணக்கமான எந்த ஓம்சர்வரில் நீங்கள் உள்நுழையலாம். பின்னர் யாருடனும் அரட்டையடிக்கவும். இது ஒரு பெரிய பரவலாக்கப்பட்ட செய்தியிடல் நெட்வொர்க்!", + "name": "பெயர்", + "username": "பயனர்பெயர்", + "@username": { + "type": "String", + "placeholders": {} + }, + "whoCanPerformWhichAction": "எந்த செயலைச் செய்ய முடியும்", + "@whoCanPerformWhichAction": { + "type": "String", + "placeholders": {} + }, + "whoIsAllowedToJoinThisGroup": "இந்த குழுவில் சேர யார் அனுமதிக்கப்படுகிறார்கள்", + "@whoIsAllowedToJoinThisGroup": { + "type": "String", + "placeholders": {} + }, + "youAreNoLongerParticipatingInThisChat": "இந்த அரட்டையில் நீங்கள் இனி பங்கேற்கவில்லை", + "@youAreNoLongerParticipatingInThisChat": { + "type": "String", + "placeholders": {} + }, + "yourPublicKey": "உங்கள் பொது விசை", + "@yourPublicKey": { + "type": "String", + "placeholders": {} + }, + "time": "நேரம்", + "openChat": "திறந்த அரட்டை", + "markAsRead": "படித்தபடி குறி", + "reportUser": "பயனர் புகாரளிக்கவும்", + "dismiss": "தள்ளுபடி", + "reactedWith": "{sender} {reaction} உடன் பதிலளித்தார்", + "@reactedWith": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "reaction": { + "type": "String" + } + } + }, + "placeCall": "அழைப்பு இடு", + "videoCallsBetaWarning": "வீடியோ அழைப்புகள் தற்போது பீட்டாவில் உள்ளன என்பதை நினைவில் கொள்க. அவர்கள் எதிர்பார்த்தபடி வேலை செய்யக்கூடாது அல்லது எல்லா தளங்களிலும் வேலை செய்யக்கூடாது.", + "experimentalVideoCalls": "சோதனை வீடியோ அழைப்புகள்", + "noOneCanJoin": "யாரும் சேர முடியாது", + "newSpace": "புதிய இடம்", + "wasDirectChatDisplayName": "வெற்று அரட்டை ({oldDisplayName})", + "@wasDirectChatDisplayName": { + "type": "String", + "placeholders": { + "oldDisplayName": { + "type": "String" + } + } + }, + "openLinkInBrowser": "உலாவியில் திறந்த இணைப்பை திறக்கவும்", + "reportErrorDescription": "😭 ஓ இல்லை. ஏதோ தவறு நடந்தது. நீங்கள் விரும்பினால், இந்த பிழையை டெவலப்பர்களிடம் புகாரளிக்கலாம்.", + "invite": "அழைக்கவும்", + "wrongPinEntered": "தவறான முள் நுழைந்தது! {seconds} விநாடிகளில் மீண்டும் முயற்சிக்கவும் ...", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "தயவுசெய்து 0 ஐ விட அதிகமான எண்ணை உள்ளிடவும்", + "kickUserDescription": "பயனர் அரட்டையிலிருந்து வெளியேற்றப்படுகிறார், ஆனால் தடை செய்யப்படவில்லை. பொது அரட்டைகளில், பயனர் எந்த நேரத்திலும் மீண்டும் சேரலாம்.", + "learnMore": "மேலும் அறிக", + "chatCanBeDiscoveredViaSearchOnServer": "{server}", + "@chatCanBeDiscoveredViaSearchOnServer": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "knockRestricted": "நாக் தடை", + "bannedUser": "{username} தடைசெய்யப்பட்ட {targetName}", + "@bannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "blockDevice": "தொகுதி சாதனம்", + "@blockDevice": { + "type": "String", + "placeholders": {} + }, + "blocked": "தடுக்கப்பட்டது", + "@blocked": { + "type": "String", + "placeholders": {} + }, + "changeDeviceName": "சாதனத்தின் பெயரை மாற்றவும்", + "@changeDeviceName": { + "type": "String", + "placeholders": {} + }, + "changedTheDisplaynameTo": "{username} அவற்றின் காட்சி பெயர்: '{displayname}'", + "@changedTheDisplaynameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "displayname": { + "type": "String" + } + } + }, + "changedTheGuestAccessRules": "{username} விருந்தினர் அணுகல் விதிகளை மாற்றியது", + "@changedTheGuestAccessRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheProfileAvatar": "{username} அவர்களின் அவதாரத்தை மாற்றியது", + "@changedTheProfileAvatar": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheRoomAliases": "{username} அறை மாற்றுப்பெயர்களை மாற்றியது", + "@changedTheRoomAliases": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changeTheNameOfTheGroup": "குழுவின் பெயரை மாற்றவும்", + "@changeTheNameOfTheGroup": { + "type": "String", + "placeholders": {} + }, + "chats": "அரட்டைகள்", + "@chats": { + "type": "String", + "placeholders": {} + }, + "clearArchive": "தெளிவான காப்பகம்", + "close": "மூடு", + "@close": { + "type": "String", + "placeholders": {} + }, + "commandHint_create": "வெற்று குழு அரட்டையை உருவாக்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்", + "@commandHint_create": { + "type": "String", + "description": "Usage hint for the command /create" + }, + "compareNumbersMatch": "எண்களை ஒப்பிடுக", + "@compareNumbersMatch": { + "type": "String", + "placeholders": {} + }, + "copiedToClipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்டது", + "@copiedToClipboard": { + "type": "String", + "placeholders": {} + }, + "copy": "நகலெடு", + "@copy": { + "type": "String", + "placeholders": {} + }, + "couldNotDecryptMessage": "செய்தியை மறைகுறியாக்க முடியவில்லை: {error}", + "@couldNotDecryptMessage": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "create": "உருவாக்கு", + "@create": { + "type": "String", + "placeholders": {} + }, + "chatPermissions": "அரட்டை அனுமதிகள்", + "editRoomAliases": "அறை மாற்றுப்பெயர்களைத் திருத்து", + "@editRoomAliases": { + "type": "String", + "placeholders": {} + }, + "editRoomAvatar": "அறை அவதார் திருத்து", + "@editRoomAvatar": { + "type": "String", + "placeholders": {} + }, + "forward": "முன்னோக்கி", + "@forward": { + "type": "String", + "placeholders": {} + }, + "fromJoining": "சேருவதிலிருந்து", + "@fromJoining": { + "type": "String", + "placeholders": {} + }, + "groupWith": "{displayname} உடன் குழு", + "@groupWith": { + "type": "String", + "placeholders": { + "displayname": { + "type": "String" + } + } + }, + "hideRedactedMessages": "சரிசெய்யப்பட்ட செய்திகளை மறைக்கவும்", + "hideRedactedMessagesBody": "யாராவது ஒரு செய்தியை மாற்றியமைத்தால், இந்த செய்தி இனி அரட்டையில் காணப்படாது.", + "howOffensiveIsThisContent": "இந்த உள்ளடக்கம் எவ்வளவு ஆபத்தானது?", + "@howOffensiveIsThisContent": { + "type": "String", + "placeholders": {} + }, + "inoffensive": "செயலற்றது", + "@inoffensive": { + "type": "String", + "placeholders": {} + }, + "inviteContact": "தொடர்பை அழைக்கவும்", + "@inviteContact": { + "type": "String", + "placeholders": {} + }, + "kicked": "👞 {username} {targetName} ஐ உதைத்தார்", + "@kicked": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "lastActiveAgo": "கடைசியாக செயலில்: {localizedTimeShort}", + "@lastActiveAgo": { + "type": "String", + "placeholders": { + "localizedTimeShort": { + "type": "String" + } + } + }, + "leftTheChat": "அரட்டையை விட்டு வெளியேறினார்", + "@leftTheChat": { + "type": "String", + "placeholders": {} + }, + "loadCountMoreParticipants": "ஏற்றவும் {count} மேலும் பங்கேற்பாளர்கள்", + "@loadCountMoreParticipants": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dehydrateWarning": "இந்த செயலை செயல்தவிர்க்க முடியாது. காப்புப்பிரதி கோப்பை பாதுகாப்பாக சேமித்து வைக்கவும்.", + "loadMore": "மேலும் ஏற்றவும்…", + "@loadMore": { + "type": "String", + "placeholders": {} + }, + "logout": "வெளியேற்றம்", + "@logout": { + "type": "String", + "placeholders": {} + }, + "messagesStyle": "செய்திகள்:", + "needPantalaimonWarning": "இப்போதைக்கு இறுதி முதல் இறுதி குறியாக்கத்தைப் பயன்படுத்த உங்களுக்கு பாண்டலாயமன் தேவை என்பதை நினைவில் கொள்க.", + "@needPantalaimonWarning": { + "type": "String", + "placeholders": {} + }, + "newMessageInFluffyChat": "Fuf பஞ்சுபோன்ற புதிய செய்தி", + "@newMessageInFluffyChat": { + "type": "String", + "placeholders": {} + }, + "noEncryptionForPublicRooms": "அறை இனி பகிரங்கமாக அணுக முடியாதவுடன் மட்டுமே நீங்கள் குறியாக்கத்தை செயல்படுத்த முடியும்.", + "@noEncryptionForPublicRooms": { + "type": "String", + "placeholders": {} + }, + "noMatrixServer": "{server1} என்பது மேட்ரிக்ஸ் சர்வர் இல்லை, அதற்கு பதிலாக {server2} ஐ பயன்படுத்தவா?", + "@noMatrixServer": { + "type": "String", + "placeholders": { + "server1": { + "type": "String" + }, + "server2": { + "type": "String" + } + } + }, + "noPermission": "இசைவு இல்லை", + "@noPermission": { + "type": "String", + "placeholders": {} + }, + "noRoomsFound": "அறைகள் எதுவும் கிடைக்கவில்லை…", + "@noRoomsFound": { + "type": "String", + "placeholders": {} + }, + "numUsersTyping": "{count} பயனர்கள் தட்டச்சு செய்கிறார்கள்…", + "@numUsersTyping": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "offensive": "தாக்குதல்", + "@offensive": { + "type": "String", + "placeholders": {} + }, + "openCamera": "திறந்த கேமரா", + "@openCamera": { + "type": "String", + "placeholders": {} + }, + "addAccount": "கணக்கைச் சேர்க்கவும்", + "openInMaps": "வரைபடங்களில் திறந்திருக்கும்", + "@openInMaps": { + "type": "String", + "placeholders": {} + }, + "link": "இணைப்பு", + "serverRequiresEmail": "இந்த சேவையகம் பதிவுக்கு உங்கள் மின்னஞ்சல் முகவரியை சரிபார்க்க வேண்டும்.", + "passwordForgotten": "கடவுச்சொல் மறந்துவிட்டது", + "@passwordForgotten": { + "type": "String", + "placeholders": {} + }, + "passwordHasBeenChanged": "கடவுச்சொல் மாற்றப்பட்டுள்ளது", + "@passwordHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "pleaseChooseAPasscode": "பாச் குறியீட்டைத் தேர்வுசெய்க", + "@pleaseChooseAPasscode": { + "type": "String", + "placeholders": {} + }, + "publicRooms": "பொது அறைகள்", + "@publicRooms": { + "type": "String", + "placeholders": {} + }, + "removeAllOtherDevices": "மற்ற எல்லா சாதனங்களையும் அகற்றவும்", + "@removeAllOtherDevices": { + "type": "String", + "placeholders": {} + }, + "roomHasBeenUpgraded": "அறை மேம்படுத்தப்பட்டுள்ளது", + "@roomHasBeenUpgraded": { + "type": "String", + "placeholders": {} + }, + "roomVersion": "அறை பதிப்பு", + "@roomVersion": { + "type": "String", + "placeholders": {} + }, + "saveFile": "கோப்பை சேமி", + "@saveFile": { + "type": "String", + "placeholders": {} + }, + "sentAnAudio": "🎤 {username} ஆடியோவை அனுப்பியுள்ளார்", + "@sentAnAudio": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAPicture": "🖼️ {username} படத்தை அனுப்பியுள்ளார்", + "@sentAPicture": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentAVideo": "🎥 {username} ஒரு வீடியோவை அனுப்பியுள்ளார்", + "@sentAVideo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "settings": "அமைப்புகள்", + "@settings": { + "type": "String", + "placeholders": {} + }, + "sharedTheLocation": "{username} அவற்றின் இருப்பிடத்தைப் பகிர்ந்து கொண்டது", + "@sharedTheLocation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "showPassword": "கடவுச்சொல்லைக் காட்டு", + "@showPassword": { + "type": "String", + "placeholders": {} + }, + "submit": "சமர்ப்பிக்கவும்", + "@submit": { + "type": "String", + "placeholders": {} + }, + "tryToSendAgain": "மீண்டும் அனுப்ப முயற்சிக்கவும்", + "@tryToSendAgain": { + "type": "String", + "placeholders": {} + }, + "sendTypingNotifications": "தட்டச்சு அறிவிப்புகளை அனுப்பவும்", + "enterAnEmailAddress": "மின்னஞ்சல் முகவரியை உள்ளிடவும்", + "@enterAnEmailAddress": { + "type": "String", + "placeholders": {} + }, + "blockListDescription": "உங்களை தொந்தரவு செய்யும் பயனர்களைத் தடுக்கலாம். உங்கள் தனிப்பட்ட தொகுதி பட்டியலில் பயனர்களிடமிருந்து எந்த செய்திகளையும் அல்லது அறை அழைப்புகளையும் நீங்கள் பெற முடியாது.", + "incorrectPassphraseOrKey": "தவறான கடவுச்சொல் அல்லது மீட்பு விசை", + "@incorrectPassphraseOrKey": { + "type": "String", + "placeholders": {} + }, + "loadingPleaseWait": "ஏற்றுகிறது… தயவுசெய்து காத்திருங்கள்.", + "@loadingPleaseWait": { + "type": "String", + "placeholders": {} + }, + "no": "இல்லை", + "@no": { + "type": "String", + "placeholders": {} + }, + "youHaveBeenBannedFromThisChat": "இந்த அரட்டையிலிருந்து உங்களுக்கு தடை விதிக்கப்பட்டுள்ளது", + "@youHaveBeenBannedFromThisChat": { + "type": "String", + "placeholders": {} + }, + "messageType": "செய்தி வகை", + "databaseMigrationTitle": "தரவுத்தளம் உகந்ததாக உள்ளது", + "usersMustKnock": "பயனர்கள் தட்ட வேண்டும்", + "allSpaces": "அனைத்து இடங்களும்", + "importFromZipFile": ".சிப் கோப்பிலிருந்து இறக்குமதி", + "activatedEndToEndEncryption": "{username} இறுதி குறியாக்கத்திற்கு செயல்படுத்தப்பட்ட முடிவு", + "@activatedEndToEndEncryption": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "addToSpace": "விண்வெளியில் சேர்க்கவும்", + "commandHint_hug": "கட்டிப்பிடிக்கவும்", + "cuddleContent": "{senderName} பெயர் you உங்களை கசக்குகிறது", + "@cuddleContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "hugContent": "{senderName} உங்களை அணைத்துக்கொள்கிறது", + "@hugContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "appLock": "பயன்பாட்டு பூட்டு", + "@appLock": { + "type": "String", + "placeholders": {} + }, + "appLockDescription": "முள் குறியீட்டைக் கொண்டு பயன்படுத்தாதபோது பயன்பாட்டைப் பூட்டவும்", + "googlyEyesContent": "{senderName} உங்களுக்கு கூகிள் கண்களை அனுப்புகிறது", + "@googlyEyesContent": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "areYouSure": "நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "@areYouSure": { + "type": "String", + "placeholders": {} + }, + "askVerificationRequest": "{username}பயனர்பெயர் இருந்து இலிருந்து இந்த சரிபார்ப்பு கோரிக்கையை ஏற்றுக்கொள்ளவா?", + "@askVerificationRequest": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "autoplayImages": "அனிமேசன் செய்யப்பட்ட ச்டிக்கர்கள் மற்றும் உணர்ச்சிகளை தானாக இயக்கவும்", + "@autoplayImages": { + "type": "String", + "placeholder": {} + }, + "badServerLoginTypesException": "உள்நாட்டு வகைகளை ஓம்சர்வர் ஆதரிக்கிறது:\n {serverVersions}\n ஆனால் இந்த பயன்பாடு மட்டுமே ஆதரிக்கிறது:\n {supportedVersions}", + "@badServerLoginTypesException": { + "type": "String", + "placeholders": { + "serverVersions": { + "type": "String" + }, + "supportedVersions": { + "type": "String" + } + } + }, + "noChatsFoundHere": "இங்கே அரட்டைகள் எதுவும் காணப்படவில்லை. கீழே உள்ள பொத்தானைப் பயன்படுத்தி ஒருவருடன் புதிய அரட்டையைத் தொடங்கவும். ⤵️", + "space": "இடைவெளி", + "banned": "தடைசெய்யப்பட்டது", + "@banned": { + "type": "String", + "placeholders": {} + }, + "changedTheChatNameTo": "{username} அரட்டை பெயரை மாற்றியது: '{chatname}'", + "@changedTheChatNameTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "chatname": { + "type": "String" + } + } + }, + "changedTheHistoryVisibilityTo": "{username} வரலாற்று தெரிவுநிலையை மாற்றியது: {rules}", + "@changedTheHistoryVisibilityTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheJoinRules": "{username} சேர விதிகளை மாற்றியது", + "@changedTheJoinRules": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheJoinRulesTo": "{username} சேர விதிகளை மாற்றியது: {joinRules}", + "@changedTheJoinRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "joinRules": { + "type": "String" + } + } + }, + "changedTheRoomInvitationLink": "{username} அழைப்பிதழ் இணைப்பை மாற்றியது", + "@changedTheRoomInvitationLink": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changePassword": "கடவுச்சொல்லை மாற்றவும்", + "@changePassword": { + "type": "String", + "placeholders": {} + }, + "changeTheHomeserver": "ஓம்சர்வரை மாற்றவும்", + "@changeTheHomeserver": { + "type": "String", + "placeholders": {} + }, + "changeYourAvatar": "உங்கள் அவதாரத்தை மாற்றவும்", + "@changeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "channelCorruptedDecryptError": "குறியாக்கம் சிதைந்துள்ளது", + "@channelCorruptedDecryptError": { + "type": "String", + "placeholders": {} + }, + "chat": "அரட்டை", + "@chat": { + "type": "String", + "placeholders": {} + }, + "yourChatBackupHasBeenSetUp": "உங்கள் அரட்டை காப்புப்பிரதி அமைக்கப்பட்டுள்ளது.", + "chatBackupDescription": "உங்கள் செய்திகள் மீட்பு விசையுடன் பாதுகாக்கப்பட்டுள்ளன. தயவு செய்து அதை இழக்காமல் பார்த்துக் கொள்ளுங்கள்.", + "@chatBackupDescription": { + "type": "String", + "placeholders": {} + }, + "commandHint_markasdm": "கொடுக்கப்பட்ட மேட்ரிக்சிற்கான நேரடி செய்தி அறையாக குறிக்கவும்", + "commandHint_ban": "கொடுக்கப்பட்ட பயனரை இந்த அறையிலிருந்து தடை செய்யுங்கள்", + "@commandHint_ban": { + "type": "String", + "description": "Usage hint for the command /ban" + }, + "commandHint_clearcache": "தெளிவான தற்காலிக சேமிப்பு", + "@commandHint_clearcache": { + "type": "String", + "description": "Usage hint for the command /clearcache" + }, + "commandHint_discardsession": "அமர்வை நிராகரிக்கவும்", + "@commandHint_discardsession": { + "type": "String", + "description": "Usage hint for the command /discardsession" + }, + "commandHint_myroomavatar": "இந்த அறைக்கு உங்கள் படத்தை அமைக்கவும் (mxc-uri எழுதியது)", + "@commandHint_myroomavatar": { + "type": "String", + "description": "Usage hint for the command /myroomavatar" + }, + "commandHint_myroomnick": "இந்த அறைக்கு உங்கள் காட்சி பெயரை அமைக்கவும்", + "@commandHint_myroomnick": { + "type": "String", + "description": "Usage hint for the command /myroomnick" + }, + "commandInvalid": "கட்டளை தவறானது", + "@commandInvalid": { + "type": "String" + }, + "contentHasBeenReported": "உள்ளடக்கம் சேவையக நிர்வாகிகளுக்கு தெரிவிக்கப்பட்டுள்ளது", + "@contentHasBeenReported": { + "type": "String", + "placeholders": {} + }, + "createdTheChat": "💬 {username} அரட்டையை உருவாக்கினார்", + "@createdTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "currentlyActive": "தற்போது செயலில் உள்ளது", + "@currentlyActive": { + "type": "String", + "placeholders": {} + }, + "deactivateAccountWarning": "இது உங்கள் பயனர் கணக்கை செயலிழக்கச் செய்யும். இதை செயல்தவிர்க்க முடியாது! நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "@deactivateAccountWarning": { + "type": "String", + "placeholders": {} + }, + "defaultPermissionLevel": "புதிய பயனர்களுக்கான இயல்புநிலை இசைவு நிலை", + "@defaultPermissionLevel": { + "type": "String", + "placeholders": {} + }, + "delete": "நீக்கு", + "@delete": { + "type": "String", + "placeholders": {} + }, + "devices": "சாதனங்கள்", + "@devices": { + "type": "String", + "placeholders": {} + }, + "directChats": "நேரடி அரட்டைகள்", + "@directChats": { + "type": "String", + "placeholders": {} + }, + "displaynameHasBeenChanged": "காட்சி பெயர் மாற்றப்பட்டுள்ளது", + "@displaynameHasBeenChanged": { + "type": "String", + "placeholders": {} + }, + "editBlockedServers": "தடுக்கப்பட்ட சேவையகங்களைத் திருத்து", + "@editBlockedServers": { + "type": "String", + "placeholders": {} + }, + "emoteExists": "எமோட் ஏற்கனவே உள்ளது!", + "@emoteExists": { + "type": "String", + "placeholders": {} + }, + "emoteInvalid": "தவறான எமோட் சார்ட்கோட்!", + "@emoteInvalid": { + "type": "String", + "placeholders": {} + }, + "emoteKeyboardNoRecents": "அண்மைக் காலத்தில் பயன்படுத்தப்பட்ட உணர்ச்சிகள் இங்கே தோன்றும் ...", + "@emoteKeyboardNoRecents": { + "type": "String", + "placeholders": {} + }, + "emotePacks": "அறைக்கு எமோட் பொதிகள்", + "@emotePacks": { + "type": "String", + "placeholders": {} + }, + "emoteSettings": "எமோட் அமைப்புகள்", + "@emoteSettings": { + "type": "String", + "placeholders": {} + }, + "accessAndVisibilityDescription": "இந்த அரட்டையில் யார் சேர அனுமதிக்கப்படுகிறார்கள், அரட்டையை எவ்வாறு கண்டுபிடிப்பது.", + "calls": "அழைப்புகள்", + "customEmojisAndStickers": "தனிப்பயன் ஈமோசிகள் மற்றும் ச்டிக்கர்கள்", + "customEmojisAndStickersBody": "எந்தவொரு அரட்டையிலும் பயன்படுத்தக்கூடிய தனிப்பயன் ஈமோசிகள் அல்லது ச்டிக்கர்களைச் சேர்க்கவும் அல்லது பகிரவும்.", + "emoteShortcode": "சார்ட்கோட் எமோட்", + "@emoteShortcode": { + "type": "String", + "placeholders": {} + }, + "enableEmotesGlobally": "உலகளவில் எமோட் பேக்கை இயக்கவும்", + "@enableEmotesGlobally": { + "type": "String", + "placeholders": {} + }, + "enableEncryption": "குறியாக்கத்தை இயக்கவும்", + "@enableEncryption": { + "type": "String", + "placeholders": {} + }, + "enableEncryptionWarning": "நீங்கள் இனி குறியாக்கத்தை முடக்க முடியாது. நீங்கள் உறுதியாக இருக்கிறீர்களா?", + "@enableEncryptionWarning": { + "type": "String", + "placeholders": {} + }, + "encryptionNotEnabled": "குறியாக்கம் இயக்கப்படவில்லை", + "@encryptionNotEnabled": { + "type": "String", + "placeholders": {} + }, + "encryption": "குறியாக்கம்", + "@encryption": { + "type": "String", + "placeholders": {} + }, + "endedTheCall": "{senderName} அழைப்பை முடித்தார்", + "@endedTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "homeserver": "ஓம்சர்வர்", + "errorObtainingLocation": "இருப்பிடத்தைப் பெறுவதில் பிழை: {error}", + "@errorObtainingLocation": { + "type": "String", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "everythingReady": "எல்லாம் தயாராக!", + "@everythingReady": { + "type": "String", + "placeholders": {} + }, + "extremeOffensive": "மிகவும் தாக்குதல்", + "@extremeOffensive": { + "type": "String", + "placeholders": {} + }, + "group": "குழு", + "@group": { + "type": "String", + "placeholders": {} + }, + "chatDescription": "அரட்டை விளக்கம்", + "groupIsPublic": "குழு பொது", + "@groupIsPublic": { + "type": "String", + "placeholders": {} + }, + "hideRedactedEvents": "திருத்தப்பட்ட நிகழ்வுகளை மறைக்கவும்", + "@hideRedactedEvents": { + "type": "String", + "placeholders": {} + }, + "hideInvalidOrUnknownMessageFormats": "தவறான அல்லது அறியப்படாத செய்தி வடிவங்களை மறைக்கவும்", + "id": "ஐடி", + "@id": { + "type": "String", + "placeholders": {} + }, + "block": "தொகுதி", + "inviteContactToGroup": "{groupName} க்கு தொடர்பை அழை", + "@inviteContactToGroup": { + "type": "String", + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "noChatDescriptionYet": "அரட்டை விளக்கம் இதுவரை உருவாக்கப்படவில்லை.", + "invalidServerName": "தவறான சேவையக பெயர்", + "redactMessageDescription": "இந்த உரையாடலில் பங்கேற்பாளர்கள் அனைவருக்கும் செய்தி திருத்தப்படும். இதை செயல்தவிர்க்க முடியாது.", + "invitedUser": "📩 {username} {targetName} அழைக்கப்பட்டார்", + "@invitedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "inviteText": "{username} உங்களை பஞ்சுபோன்றதாக அழைத்தது.\n 1. FulufyChat.im ஐப் பார்வையிட்டு பயன்பாட்டை நிறுவவும்\n 2. பதிவு செய்யுங்கள் அல்லது உள்நுழைக\n 3. அழைப்பிதழ் இணைப்பைத் திறக்கவும்:\n {link}", + "@inviteText": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "link": { + "type": "String" + } + } + }, + "joinRoom": "அறையில் சேரவும்", + "@joinRoom": { + "type": "String", + "placeholders": {} + }, + "leave": "விடுப்பு", + "@leave": { + "type": "String", + "placeholders": {} + }, + "hydrate": "காப்பு கோப்பிலிருந்து மீட்டமைக்கவும்", + "locationDisabledNotice": "இருப்பிட சேவைகள் முடக்கப்பட்டுள்ளன. தயவுசெய்து உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள அவர்களுக்கு உதவவும்.", + "@locationDisabledNotice": { + "type": "String", + "placeholders": {} + }, + "locationPermissionDeniedNotice": "இருப்பிட இசைவு மறுக்கப்பட்டது. உங்கள் இருப்பிடத்தைப் பகிர்ந்து கொள்ள தயவுசெய்து அவர்களுக்கு வழங்குங்கள்.", + "@locationPermissionDeniedNotice": { + "type": "String", + "placeholders": {} + }, + "login": "புகுபதிவு", + "@login": { + "type": "String", + "placeholders": {} + }, + "logInTo": "{homeserver} இல் உள்நுழைக", + "@logInTo": { + "type": "String", + "placeholders": { + "homeserver": { + "type": "String" + } + } + }, + "messages": "செய்திகள்", + "@messages": { + "type": "String", + "placeholders": {} + }, + "muteChat": "முடக்கு அரட்டை", + "@muteChat": { + "type": "String", + "placeholders": {} + }, + "newChat": "புதிய அரட்டை", + "@newChat": { + "type": "String", + "placeholders": {} + }, + "next": "அடுத்தது", + "@next": { + "type": "String", + "placeholders": {} + }, + "none": "எதுவுமில்லை", + "@none": { + "type": "String", + "placeholders": {} + }, + "noPasswordRecoveryDescription": "உங்கள் கடவுச்சொல்லை மீட்டெடுப்பதற்கான வழியை நீங்கள் இன்னும் சேர்க்கவில்லை.", + "@noPasswordRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "openAppToReadMessages": "செய்திகளைப் படிக்க பயன்பாட்டைத் திறக்கவும்", + "@openAppToReadMessages": { + "type": "String", + "placeholders": {} + }, + "oneClientLoggedOut": "உங்கள் வாடிக்கையாளர்களில் ஒருவர் உள்நுழைந்துள்ளார்", + "addToBundle": "மூட்டையில் சேர்க்கவும்", + "or": "அல்லது", + "@or": { + "type": "String", + "placeholders": {} + }, + "overview": "கண்ணோட்டம்", + "passwordRecoverySettings": "கடவுச்சொல் மீட்பு அமைப்புகள்", + "passwordRecovery": "கடவுச்சொல் மீட்பு", + "@passwordRecovery": { + "type": "String", + "placeholders": {} + }, + "play": "{fileName} இயக்கு", + "@play": { + "type": "String", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "pleaseEnter4Digits": "பயன்பாட்டு பூட்டை முடக்க 4 இலக்கங்களை உள்ளிடவும் அல்லது காலியாக விடவும்.", + "@pleaseEnter4Digits": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPassword": "உங்கள் கடவுச்சொல்லை உள்ளிடவும்", + "@pleaseEnterYourPassword": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourPin": "உங்கள் முள் உள்ளிடவும்", + "@pleaseEnterYourPin": { + "type": "String", + "placeholders": {} + }, + "pleaseEnterYourUsername": "உங்கள் பயனர்பெயரை உள்ளிடவும்", + "@pleaseEnterYourUsername": { + "type": "String", + "placeholders": {} + }, + "pleaseFollowInstructionsOnWeb": "வலைத்தளத்தின் வழிமுறைகளைப் பின்பற்றி அடுத்து தட்டவும்.", + "@pleaseFollowInstructionsOnWeb": { + "type": "String", + "placeholders": {} + }, + "privacy": "தனியுரிமை", + "@privacy": { + "type": "String", + "placeholders": {} + }, + "reason": "காரணம்", + "@reason": { + "type": "String", + "placeholders": {} + }, + "redactedByBecause": "{username} ஆல் திருத்தப்பட்டது ஏனெனில்: \"{reason}\"", + "@redactedByBecause": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "reason": { + "type": "String" + } + } + }, + "register": "பதிவு செய்யுங்கள்", + "@register": { + "type": "String", + "placeholders": {} + }, + "rejectedTheInvitation": "{username} அழைப்பை நிராகரித்தது", + "@rejectedTheInvitation": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "unbanFromChat": "அரட்டையிலிருந்து தடையின்றி", + "@unbanFromChat": { + "type": "String", + "placeholders": {} + }, + "removeYourAvatar": "உங்கள் அவதாரத்தை அகற்று", + "@removeYourAvatar": { + "type": "String", + "placeholders": {} + }, + "replaceRoomWithNewerVersion": "புதிய பதிப்போடு அறையை மாற்றவும்", + "@replaceRoomWithNewerVersion": { + "type": "String", + "placeholders": {} + }, + "sendAsText": "உரையாக அனுப்பவும்", + "@sendAsText": { + "type": "String" + }, + "sendAudio": "ஆடியோ அனுப்பவும்", + "@sendAudio": { + "type": "String", + "placeholders": {} + }, + "sendImage": "படத்தை அனுப்பு", + "@sendImage": { + "type": "String", + "placeholders": {} + }, + "sendImages": "{count} படத்தை அனுப்பு", + "@sendImages": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "sendVideo": "வீடியோ அனுப்பவும்", + "@sendVideo": { + "type": "String", + "placeholders": {} + }, + "sentASticker": "😊 {username} ஒரு ச்டிக்கரை அனுப்பியது", + "@sentASticker": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "sentCallInformations": "{senderName} அனுப்பப்பட்ட அழைப்பு செய்தி", + "@sentCallInformations": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "setAsCanonicalAlias": "முதன்மையான மாற்றுப்பெயராக அமைக்கவும்", + "@setAsCanonicalAlias": { + "type": "String", + "placeholders": {} + }, + "setChatDescription": "அரட்டை விளக்கத்தை அமைக்கவும்", + "share": "பங்கு", + "@share": { + "type": "String", + "placeholders": {} + }, + "presencesToggle": "பிற பயனர்களிடமிருந்து நிலை செய்திகளைக் காட்டு", + "@presencesToggle": { + "type": "String", + "placeholders": {} + }, + "skip": "தவிர்", + "@skip": { + "type": "String", + "placeholders": {} + }, + "sourceCode": "மூலக் குறியீடு", + "@sourceCode": { + "type": "String", + "placeholders": {} + }, + "spaceName": "விண்வெளி பெயர்", + "@spaceName": { + "type": "String", + "placeholders": {} + }, + "status": "நிலை", + "@status": { + "type": "String", + "placeholders": {} + }, + "systemTheme": "மண்டலம்", + "@systemTheme": { + "type": "String", + "placeholders": {} + }, + "theyMatch": "அவர்கள் பொருந்துகிறார்கள்", + "@theyMatch": { + "type": "String", + "placeholders": {} + }, + "unbannedUser": "{username} தடைசெய்யப்படாத {targetName}", + "@unbannedUser": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "targetName": { + "type": "String" + } + } + }, + "unknownEvent": "அறியப்படாத நிகழ்வு '{type}'", + "@unknownEvent": { + "type": "String", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "userAndOthersAreTyping": "{username} மற்றும் {count} மற்றவர்கள் தட்டச்சு செய்கிறார்கள்…", + "@userAndOthersAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "userIsTyping": "{username} தட்டச்சு செய்கிறது…", + "@userIsTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "waitingPartnerAcceptRequest": "கூட்டாளர் கோரிக்கையை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", + "@waitingPartnerAcceptRequest": { + "type": "String", + "placeholders": {} + }, + "waitingPartnerEmoji": "பங்குதாரர் ஈமோசியை ஏற்றுக்கொள்வதற்காக காத்திருக்கிறார்…", + "@waitingPartnerEmoji": { + "type": "String", + "placeholders": {} + }, + "sender": "அனுப்புநர்", + "openGallery": "திறந்த கேலரி", + "whyDoYouWantToReportThis": "இதை ஏன் புகாரளிக்க விரும்புகிறீர்கள்?", + "@whyDoYouWantToReportThis": { + "type": "String", + "placeholders": {} + }, + "wipeChatBackup": "புதிய மீட்பு விசையை உருவாக்க உங்கள் அரட்டை காப்புப்பிரதியைத் துடைக்கவா?", + "@wipeChatBackup": { + "type": "String", + "placeholders": {} + }, + "withTheseAddressesRecoveryDescription": "இந்த முகவரிகள் மூலம் உங்கள் கடவுச்சொல்லை மீட்டெடுக்கலாம்.", + "@withTheseAddressesRecoveryDescription": { + "type": "String", + "placeholders": {} + }, + "writeAMessage": "ஒரு செய்தியை எழுதுங்கள்…", + "@writeAMessage": { + "type": "String", + "placeholders": {} + }, + "yes": "ஆம்", + "@yes": { + "type": "String", + "placeholders": {} + }, + "removeFromSpace": "இடத்திலிருந்து அகற்று", + "pleaseEnterRecoveryKeyDescription": "உங்கள் பழைய செய்திகளைத் திறக்க, முந்தைய அமர்வில் உருவாக்கப்பட்ட உங்கள் மீட்பு விசையை உள்ளிடவும். உங்கள் மீட்பு விசை உங்கள் கடவுச்சொல் அல்ல.", + "confirmEventUnpin": "நிகழ்வை நிரந்தரமாக அவிழ்ப்பது உறுதி?", + "youJoinedTheChat": "நீங்கள் அரட்டையில் சேர்ந்தீர்கள்", + "youAcceptedTheInvitation": "👍 நீங்கள் அழைப்பை ஏற்றுக்கொண்டீர்கள்", + "youBannedUser": "நீங்கள் {user} தடை செய்தீர்கள்", + "@youBannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youHaveWithdrawnTheInvitationFor": "{user}க்கான அழைப்பை திரும்பப் பெற்றுவிட்டீர்கள்", + "@youHaveWithdrawnTheInvitationFor": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedBy": "📩 நீங்கள் {user} ஆல் அழைக்கப்பட்டுள்ளீர்கள்", + "@youInvitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youInvitedUser": "📩 {user} ஐ அழைத்தீர்கள்", + "@youInvitedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "youUnbannedUser": "நீங்கள் {user} தடைசெய்யவில்லை", + "@youUnbannedUser": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user} தட்டியது", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "knock": "தட்டவும்", + "users": "பயனர்கள்", + "storeInSecureStorageDescription": "மீட்பு விசையை இந்த சாதனத்தின் பாதுகாப்பான சேமிப்பகத்தில் சேமிக்கவும்.", + "saveKeyManuallyDescription": "கணினி பகிர்வு உரையாடல் அல்லது கிளிப்போர்டைத் தூண்டுவதன் மூலம் இந்த விசையை கைமுறையாக சேமிக்கவும்.", + "storeInAndroidKeystore": "ஆண்ட்ராய்டு கீச்டோரில் சேமிக்கவும்", + "countFiles": "{count} கோப்புகள்", + "@countFiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "custom": "தனிப்பயன்", + "foregroundServiceRunning": "முன்புற பணி இயங்கும்போது இந்த அறிவிப்பு தோன்றும்.", + "screenSharingDetail": "உங்கள் திரையை FuffyChat இல் பகிர்கிறீர்கள்", + "whyIsThisMessageEncrypted": "இந்த செய்தி ஏன் படிக்க முடியாதது?", + "noKeyForThisMessage": "இந்த சாதனத்தில் உங்கள் கணக்கில் கையொப்பமிடுவதற்கு முன்பு செய்தி அனுப்பப்பட்டால் இது நிகழலாம்.\n\n அனுப்புநர் உங்கள் சாதனத்தைத் தடுத்துள்ளார் அல்லது இணைய இணைப்பில் ஏதேனும் தவறு ஏற்பட்டுள்ளது.\n\n மற்றொரு அமர்வில் செய்தியைப் படிக்க முடியுமா? அதிலிருந்து செய்தியை மாற்றலாம்! அமைப்புகள்> சாதனங்களுக்குச் சென்று, உங்கள் சாதனங்கள் ஒருவருக்கொருவர் சரிபார்த்துள்ளன என்பதை உறுதிப்படுத்தவும். அடுத்த முறை நீங்கள் அறையைத் திறக்கும்போது, இரண்டு அமர்வுகளும் முன்னணியில் இருக்கும்போது, விசைகள் தானாகவே அனுப்பப்படும்.\n\n வெளியேறும்போது அல்லது சாதனங்களை மாற்றும்போது விசைகளை இழக்க நீங்கள் விரும்பவில்லையா? அமைப்புகளில் அரட்டை காப்புப்பிரதியை நீங்கள் இயக்கியுள்ளீர்கள் என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்.", + "hidePresences": "நிலை பட்டியலை மறைக்கவா?", + "doNotShowAgain": "மீண்டும் காட்ட வேண்டாம்", + "newSpaceDescription": "உங்கள் அரட்டைகளை ஒருங்கிணைத்து தனியார் அல்லது பொது சமூகங்களை உருவாக்க இடைவெளிகள் உங்களை அனுமதிக்கிறது.", + "disableEncryptionWarning": "பாதுகாப்பு காரணங்களுக்காக நீங்கள் ஒரு அரட்டையில் குறியாக்கத்தை முடக்க முடியாது, அது இதற்கு முன்பு இயக்கப்பட்டிருக்கிறது.", + "sorryThatsNotPossible": "மன்னிக்கவும் ... அது சாத்தியமில்லை", + "noBackupWarning": "எச்சரிக்கை! அரட்டை காப்புப்பிரதியை இயக்காமல், உங்கள் மறைகுறியாக்கப்பட்ட செய்திகளுக்கான அணுகலை இழப்பீர்கள். வெளியேறுவதற்கு முன் முதலில் அரட்டை காப்புப்பிரதியை இயக்க மிகவும் பரிந்துரைக்கப்படுகிறது.", + "fileIsTooBigForServer": "அனுப்ப முடியவில்லை! சேவையகம் {max} வரை இணைப்புகளை மட்டுமே ஆதரிக்கிறது.", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "கோப்பு {path}", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "inviteGroupChat": "📨 குழு அரட்டை அழைப்பு", + "invalidInput": "தவறான உள்ளீடு!", + "archiveRoomDescription": "அரட்டை காப்பகத்திற்கு நகர்த்தப்படும். மற்ற பயனர்கள் நீங்கள் அரட்டையை விட்டுவிட்டீர்கள் என்பதைக் காண முடியும்.", + "removeDevicesDescription": "நீங்கள் இந்த சாதனத்திலிருந்து வெளியேறுவீர்கள், இனி செய்திகளைப் பெற முடியாது.", + "banUserDescription": "பயனர் அரட்டையிலிருந்து தடைசெய்யப்படுவார், மேலும் அவை தடைசெய்யப்படாத வரை மீண்டும் அரட்டையில் நுழைய முடியாது.", + "makeAdminDescription": "இந்த பயனர் நிர்வாகியை நீங்கள் செய்தவுடன், இதை நீங்கள் செயல்தவிர்க்க முடியாமல் போகலாம், ஏனெனில் அவை உங்களைப் போன்ற அதே அனுமதிகளைக் கொண்டிருக்கும்.", + "knocking": "தட்டுதல்", + "searchChatsRooms": "#Chats, Us பயனர்களைத் தேடுங்கள் ...", + "nothingFound": "எதுவும் கிடைக்கவில்லை ...", + "groupName": "குழு பெயர்", + "createGroupAndInviteUsers": "ஒரு குழுவை உருவாக்கி பயனர்களை அழைக்கவும்", + "groupCanBeFoundViaSearch": "தேடல் வழியாக குழுவை காணலாம்", + "wrongRecoveryKey": "மன்னிக்கவும் ... இது சரியான மீட்பு விசையாகத் தெரியவில்லை.", + "databaseMigrationBody": "தயவுசெய்து காத்திருங்கள். இது ஒரு கணம் ஆகலாம்.", + "newPassword": "புதிய கடவுச்சொல்", + "pleaseChooseAStrongPassword": "வலுவான கடவுச்சொல்லைத் தேர்வுசெய்க", + "passwordsDoNotMatch": "கடவுச்சொற்கள் பொருந்தவில்லை", + "joinSpace": "விண்வெளியில் சேரவும்", + "addChatOrSubSpace": "அரட்டை அல்லது துணை இடத்தைச் சேர்க்கவும்", + "initAppError": "பயன்பாட்டைத் தொடங்கும்போது பிழை ஏற்பட்டது", + "sessionLostBody": "உங்கள் அமர்வு தொலைந்துவிட்டது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", + "@sessionLostBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendTypingNotificationsDescription": "அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு புதிய செய்தியைத் தட்டச்சு செய்யும் போது காணலாம்.", + "sendReadReceiptsDescription": "அரட்டையில் பங்கேற்பாளர்கள் நீங்கள் ஒரு செய்தியைப் படிக்கும்போது பார்க்கலாம்.", + "formattedMessagesDescription": "மார்க் டவுனைப் பயன்படுத்தி தைரியமான உரை போன்ற பணக்கார செய்தி உள்ளடக்கத்தைக் காண்பி.", + "verifyOtherUser": "Poser மற்ற பயனரை சரிபார்க்கவும்", + "verifyOtherUserDescription": "நீங்கள் மற்றொரு பயனரைச் சரிபார்த்தால், நீங்கள் உண்மையில் யாருக்கு எழுதுகிறீர்கள் என்பது உங்களுக்குத் தெரியும் என்பதை நீங்கள் உறுதியாக நம்பலாம். 💪\n\nநீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, நீங்களும் மற்ற பயனரும் பயன்பாட்டில் ஒரு பாப்அப்பைக் காண்பீர்கள். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள்.\n\nஇதைச் செய்வதற்கான சிறந்த வழி வீடியோ அழைப்பைச் சந்திப்பது அல்லது தொடங்குவது. 👭", + "verifyOtherDeviceDescription": "நீங்கள் மற்றொரு சாதனத்தைச் சரிபார்க்கும்போது, அந்தச் சாதனங்கள் விசைகளைப் பரிமாறிக்கொள்ளலாம், உங்கள் ஒட்டுமொத்த பாதுகாப்பை அதிகரிக்கும். 💪 நீங்கள் ஒரு சரிபார்ப்பைத் தொடங்கும்போது, இரண்டு சாதனங்களிலும் பயன்பாட்டில் ஒரு பாப்அப் தோன்றும். நீங்கள் ஒருவருக்கொருவர் ஒப்பிட வேண்டிய தொடர்ச்சியான ஈமோசிகள் அல்லது எண்களைக் காண்பீர்கள். நீங்கள் சரிபார்ப்பைத் தொடங்குவதற்கு முன்பு இரண்டு சாதனங்களையும் எளிதில் வைத்திருப்பது நல்லது. 🤳", + "canceledKeyVerification": "{sender} ரத்து செய்யப்பட்ட விசை சரிபார்ப்பு", + "@canceledKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "isReadyForKeyVerification": "விசை சரிபார்ப்பிற்கு {sender} தயாராக உள்ளார்", + "@isReadyForKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "requestedKeyVerification": "{sender} கோரப்பட்ட விசை சரிபார்ப்பு", + "@requestedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "transparent": "வெளிப்படையானது", + "stickers": "ச்டிக்கர்கள்", + "commandHint_ignore": "கொடுக்கப்பட்ட மேட்ரிக்ச் ஐடியை புறக்கணிக்கவும்", + "unreadChatsInApp": "{appname}: {unread} படிக்காத அரட்டைகள்", + "@unreadChatsInApp": { + "type": "String", + "placeholders": { + "appname": { + "type": "String" + }, + "unread": { + "type": "String" + } + } + }, + "thereAreCountUsersBlocked": "இப்போது {count} பயனர்கள் தடுக்கப்பட்டுள்ளனர்.", + "@thereAreCountUsersBlocked": { + "type": "String", + "count": {} + }, + "restricted": "தடைசெய்யப்பட்டது", + "moderatorLevel": "{level} - மதிப்பீட்டாளர்", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - நிர்வாகி", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "பொது அரட்டை அமைப்புகளை மாற்றவும்", + "inviteOtherUsers": "இந்த அரட்டைக்கு மற்ற பயனர்களை அழைக்கவும்", + "changeTheChatPermissions": "அரட்டை அனுமதிகளை மாற்றவும்", + "changeTheVisibilityOfChatHistory": "அரட்டை வரலாற்றின் தெரிவுநிலையை மாற்றவும்", + "changeTheCanonicalRoomAlias": "முக்கிய பொது அரட்டை முகவரியை மாற்றவும்", + "changeTheDescriptionOfTheGroup": "அரட்டையின் விளக்கத்தை மாற்றவும்", + "chatPermissionsDescription": "இந்த அரட்டையில் சில செயல்களுக்கு எந்த ஆற்றல் நிலை தேவை என்பதை வரையறுக்கவும். 0, 50 மற்றும் 100 ஆற்றல் நிலைகள் பொதுவாக பயனர்கள், மதிப்பீட்டாளர்கள் மற்றும் நிர்வாகிகளைக் குறிக்கின்றன, ஆனால் எந்த தரமும் சாத்தியமாகும்.", + "updateInstalled": "🎉 புதுப்பிப்பு {version} நிறுவப்பட்டது!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "மாற்றபதிவு", + "calculatingFileSize": "கோப்பு அளவைக் கணக்கிடுகிறது ...", + "compressVideo": "அமைக்கும் வீடியோ ...", + "sendingAttachmentCountOfCount": "{length} இன் இணைப்பு {index}ஐ அனுப்புகிறது...", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "உங்கள் சாதனங்களில் ஒன்று சரிபார்க்கப்படவில்லை", + "noticeChatBackupDeviceVerification": "குறிப்பு: உங்கள் எல்லா சாதனங்களையும் அரட்டை காப்புப்பிரதியுடன் இணைக்கும்போது, அவை தானாகவே சரிபார்க்கப்படும்.", + "manageAccount": "கணக்கை நிர்வகிக்கவும்", + "noContactInformationProvided": "சேவையகம் எந்த சரியான தொடர்பு தகவலையும் வழங்காது", + "contactServerAdmin": "சேவையக நிர்வாகி தொடர்பு", + "contactServerSecurity": "சேவையக பாதுகாப்பைத் தொடர்பு கொள்ளுங்கள்", + "supportPage": "உதவி பக்கம்", + "serverInformation": "சேவையக தகவல்:", + "version": "பதிப்பு", + "website": "வலைத்தளம்", + "compress": "சுருக்க", + "alwaysUse24HourFormat": "தவறு", + "@alwaysUse24HourFormat": { + "description": "Set to true to always display time of day in 24 hour format." + }, + "admin": "நிர்வாகி", + "@admin": { + "type": "String", + "placeholders": {} + }, + "alias": "மாற்றுப்பெயர்", + "@alias": { + "type": "String", + "placeholders": {} + }, + "answeredTheCall": "{senderName} அழைப்புக்கு பதிலளித்தார்", + "@answeredTheCall": { + "type": "String", + "placeholders": { + "senderName": { + "type": "String" + } + } + }, + "commandHint_react": "ஒரு எதிர்வினையாக பதிலை அனுப்பவும்", + "@commandHint_react": { + "type": "String", + "description": "Usage hint for the command /react" + }, + "commandHint_send": "உரையை அனுப்பவும்", + "@commandHint_send": { + "type": "String", + "description": "Usage hint for the command /send" + }, + "removeFromBundle": "இந்த மூட்டையிலிருந்து அகற்றவும்", + "pushRules": "தள்ளி விதிகள்", + "@pushRules": { + "type": "String", + "placeholders": {} + }, + "recording": "பதிவு", + "@recording": { + "type": "String", + "placeholders": {} + }, + "redactedBy": "{username} ஆல் திருத்தப்பட்டது", + "@redactedBy": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "directChat": "நேரடி அரட்டை", + "redactMessage": "திருத்தும் செய்தி", + "@redactMessage": { + "type": "String", + "placeholders": {} + }, + "userAndUserAreTyping": "{username} மற்றும் {username2} தட்டச்சு செய்கின்றன…", + "@userAndUserAreTyping": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "username2": { + "type": "String" + } + } + }, + "userLeftTheChat": "🚪 {username} அரட்டையை விட்டு வெளியேறினார்", + "@userLeftTheChat": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "visibilityOfTheChatHistory": "அரட்டை வரலாற்றின் தெரிவுநிலை", + "@visibilityOfTheChatHistory": { + "type": "String", + "placeholders": {} + }, + "you": "நீங்கள்", + "@you": { + "type": "String", + "placeholders": {} + }, + "unsupportedAndroidVersionLong": "இந்த அம்சத்திற்கு புதிய ஆண்ட்ராய்டு பதிப்பு தேவைப்படுகிறது. புதுப்பிப்புகள் அல்லது பரம்பரை OS ஆதரவை சரிபார்க்கவும்.", + "setColorTheme": "வண்ண கருப்பொருள் அமைக்கவும்:", + "roomUpgradeDescription": "அரட்டை பின்னர் புதிய அறை பதிப்பில் மீண்டும் உருவாக்கப்படும். பங்கேற்பாளர்கள் அனைவருக்கும் புதிய அரட்டைக்கு மாற வேண்டும் என்று அறிவிக்கப்படும். அறை பதிப்புகள் பற்றி மேலும் அறிய https://spec.matrix.org/latest/rooms/", + "account": "கணக்கு", + "@account": { + "type": "String", + "placeholders": {} + }, + "groups": "குழுக்கள்", + "@groups": { + "type": "String", + "placeholders": {} + }, + "blockedUsers": "தடுக்கப்பட்ட பயனர்கள்", + "leaveEmptyToClearStatus": "உங்கள் நிலையை அழிக்க காலியாக விடவும்.", + "thisDevice": "இந்த சாதனம்:", + "gallery": "கேலரி", + "files": "கோப்புகள்", + "noDatabaseEncryption": "இந்த மேடையில் தரவுத்தள குறியாக்கம் ஆதரிக்கப்படவில்லை", + "goToSpace": "விண்வெளிக்குச் செல்லுங்கள்: {space}", + "@goToSpace": { + "type": "String", + "space": {} + }, + "markAsUnread": "படிக்காத எனக் குறிக்கவும்", + "userLevel": "{level} - பயனர்", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "notAnImage": "படக் கோப்பு அல்ல.", + "encryptThisChat": "இந்த அரட்டையை குறியாக்கவும்", + "publicChatAddresses": "பொது அரட்டை முகவரிகள்", + "createNewAddress": "புதிய முகவரியை உருவாக்கவும்", + "boldText": "தைரியமான உரை", + "italicText": "சாய்வு உரை", + "strikeThrough": "ச்ட்ரைகெத்ரோ", + "pleaseFillOut": "தயவுசெய்து நிரப்பவும்", + "invalidUrl": "தவறான முகவரி", + "addLink": "இணைப்பைச் சேர்க்கவும்", + "searchIn": "அரட்டையில் தேடு \"{chat}\" ...", + "@searchIn": { + "type": "String", + "placeholders": { + "chat": { + "type": "String" + } + } + }, + "searchMore": "மேலும் தேடுங்கள் ...", + "startedKeyVerification": "{sender} விசை சரிபார்ப்பைத் தொடங்கினார்", + "@startedKeyVerification": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + } + } + }, + "loginWithMatrixId": "மேட்ரிக்ச்-ஐடியுடன் உள்நுழைக", + "doesNotSeemToBeAValidHomeserver": "இணக்கமான ஓம்சர்வர் என்று தெரியவில்லை. தவறான URL?", + "noMoreChatsFound": "இனி அரட்டைகள் கிடைக்கவில்லை ...", + "spaces": "இடங்கள்", + "changedTheChatPermissions": "{username} அரட்டை அனுமதிகளை மாற்றியுள்ளார்", + "@changedTheChatPermissions": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "changedTheGuestAccessRulesTo": "{username} விருந்தினர் அணுகல் விதிகளை மாற்றியது: {rules}", + "@changedTheGuestAccessRulesTo": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + }, + "rules": { + "type": "String" + } + } + }, + "changedTheHistoryVisibility": "{username} வரலாற்று தெரிவுநிலையை மாற்றியது", + "@changedTheHistoryVisibility": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "commandHint_join": "கொடுக்கப்பட்ட அறையில் சேரவும்", + "@commandHint_join": { + "type": "String", + "description": "Usage hint for the command /join" + }, + "commandHint_dm": "நேரடி அரட்டையைத் தொடங்கவும்\n குறியாக்கத்தை முடக்க-இல்லை-குறியாக்கத்தைப் பயன்படுத்தவும்", + "@commandHint_dm": { + "type": "String", + "description": "Usage hint for the command /dm" + }, + "commandHint_leave": "இந்த அறையை விட்டு விடுங்கள்", + "@commandHint_leave": { + "type": "String", + "description": "Usage hint for the command /leave" + }, + "unbanUserDescription": "அவர்கள் முயற்சித்தால் பயனர் மீண்டும் அரட்டையை உள்ளிட முடியும்.", + "restoreSessionBody": "ஆப்ஸ் இப்போது உங்கள் அமர்வை காப்புப்பிரதியிலிருந்து மீட்டெடுக்க முயற்சிக்கிறது. {url} இல் டெவலப்பர்களிடம் இந்தப் பிழையைப் புகாரளிக்கவும். பிழை செய்தி: {error}", + "@restoreSessionBody": { + "type": "String", + "placeholders": { + "url": { + "type": "String" + }, + "error": { + "type": "String" + } + } + }, + "sendReadReceipts": "வாசிப்பு ரசீதுகளை அனுப்பவும்", + "unableToJoinChat": "அரட்டையில் சேர முடியவில்லை. ஒருவேளை மற்ற கட்சி ஏற்கனவே உரையாடலை மூடியிருக்கலாம்.", + "noGoogleServicesWarning": "ஃபயர்பேச் முகில் செய்தி உங்கள் சாதனத்தில் கிடைக்கவில்லை. இன்னும் புச் அறிவிப்புகளைப் பெற, ntfy ஐ நிறுவப் பரிந்துரைக்கிறோம். ntfy அல்லது மற்றொரு ஒருங்கிணைந்த புச் வழங்குநருடன் நீங்கள் தரவு பாதுகாப்பான வழியில் புச் அறிவிப்புகளைப் பெறலாம். நீங்கள் பிளேச்டோரிலிருந்து அல்லது எஃப்-டிராய்டிலிருந்து ntfy ஐ பதிவிறக்கம் செய்யலாம்.", + "@noGoogleServicesWarning": { + "type": "String", + "placeholders": {} + }, + "scanQrCode": "QR குறியீட்டை ச்கேன் செய்யுங்கள்", + "obtainingLocation": "இருப்பிடத்தைப் பெறுதல்…", + "@obtainingLocation": { + "type": "String", + "placeholders": {} + }, + "offline": "இணையமில்லாமல்", + "@offline": { + "type": "String", + "placeholders": {} + }, + "online": "ஆன்லைனில்", + "@online": { + "type": "String", + "placeholders": {} + }, + "participant": "பங்கேற்பாளர்", + "@participant": { + "type": "String", + "placeholders": {} + }, + "search": "தேடல்", + "@search": { + "type": "String", + "placeholders": {} + }, + "security": "பாதுகாப்பு", + "@security": { + "type": "String", + "placeholders": {} + }, + "sendFile": "கோப்பு அனுப்பவும்", + "@sendFile": { + "type": "String", + "placeholders": {} + }, + "ignoreUser": "பயனரைப் புறக்கணி", + "commandHint_roomupgrade": "கொடுக்கப்பட்ட அறை பதிப்பிற்கு இந்த அறையை மேம்படுத்தவும்", + "checkList": "சரிபார்ப்பு பட்டியல்", + "countInvited": "{count} அழைக்கப்பட்டது", + "@countInvited": { + "type": "String", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "synchronizingPleaseWaitCounter": " ஒத்திசைத்தல்… ({percentage}%)", + "@synchronizingPleaseWaitCounter": { + "type": "String", + "placeholders": { + "percentage": { + "type": "String" + } + } + }, + "previous": "முந்தைய", + "otherPartyNotLoggedIn": "மற்ற கட்சி தற்போது உள்நுழைந்திருக்கவில்லை, எனவே செய்திகளைப் பெற முடியாது!", + "appWantsToUseForLogin": "உள்நுழைய '{server}' ஐப் பயன்படுத்தவும்", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "appWantsToUseForLoginDescription": "உங்களைப் பற்றிய தகவல்களைப் பகிர பயன்பாடு மற்றும் வலைத்தளத்தை இதன்மூலம் அனுமதிக்கிறீர்கள்.", + "open": "திற", + "waitingForServer": "சேவையகத்திற்காக காத்திருக்கிறது ...", + "newChatRequest": "அரட்டை கோரிக்கை", + "contentNotificationSettings": "உள்ளடக்க அறிவிப்பு அமைப்புகள்", + "generalNotificationSettings": "பொது அறிவிப்பு அமைப்புகள்", + "roomNotificationSettings": "அறை அறிவிப்பு அமைப்புகள்", + "userSpecificNotificationSettings": "பயனர் குறிப்பிட்ட அறிவிப்பு அமைப்புகள்", + "otherNotificationSettings": "பிற அறிவிப்பு அமைப்புகள்", + "notificationRuleContainsUserName": "பயனர் பெயரைக் கொண்டுள்ளது", + "notificationRuleContainsUserNameDescription": "ஒரு செய்தியில் அவற்றின் பயனர்பெயர் இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleMaster": "அனைத்து அறிவிப்புகளையும் முடக்குகிறது", + "notificationRuleMasterDescription": "மற்ற எல்லா விதிகளையும் மீறி அனைத்து அறிவிப்புகளையும் முடக்குகிறது.", + "notificationRuleSuppressNotices": "தானியங்கு செய்திகளை அடக்கவும்", + "notificationRuleSuppressNoticesDescription": "போட்ச் போன்ற தானியங்கி வாடிக்கையாளர்களிடமிருந்து அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleInviteForMe": "எனக்கு அழைக்கவும்", + "notificationRuleInviteForMeDescription": "ஒரு அறைக்கு அழைக்கப்படும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleMemberEvent": "உறுப்பினர் நிகழ்வு", + "notificationRuleMemberEventDescription": "உறுப்பினர் நிகழ்வுகளுக்கான அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleIsUserMention": "பயனர் குறிப்பு", + "notificationRuleIsUserMentionDescription": "ஒரு செய்தியில் நேரடியாக குறிப்பிடப்படும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleContainsDisplayName": "காட்சி பெயரைக் கொண்டுள்ளது", + "notificationRuleContainsDisplayNameDescription": "ஒரு செய்தியில் அவற்றின் காட்சி பெயர் இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleIsRoomMention": "அறை குறிப்பு", + "notificationRuleIsRoomMentionDescription": "ஒரு அறை குறிப்பு இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleRoomnotif": "அறை அறிவிப்பு", + "notificationRuleRoomnotifDescription": "ஒரு செய்தியில் '@room' இருக்கும்போது பயனருக்கு அறிவிக்கிறது.", + "notificationRuleTombstone": "கல்லறை", + "notificationRuleTombstoneDescription": "அறை செயலிழக்கச் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleReaction": "எதிர்வினை", + "notificationRuleReactionDescription": "எதிர்வினைகளுக்கான அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleRoomServerAcl": "அறை சேவையகம் ACL", + "notificationRuleRoomServerAclDescription": "அறை சேவையக அணுகல் கட்டுப்பாட்டு பட்டியல்களுக்கான (ACL) அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleSuppressEdits": "திருத்தங்களை அடக்கவும்", + "notificationRuleSuppressEditsDescription": "திருத்தப்பட்ட செய்திகளுக்கான அறிவிப்புகளை அடக்குகிறது.", + "notificationRuleCall": "அழை", + "notificationRuleCallDescription": "அழைப்புகள் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleEncryptedRoomOneToOne": "மறைகுறியாக்கப்பட்ட அறை ஒன்றுக்கு ஒன்று", + "notificationRuleEncryptedRoomOneToOneDescription": "மறைகுறியாக்கப்பட்ட ஒன்றுக்கு ஒன்று அறைகளில் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleRoomOneToOne": "அறை ஒன்று", + "notificationRuleRoomOneToOneDescription": "ஒருவருக்கு ஒன்று அறைகளில் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleMessage": "செய்தி", + "notificationRuleMessageDescription": "பொதுவான செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleEncrypted": "குறியாக்கப்பட்டது", + "notificationRuleEncryptedDescription": "மறைகுறியாக்கப்பட்ட அறைகளில் செய்திகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleJitsi": "சியோட்ச்", + "notificationRuleJitsiDescription": "சிட்சி விட்செட் நிகழ்வுகளைப் பற்றி பயனருக்கு அறிவிக்கிறது.", + "notificationRuleServerAcl": "சேவையக ACL நிகழ்வுகளை அடக்கவும்", + "notificationRuleServerAclDescription": "சேவையக ACL நிகழ்வுகளுக்கான அறிவிப்புகளை அடக்குகிறது.", + "unknownPushRule": "அறியப்படாத புச் விதி '{rule}'", + "@unknownPushRule": { + "type": "String", + "placeholders": { + "rule": { + "type": "String" + } + } + }, + "sentVoiceMessage": "🎙️{duration} - {sender} இலிருந்து குரல் செய்தி", + "@sentVoiceMessage": { + "type": "String", + "placeholders": { + "sender": { + "type": "String" + }, + "duration": { + "type": "String" + } + } + }, + "deletePushRuleCanNotBeUndone": "இந்த அறிவிப்பு அமைப்பை நீங்கள் நீக்கினால், இதை செயல்தவிர்க்க முடியாது.", + "more": "மேலும்", + "shareKeysWith": "விசைகளைப் பகிரவும் ...", + "shareKeysWithDescription": "மறைகுறியாக்கப்பட்ட அரட்டைகளில் உங்கள் செய்திகளுடன் படிக்க எந்த சாதனங்களை நம்ப வேண்டும்?", + "allDevices": "அனைத்து சாதனங்களும்", + "crossVerifiedDevicesIfEnabled": "இயக்கப்பட்டால் சரிபார்க்கப்பட்ட சாதனங்களை குறுக்கு", + "crossVerifiedDevices": "குறுக்கு சரிபார்க்கப்பட்ட சாதனங்கள்", + "verifiedDevicesOnly": "சரிபார்க்கப்பட்ட சாதனங்கள் மட்டுமே", + "takeAPhoto": "புகைப்படம் எடுக்கவும்", + "recordAVideo": "வீடியோவைப் பதிவுசெய்க", + "optionalMessage": "(விரும்பினால்) செய்தி ...", + "notSupportedOnThisDevice": "இந்த சாதனத்தில் ஆதரிக்கப்படவில்லை", + "enterNewChat": "புதிய அரட்டையை உள்ளிடவும்", + "approve": "ஒப்புதல்", + "youHaveKnocked": "நீங்கள் தட்டிவிட்டீர்கள்", + "pleaseWaitUntilInvited": "அறையில் இருந்து யாராவது உங்களை அழைக்கும் வரை தயவுசெய்து இப்போது காத்திருங்கள்.", + "commandHint_logout": "உங்கள் தற்போதைய சாதனத்தை பதிவு செய்க", + "commandHint_logoutall": "அனைத்து செயலில் உள்ள சாதனங்களையும் அனுப்புகிறது", + "displayNavigationRail": "மொபைலில் வழிசெலுத்தல் ரெயிலைக் காட்டு", + "customReaction": "தனிப்பயன் எதிர்வினை", + "moreEvents": "மேலும் நிகழ்வுகள்", + "declineInvitation": "அழைப்பை நிராகரிக்கவும்", + "changedTheChatDescription": "{username} அரட்டை விளக்கத்தை மாற்றியுள்ளார்", + "changedTheChatName": "{username} அரட்டை பெயரை மாற்றியுள்ளார்", + "noMessagesYet": "இதுவரை செய்திகள் இல்லை", + "longPressToRecordVoiceMessage": "குரல் செய்தியை பதிவு செய்ய நீண்ட நேரம் அழுத்தவும்.", + "pause": "இடைநிறுத்தம்", + "resume": "ரெச்யூம்", + "removeFromSpaceDescription": "அரட்டை ச்பேசிலிருந்து அகற்றப்படும், ஆனால் உங்கள் அரட்டைப் பட்டியலில் தொடர்ந்து தோன்றும்.", + "countChats": "{chats} பூனைகள்", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "{spaces} இன் விண்வெளி உறுப்பினர்", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "{spaces} இன் ச்பேச் உறுப்பினர் தட்டலாம்", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "donate": "நன்கொடை", + "startedAPoll": "{username} ஒரு வாக்கெடுப்பைத் தொடங்கினார்.", + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "poll": "கருத்துக்கணிப்பு", + "startPoll": "வாக்கெடுப்பைத் தொடங்கவும்", + "endPoll": "முடிவு வாக்கெடுப்பு", + "answersVisible": "பதில்கள் தெரியும்", + "pollQuestion": "கருத்துக்கணிப்பு கேள்வி", + "answerOption": "பதில் விருப்பம்", + "addAnswerOption": "பதில் விருப்பத்தைச் சேர்க்கவும்", + "allowMultipleAnswers": "பல பதில்களை அனுமதிக்கவும்", + "pollHasBeenEnded": "கருத்துக்கணிப்பு முடிந்தது", + "countVotes": "{count, plural, =1{வாக்கு} other{{count} வாக்குகள்}}", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "answersWillBeVisibleWhenPollHasEnded": "வாக்கெடுப்பு முடிந்ததும் பதில்கள் தெரியும்", + "replyInThread": "இழையில் பதிலளிக்கவும்", + "countReplies": "{count, plural, =1{பதில்} other{{count} பதில்கள்}}", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "நூல்", + "backToMainChat": "முதன்மை அரட்டைக்குத் திரும்பு", + "saveChanges": "மாற்றங்களைச் சேமிக்கவும்", + "createSticker": "ச்டிக்கர் அல்லது ஈமோசியை உருவாக்கவும்", + "useAsSticker": "ச்டிக்கராக பயன்படுத்தவும்", + "useAsEmoji": "ஈமோசியாக பயன்படுத்தவும்", + "stickerPackNameAlreadyExists": "ச்டிக்கர் பேக் பெயர் ஏற்கனவே உள்ளது", + "newStickerPack": "புதிய ச்டிக்கர் பேக்", + "stickerPackName": "ச்டிக்கர் பேக் பெயர்", + "attribution": "பண்புக்கூறு", + "skipChatBackup": "அரட்டை காப்புப்பிரதியைத் தவிர்க்கவும்", + "skipChatBackupWarning": "நீங்கள் உறுதியாக இருக்கிறீர்களா? அரட்டை காப்புப்பிரதியை இயக்காமல், உங்கள் சாதனத்தை மாற்றினால், உங்கள் செய்திகளுக்கான அணுகலை இழக்க நேரிடும்.", + "loadingMessages": "செய்திகளை ஏற்றுகிறது", + "setupChatBackup": "அரட்டை காப்புப்பிரதியை அமைக்கவும்", + "noMoreResultsFound": "மேலும் முடிவுகள் கிடைக்கவில்லை", + "chatSearchedUntil": "அரட்டை {time} வரை தேடப்பட்டது", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "கூட்டமைப்பு அடிப்படை முகவரி", + "clientWellKnownInformation": "வாடிக்கையாளர் நன்கு அறியப்பட்ட தகவல்:", + "baseUrl": "அடிப்படை முகவரி", + "identityServer": "அடையாள சேவையகம்:", + "versionWithNumber": "பதிப்பு: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "பதிவுகள்", + "advancedConfigs": "மேம்பட்ட கட்டமைப்புகள்", + "advancedConfigurations": "மேம்பட்ட கட்டமைப்புகள்", + "signIn": "விடுபதிகை", + "createNewAccount": "புதிய கணக்கை உருவாக்கவும்", + "signUpGreeting": "FluffyChat பரவலாக்கப்பட்டது! உங்கள் கணக்கை உருவாக்க விரும்பும் சேவையகத்தைத் தேர்ந்தெடுத்து, செல்லலாம்!", + "signInGreeting": "உங்களிடம் ஏற்கனவே அணி இல் கணக்கு உள்ளதா? மீண்டும் வருக! உங்கள் ஓம் சர்வரைத் தேர்ந்தெடுத்து உள்நுழையவும்.", + "appIntro": "FluffyChat மூலம் நீங்கள் உங்கள் நண்பர்களுடன் அரட்டையடிக்கலாம். இது ஒரு பாதுகாப்பான பரவலாக்கப்பட்ட [மேட்ரிக்ச்] தூதுவர்! நீங்கள் விரும்பினால் https://matrix.org இல் மேலும் அறியவும் அல்லது பதிவு செய்யவும்.", + "theProcessWasCanceled": "செயல்முறை ரத்து செய்யப்பட்டது.", + "join": "சேருங்கள்", + "searchOrEnterHomeserverAddress": "ஓம்சர்வர் முகவரியைத் தேடவும் அல்லது உள்ளிடவும்", + "matrixId": "மேட்ரிக்ச் அடையாளம்", + "setPowerLevel": "ஆற்றல் அளவை அமைக்கவும்", + "makeModerator": "மதிப்பீட்டாளராக ஆக்குங்கள்", + "makeAdmin": "நிர்வாகியாக்கு", + "removeModeratorRights": "மதிப்பீட்டாளர் உரிமைகளை அகற்று", + "removeAdminRights": "நிர்வாகி உரிமைகளை அகற்று", + "powerLevel": "ஆற்றல் நிலை", + "setPowerLevelDescription": "இந்த அறையில் ஒரு உறுப்பினர் என்ன செய்ய அனுமதிக்கப்படுகிறார் என்பதை அதிகார நிலைகள் வரையறுக்கின்றன மற்றும் பொதுவாக 0 முதல் 100 வரை இருக்கும்.", + "owner": "உரிமையாளர்", + "mute": "முடக்கு", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "புதிய அரட்டையை உருவாக்கு" +} From d1c96b1c45e889c3a615e0a45d8998fd7e785fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m=2E?= Date: Mon, 9 Mar 2026 06:39:33 +0100 Subject: [PATCH 248/333] chore(translations): Translated using Weblate (Galician) Currently translated at 100.0% (747 of 747 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/ --- lib/l10n/intl_gl.arb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index 50c54302..13fa86d8 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -2787,5 +2787,10 @@ "removeAdminRights": "Retirar permiso de administración", "powerLevel": "Nivel responsabilidade", "setPowerLevelDescription": "Os niveis de responsabilidade definen o que pode facer unha usuaria na sala, normalmente varía de 0 a 100.", - "owner": "Propietaria" -} \ No newline at end of file + "owner": "Propietaria", + "mute": "Acalar", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Crear nova conversa" +} From 657143b3b6066c389eeaa0e50b661847b4932c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 9 Mar 2026 18:18:47 +0100 Subject: [PATCH 249/333] chore(translations): Translated using Weblate (Estonian) Currently translated at 100.0% (747 of 747 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/ --- lib/l10n/intl_et.arb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index bf778a31..75e03967 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -2787,5 +2787,10 @@ "removeAdminRights": "Eemalda peakasutaja õigused", "powerLevel": "Õiguste tase", "setPowerLevelDescription": "Õiguste tase on üks võimalusi kirjeldamaks seda, mida kasutaja saab jututoas teha ning see tavaliselt väljendub numbriga vahemikust 0 kuni 100.", - "owner": "Omanik" -} \ No newline at end of file + "owner": "Omanik", + "mute": "Summuta", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Loo uus vestlus" +} From 04edda0b1ab25d8ddc1e9a49012d3e912e681fa5 Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Tue, 10 Mar 2026 20:51:00 +0100 Subject: [PATCH 250/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (748 of 748 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 8add5a41..41ad546d 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -2799,5 +2799,6 @@ "@mute": { "description": "This should be a very short string because there is not much space in the button!" }, - "createNewChat": "Opprett ny chat" + "createNewChat": "Opprett ny chat", + "reset": "Nullstill" } From 26e72d789f39cdcf25cdfcdcf84a9757a49fbf3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Tue, 10 Mar 2026 00:47:24 +0100 Subject: [PATCH 251/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (748 of 748 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 9391c312..42279065 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -2792,5 +2792,6 @@ "@mute": { "description": "This should be a very short string because there is not much space in the button!" }, - "createNewChat": "新建聊天" + "createNewChat": "新建聊天", + "reset": "重置" } From 5fd377a611ae61d89db8bc79ff79663e1adc726b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Tue, 10 Mar 2026 14:40:09 +0100 Subject: [PATCH 252/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (748 of 748 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index 080b6c72..38eb9803 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -2798,5 +2798,6 @@ "@mute": { "description": "This should be a very short string because there is not much space in the button!" }, - "createNewChat": "Cruthaigh comhrá nua" + "createNewChat": "Cruthaigh comhrá nua", + "reset": "Athshocraigh" } From 0eecc9597b5e046428d5bc0f9c680b0d8494c40d Mon Sep 17 00:00:00 2001 From: Jelv Date: Tue, 10 Mar 2026 11:32:44 +0100 Subject: [PATCH 253/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (748 of 748 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index 3955a2b4..e8273fea 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -2383,7 +2383,7 @@ "newPassword": "Nieuw wachtwoord", "pleaseChooseAStrongPassword": "Kies a.j.b. een sterk wachtwoord", "select": "Selecteer", - "leaveEmptyToClearStatus": "Laat leeg om je status te resetten.", + "leaveEmptyToClearStatus": "Laat leeg om jouw status te herstellen.", "addChatOrSubSpace": "Voeg chat of subspace toe", "pleaseEnterYourCurrentPassword": "Vul je huidige wachtwoord in", "passwordsDoNotMatch": "Wachtwoorden komen niet overeen", @@ -2791,5 +2791,6 @@ "@mute": { "description": "This should be a very short string because there is not much space in the button!" }, - "createNewChat": "Creëer nieuw chat" + "createNewChat": "Creëer nieuw chat", + "reset": "Herstellen" } From b99b23c652aa1e16fb5cffb99ba0e6d57dafc8e4 Mon Sep 17 00:00:00 2001 From: Ettore Atalan Date: Tue, 10 Mar 2026 22:25:19 +0100 Subject: [PATCH 254/333] chore(translations): Translated using Weblate (German) Currently translated at 98.6% (738 of 748 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/ --- lib/l10n/intl_de.arb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index cded8028..10fc72d9 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -2787,5 +2787,6 @@ "clientWellKnownInformation": "Bekannte Informationen zum Client:", "join": "Beitreten", "searchOrEnterHomeserverAddress": "Homeserver-Adresse suchen oder eingeben", - "matrixId": "Matrix ID" -} \ No newline at end of file + "matrixId": "Matrix ID", + "reset": "Zurücksetzen" +} From 922156498f90cd6979848abfeb3b739f9e813823 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2026 22:19:08 +0000 Subject: [PATCH 255/333] build: (deps): Bump translations_cleaner from 0.1.0 to 0.1.1 Bumps [translations_cleaner](https://github.com/Chinmay-KB/translations_cleaner) from 0.1.0 to 0.1.1. - [Changelog](https://github.com/Chinmay-KB/translations_cleaner/blob/main/CHANGELOG.md) - [Commits](https://github.com/Chinmay-KB/translations_cleaner/commits/v0.1.1) --- updated-dependencies: - dependency-name: translations_cleaner dependency-version: 0.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 78d1b750..8ae2efa5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1877,10 +1877,10 @@ packages: dependency: "direct dev" description: name: translations_cleaner - sha256: "811f42be32f024fdf083903f198d3625f6ee6927601e3a53a29b85b90508b88c" + sha256: c6e5051cb5d4fe4c5b2cc1ef83a6964f27063f9cf5b6166f445709bea8f81ad3 url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "0.1.1" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 99115e51..a825d7d8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -95,7 +95,7 @@ dev_dependencies: integration_test: sdk: flutter license_checker: ^1.6.2 - translations_cleaner: ^0.1.0 + translations_cleaner: ^0.1.1 import_sorter: ignored_files: # Optional, defaults to [] From 5cc8ab636cd983cc36bb80b90273f33e59b1ef85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 21:39:14 +0000 Subject: [PATCH 256/333] build: (deps): Bump flutter_local_notifications from 20.1.0 to 21.0.0 Bumps [flutter_local_notifications](https://github.com/MaikuB/flutter_local_notifications) from 20.1.0 to 21.0.0. - [Release notes](https://github.com/MaikuB/flutter_local_notifications/releases) - [Commits](https://github.com/MaikuB/flutter_local_notifications/compare/flutter_local_notifications-v20.1.0...flutter_local_notifications-v21.0.0) --- updated-dependencies: - dependency-name: flutter_local_notifications dependency-version: 21.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- pubspec.lock | 20 ++++++++++---------- pubspec.yaml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 78d1b750..341b5b56 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -503,34 +503,34 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "2b50e938a275e1ad77352d6a25e25770f4130baa61eaf02de7a9a884680954ad" + sha256: "0d9035862236fe38250fe1644d7ed3b8254e34a21b2c837c9f539fbb3bba5ef1" url: "https://pub.dev" source: hosted - version: "20.1.0" + version: "21.0.0" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - sha256: dce0116868cedd2cdf768af0365fc37ff1cbef7c02c4f51d0587482e625868d0 + sha256: e0f25e243c6c44c825bbbc6b2b2e76f7d9222362adcfe9fd780bf01923c840bd url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "8.0.0" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "23de31678a48c084169d7ae95866df9de5c9d2a44be3e5915a2ff067aeeba899" + sha256: e7db3d5b49c2b7ecc68deba4aaaa67a348f92ee0fef34c8e4b4459dbef0d7307 url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "11.0.0" flutter_local_notifications_windows: dependency: transitive description: name: flutter_local_notifications_windows - sha256: e97a1a3016512437d9c0b12fae7d1491c3c7b9aa7f03a69b974308840656b02a + sha256: "3a2654ba104fbb52c618ebed9def24ef270228470718c43b3a6afcd5c81bef0c" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.0" flutter_localizations: dependency: "direct main" description: flutter @@ -1861,10 +1861,10 @@ packages: dependency: transitive description: name: timezone - sha256: dd14a3b83cfd7cb19e7888f1cbc20f258b8d71b54c06f79ac585f14093a287d1 + sha256: "784a5e34d2eb62e1326f24d6f600aaaee452eb8ca8ef2f384a59244e292d158b" url: "https://pub.dev" source: hosted - version: "0.10.1" + version: "0.11.0" tint: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 99115e51..9e49aa0b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,7 +31,7 @@ dependencies: sdk: flutter flutter_foreground_task: ^9.2.1 flutter_linkify: ^6.0.0 - flutter_local_notifications: ^20.1.0 + flutter_local_notifications: ^21.0.0 flutter_localizations: sdk: flutter flutter_map: ^8.2.2 From 38cda39672a1ea476475a96bab54ac7136fbf74f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 21:35:25 +0000 Subject: [PATCH 257/333] build: Try out flutter contraints --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 84a93450..a1fce6fa 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2069,10 +2069,10 @@ packages: dependency: "direct main" description: name: video_player - sha256: "08bfba72e311d48219acad4e191b1f9c27ff8cf928f2c7234874592d9c9d7341" + sha256: "48a7bdaa38a3d50ec10c78627abdbfad863fdf6f0d6e08c7c3c040cfd80ae36f" url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.11.1" video_player_android: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 12c7b0f6..e6aeef11 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -81,7 +81,7 @@ dependencies: universal_html: ^2.3.0 url_launcher: ^6.3.2 video_compress: ^3.1.4 - video_player: ^2.10.1 + video_player: ^2.11.1 wakelock_plus: ^1.3.3 webrtc_interface: ^1.3.0 From a8aadc834fe695e5bd63d05c2d112e5bbb50c41f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 12 Mar 2026 08:35:27 +0100 Subject: [PATCH 258/333] refactor: Remove animation dependency --- lib/pages/chat/chat_input_row.dart | 27 +++++---------------------- pubspec.lock | 8 -------- pubspec.yaml | 1 - 3 files changed, 5 insertions(+), 31 deletions(-) diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index eb92c55c..ae774ca7 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:animations/animations.dart'; import 'package:emoji_picker_flutter/locales/default_emoji_set_locale.dart'; import 'package:matrix/matrix.dart'; @@ -273,27 +272,11 @@ class ChatInputRow extends StatelessWidget { child: IconButton( tooltip: L10n.of(context).emojis, color: theme.colorScheme.onPrimaryContainer, - icon: PageTransitionSwitcher( - transitionBuilder: - ( - Widget child, - Animation primaryAnimation, - Animation secondaryAnimation, - ) { - return SharedAxisTransition( - animation: primaryAnimation, - secondaryAnimation: secondaryAnimation, - transitionType: SharedAxisTransitionType.scaled, - fillColor: Colors.transparent, - child: child, - ); - }, - child: Icon( - controller.showEmojiPicker - ? Icons.keyboard - : Icons.add_reaction_outlined, - key: ValueKey(controller.showEmojiPicker), - ), + icon: Icon( + controller.showEmojiPicker + ? Icons.keyboard + : Icons.add_reaction_outlined, + key: ValueKey(controller.showEmojiPicker), ), onPressed: controller.emojiPickerAction, ), diff --git a/pubspec.lock b/pubspec.lock index a1fce6fa..14243b0e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -25,14 +25,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.13.6" - animations: - dependency: "direct main" - description: - name: animations - sha256: "18938cefd7dcc04e1ecac0db78973761a01e4bc2d6bfae0cfa596bfeac9e96ab" - url: "https://pub.dev" - source: hosted - version: "2.1.1" ansicolor: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e6aeef11..7123f797 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,6 @@ environment: flutter: 3.41.4 dependencies: - animations: ^2.1.1 archive: ^4.0.7 async: ^2.11.0 badges: ^3.1.2 From 5c88133691a6f1f35a353dc7fceccba72105e16b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 12 Mar 2026 09:54:52 +0100 Subject: [PATCH 259/333] build: Build website in release job --- .github/workflows/release.yaml | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index f769ec3c..82c421d6 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -46,13 +46,25 @@ jobs: asset_path: fluffychat-web.tar.gz asset_name: fluffychat-web.tar.gz asset_content_type: application/gzip - - name: Build Website + - name: Clone fluffychat website run: | - mkdir public + git@github.com:krille-chan/fluffychat-website.git + cp CHANGELOG.md fluffychat-website/ + cp PRIVACY.md fluffychat-website/ + - name: Build website + working-directory: fluffychat-website + run: | + npm install tailwindcss @tailwindcss/cli + npx tailwindcss -i ./src/styles.css -o ./src/assets/tailwind.css --minify + npx @11ty/eleventy + mv public ../ + - name: Copy FluffyChat web into it + run: | + mkdir public/web mkdir public/nightly - cp -r build/web/* public/ + cp -r build/web/* public/web/ cp -r build/web/* public/nightly/ - echo "app.fluffy.chat" >> public/CNAME + echo "fluffychat.im" >> public/CNAME - name: Deploy to GitHub Pages if: startsWith(github.ref, 'refs/tags/v') uses: peaceiris/actions-gh-pages@v4 @@ -60,7 +72,7 @@ jobs: personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }} publish_dir: ./public publish_branch: gh-pages - cname: app.fluffy.chat + cname: fluffychat.im build_apk: runs-on: ubuntu-latest From a8a0212d3d34880abc9a8e42075cfb1661c1a872 Mon Sep 17 00:00:00 2001 From: xabirequejo Date: Wed, 11 Mar 2026 09:43:09 +0100 Subject: [PATCH 260/333] chore(translations): Translated using Weblate (Basque) Currently translated at 99.8% (747 of 748 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/eu/ --- lib/l10n/intl_eu.arb | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_eu.arb b/lib/l10n/intl_eu.arb index e0a585a5..caf6e44f 100644 --- a/lib/l10n/intl_eu.arb +++ b/lib/l10n/intl_eu.arb @@ -2779,5 +2779,19 @@ "theProcessWasCanceled": "Eragiketa bertan behera utzi da.", "join": "Batu", "searchOrEnterHomeserverAddress": "Bilatu edo sartu zerbitzariaren helbidea", - "matrixId": "Matrix IDa" -} \ No newline at end of file + "matrixId": "Matrix IDa", + "setPowerLevel": "Ezarri botere-maila", + "makeModerator": "Izendatu moderatzaile", + "makeAdmin": "Izendatu administrari", + "removeModeratorRights": "Kendu moderatzaile eskubideak", + "removeAdminRights": "Kendu administratzaile eskubideak", + "powerLevel": "Botere-maila", + "setPowerLevelDescription": "Botere-mailek zehazten dute kide batek zer egin dezakeen gela honetan, eta tartea 0tik 100era artekoa izan ohi da.", + "owner": "Jabea", + "mute": "Mututu", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Sortu txat berria", + "reset": "Berrezarri" +} From 9724b852bb40b347a924a553cc37072b7a3cd81f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 12 Mar 2026 12:03:03 +0100 Subject: [PATCH 261/333] chore: Adjust styles and animations --- lib/pages/chat/chat.dart | 19 +- lib/pages/chat/chat_event_list.dart | 11 +- lib/pages/chat/events/message.dart | 1355 ++++++++--------- lib/pages/settings_style/settings_style.dart | 27 - .../settings_style/settings_style_view.dart | 5 +- 5 files changed, 656 insertions(+), 761 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index afe57920..6432bc39 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -462,21 +462,18 @@ class ChatController extends State scrollUpBannerEventId = eventId; }); + bool firstUpdateReceived = false; + void updateView() { if (!mounted) return; setReadMarker(); - setState(() {}); + setState(() { + firstUpdateReceived = true; + }); } Future? loadTimelineFuture; - int? animateInEventIndex; - - void onInsert(int i) { - // setState will be called by updateView() anyway - if (timeline?.allowNewEvent == true) animateInEventIndex = i; - } - Future _getTimeline({String? eventContextId}) async { await Matrix.of(context).client.roomsLoading; await Matrix.of(context).client.accountDataLoading; @@ -489,15 +486,11 @@ class ChatController extends State timeline = await room.getTimeline( onUpdate: updateView, eventContextId: eventContextId, - onInsert: onInsert, ); } catch (e, s) { Logs().w('Unable to load timeline on event ID $eventContextId', e, s); if (!mounted) return; - timeline = await room.getTimeline( - onUpdate: updateView, - onInsert: onInsert, - ); + timeline = await room.getTimeline(onUpdate: updateView); if (!mounted) return; if (e is TimeoutException || e is IOException) { _showScrollUpMaterialBanner(eventContextId!); diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index 600d0af4..79cf5354 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -35,7 +35,6 @@ class ChatEventList extends StatelessWidget { final events = timeline.events.filterByVisibleInGui( threadId: controller.activeThreadId, ); - final animateInEventIndex = controller.animateInEventIndex; // create a map of eventId --> index to greatly improve performance of // ListView's findChildIndexCallback @@ -120,10 +119,7 @@ class ChatEventList extends StatelessWidget { // The message at this index: final event = events[i]; - final animateIn = - animateInEventIndex != null && - timeline.events.length > animateInEventIndex && - event == timeline.events[animateInEventIndex]; + final animateIn = i == 0 && controller.firstUpdateReceived; final nextEvent = i + 1 < events.length ? events[i + 1] : null; final previousEvent = i > 0 ? events[i - 1] : null; @@ -139,16 +135,13 @@ class ChatEventList extends StatelessWidget { !controller.expandedEventIds.contains(event.eventId); return AutoScrollTag( - key: ValueKey(event.eventId), + key: ValueKey(event.transactionId ?? event.eventId), index: i, controller: controller.scrollController, child: Message( event, bigEmojis: controller.bigEmojis, animateIn: animateIn, - resetAnimateIn: () { - controller.animateInEventIndex = null; - }, onSwipe: () => controller.replyAction(replyTo: event), onInfoTab: controller.showEventInfo, onMention: () => controller.sendController.text += diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index a350599e..580cdf32 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -42,7 +42,6 @@ class Message extends StatelessWidget { final Timeline timeline; final bool highlightMarker; final bool animateIn; - final void Function()? resetAnimateIn; final bool wallpaperMode; final ScrollController scrollController; final List colors; @@ -67,7 +66,6 @@ class Message extends StatelessWidget { required this.timeline, this.highlightMarker = false, this.animateIn = false, - this.resetAnimateIn, this.wallpaperMode = false, required this.onMention, required this.scrollController, @@ -171,9 +169,6 @@ class Message extends StatelessWidget { : theme.bubbleColor; } - final resetAnimateIn = this.resetAnimateIn; - var animateIn = this.animateIn; - final sentReactions = {}; if (singleSelected) { sentReactions.addAll( @@ -209,753 +204,661 @@ class Message extends StatelessWidget { final enterThread = this.enterThread; final sender = event.senderFromMemoryOrFallback; - return Center( - child: Swipeable( - key: ValueKey(event.eventId), - background: const Padding( - padding: EdgeInsets.symmetric(horizontal: 12.0), - child: Center(child: Icon(Icons.check_outlined)), - ), - direction: AppSettings.swipeRightToLeftToReply.value - ? SwipeDirection.endToStart - : SwipeDirection.startToEnd, - onSwipe: (_) => onSwipe(), - child: Container( - constraints: const BoxConstraints( - maxWidth: FluffyThemes.maxTimelineWidth, + return _AnimateIn( + animateIn: animateIn, + child: Center( + child: Swipeable( + key: ValueKey(event.eventId), + background: const Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: Center(child: Icon(Icons.check_outlined)), ), - padding: EdgeInsets.only( - left: 8.0, - right: 8.0, - top: nextEventSameSender ? 1.0 : 4.0, - bottom: previousEventSameSender ? 1.0 : 4.0, - ), - child: Column( - mainAxisSize: .min, - crossAxisAlignment: ownMessage ? .end : .start, - children: [ - if (displayTime || selected) - Padding( - padding: displayTime - ? const EdgeInsets.symmetric(vertical: 8.0) - : EdgeInsets.zero, - child: Center( - child: Padding( - padding: const EdgeInsets.only(top: 4.0), - child: Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius * 2, - ), - color: theme.colorScheme.surface.withAlpha(128), - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 8.0, - vertical: 2.0, + direction: AppSettings.swipeRightToLeftToReply.value + ? SwipeDirection.endToStart + : SwipeDirection.startToEnd, + onSwipe: (_) => onSwipe(), + child: Container( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.maxTimelineWidth, + ), + padding: EdgeInsets.only( + left: 8.0, + right: 8.0, + top: nextEventSameSender ? 1.0 : 4.0, + bottom: previousEventSameSender ? 1.0 : 4.0, + ), + child: Column( + mainAxisSize: .min, + crossAxisAlignment: ownMessage ? .end : .start, + children: [ + if (displayTime || selected) + Padding( + padding: displayTime + ? const EdgeInsets.symmetric(vertical: 8.0) + : EdgeInsets.zero, + child: Center( + child: Padding( + padding: const EdgeInsets.only(top: 4.0), + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius * 2, ), - child: Text( - event.originServerTs.localizedTime(context), - style: TextStyle( - fontSize: 12 * AppSettings.fontSizeFactor.value, - fontWeight: FontWeight.bold, - color: theme.colorScheme.secondary, + color: theme.colorScheme.surface.withAlpha(128), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 2.0, + ), + child: Text( + event.originServerTs.localizedTime(context), + style: TextStyle( + fontSize: 12 * AppSettings.fontSizeFactor.value, + fontWeight: FontWeight.bold, + color: theme.colorScheme.secondary, + ), ), ), ), ), ), ), - ), - StatefulBuilder( - builder: (context, setState) { - if (animateIn && resetAnimateIn != null) { - WidgetsBinding.instance.addPostFrameCallback((timeStamp) { - animateIn = false; - setState(resetAnimateIn); - }); - } - return AnimatedSize( - duration: FluffyThemes.animationDuration, - curve: FluffyThemes.animationCurve, - clipBehavior: Clip.none, - alignment: ownMessage - ? Alignment.bottomRight - : Alignment.bottomLeft, - child: animateIn - ? const SizedBox(height: 0, width: double.infinity) - : Stack( - clipBehavior: Clip.none, + Stack( + clipBehavior: Clip.none, + children: [ + Positioned( + top: 0, + bottom: 0, + left: 0, + right: 0, + child: InkWell( + hoverColor: longPressSelect ? Colors.transparent : null, + enableFeedback: !selected, + onTap: longPressSelect ? null : () => onSelect(event), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + child: Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + color: selected || highlightMarker + ? theme.colorScheme.secondaryContainer.withAlpha( + 128, + ) + : Colors.transparent, + ), + ), + ), + Row( + crossAxisAlignment: .start, + mainAxisAlignment: rowMainAxisAlignment, + children: [ + if (longPressSelect && !event.redacted) + SizedBox( + height: 32, + width: Avatar.defaultSize, + child: IconButton( + padding: EdgeInsets.zero, + tooltip: L10n.of(context).select, + icon: Icon( + selected + ? Icons.check_circle + : Icons.circle_outlined, + ), + onPressed: () => onSelect(event), + ), + ) + else if (nextEventSameSender || ownMessage) + SizedBox( + width: Avatar.defaultSize, + child: Center( + child: SizedBox( + width: 16, + height: 16, + child: event.status == EventStatus.error + ? const Icon(Icons.error, color: Colors.red) + : event.fileSendingStatus != null + ? const CircularProgressIndicator.adaptive( + strokeWidth: 1, + ) + : null, + ), + ), + ) + else + FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final user = snapshot.data ?? sender; + return Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + onTap: () => showMemberActionsPopupMenu( + context: context, + user: user, + onMention: onMention, + ), + presenceUserId: user.stateKey, + presenceBackgroundColor: wallpaperMode + ? Colors.transparent + : null, + ); + }, + ), + Expanded( + child: Column( + crossAxisAlignment: .start, + mainAxisSize: .min, children: [ - Positioned( - top: 0, - bottom: 0, - left: 0, - right: 0, - child: InkWell( - hoverColor: longPressSelect - ? Colors.transparent - : null, - enableFeedback: !selected, - onTap: longPressSelect - ? null - : () => onSelect(event), - borderRadius: BorderRadius.circular( - AppConfig.borderRadius / 2, + if (!nextEventSameSender) + Padding( + padding: const EdgeInsets.only( + left: 8.0, + bottom: 4, ), - child: Material( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius / 2, + child: ownMessage || event.room.isDirectChat + ? const SizedBox(height: 12) + : Row( + children: [ + if (sender.powerLevel >= 50) + Padding( + padding: const EdgeInsets.only( + right: 2.0, + ), + child: Icon( + sender.powerLevel >= 100 + ? Icons + .admin_panel_settings + : Icons + .add_moderator_outlined, + size: 14, + color: theme + .colorScheme + .onPrimaryContainer, + ), + ), + Expanded( + child: FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final displayname = + snapshot.data + ?.calcDisplayname() ?? + sender.calcDisplayname(); + return Text( + displayname, + style: TextStyle( + fontSize: 11, + fontWeight: + FontWeight.bold, + color: + (theme.brightness == + Brightness.light + ? displayname.color + : displayname + .lightColorText), + shadows: !wallpaperMode + ? null + : [ + const Shadow( + offset: Offset( + 0.0, + 0.0, + ), + blurRadius: 3, + color: Colors + .black, + ), + ], + ), + maxLines: 1, + overflow: + TextOverflow.ellipsis, + ); + }, + ), + ), + ], + ), + ), + Container( + alignment: alignment, + padding: const EdgeInsets.only(left: 8), + child: GestureDetector( + onLongPress: longPressSelect + ? null + : () { + HapticFeedback.heavyImpact(); + onSelect(event); + }, + child: Container( + decoration: BoxDecoration( + color: noBubble + ? Colors.transparent + : color, + borderRadius: borderRadius, + ), + clipBehavior: Clip.antiAlias, + child: BubbleBackground( + colors: colors, + ignore: + noBubble || + !ownMessage || + MediaQuery.highContrastOf(context), + scrollController: scrollController, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + ), + constraints: const BoxConstraints( + maxWidth: + FluffyThemes.columnWidth * 1.5, + ), + child: Column( + mainAxisSize: .min, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (event.inReplyToEventId( + includingFallback: false, + ) != + null) + FutureBuilder( + future: event.getReplyEvent( + timeline, + ), + builder: (BuildContext context, snapshot) { + final replyEvent = + snapshot.hasData + ? snapshot.data! + : Event( + eventId: + event + .inReplyToEventId() ?? + '\$fake_event_id', + content: { + 'msgtype': 'm.text', + 'body': '...', + }, + senderId: + event.senderId, + type: + 'm.room.message', + room: event.room, + status: + EventStatus.sent, + originServerTs: + DateTime.now(), + ); + return Padding( + padding: + const EdgeInsets.only( + left: 16, + right: 16, + top: 8, + ), + child: Material( + color: Colors.transparent, + borderRadius: ReplyContent + .borderRadius, + child: InkWell( + borderRadius: + ReplyContent + .borderRadius, + onTap: () => + scrollToEventId( + replyEvent + .eventId, + ), + child: AbsorbPointer( + child: ReplyContent( + replyEvent, + ownMessage: + ownMessage, + timeline: timeline, + ), + ), + ), + ), + ); + }, + ), + MessageContent( + displayEvent, + textColor: textColor, + linkColor: linkColor, + onInfoTab: onInfoTab, + borderRadius: borderRadius, + timeline: timeline, + selected: selected, + bigEmojis: bigEmojis, + ), + if (event.hasAggregatedEvents( + timeline, + RelationshipTypes.edit, + )) + Padding( + padding: const EdgeInsets.only( + bottom: 8.0, + left: 16.0, + right: 16.0, + ), + child: Row( + mainAxisSize: + MainAxisSize.min, + spacing: 4.0, + children: [ + Icon( + Icons.edit_outlined, + color: textColor + .withAlpha(164), + size: 14, + ), + Text( + displayEvent + .originServerTs + .localizedTimeShort( + context, + ), + style: TextStyle( + color: textColor + .withAlpha(164), + fontSize: 11, + ), + ), + ], + ), + ), + ], + ), + ), ), - color: selected || highlightMarker - ? theme.colorScheme.secondaryContainer - .withAlpha(128) - : Colors.transparent, ), ), ), - Row( - crossAxisAlignment: .start, - mainAxisAlignment: rowMainAxisAlignment, - children: [ - if (longPressSelect && !event.redacted) - SizedBox( - height: 32, - width: Avatar.defaultSize, - child: IconButton( - padding: EdgeInsets.zero, - tooltip: L10n.of(context).select, - icon: Icon( - selected - ? Icons.check_circle - : Icons.circle_outlined, - ), - onPressed: () => onSelect(event), - ), - ) - else if (nextEventSameSender || ownMessage) - SizedBox( - width: Avatar.defaultSize, - child: Center( - child: SizedBox( - width: 16, - height: 16, - child: - event.status == EventStatus.error - ? const Icon( - Icons.error, - color: Colors.red, - ) - : event.fileSendingStatus != null - ? const CircularProgressIndicator.adaptive( - strokeWidth: 1, - ) - : null, - ), - ), - ) - else - FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - final user = snapshot.data ?? sender; - return Avatar( - mxContent: user.avatarUrl, - name: user.calcDisplayname(), - onTap: () => - showMemberActionsPopupMenu( - context: context, - user: user, - onMention: onMention, - ), - presenceUserId: user.stateKey, - presenceBackgroundColor: wallpaperMode - ? Colors.transparent - : null, - ); - }, - ), - Expanded( - child: Column( - crossAxisAlignment: .start, - mainAxisSize: .min, - children: [ - if (!nextEventSameSender) - Padding( - padding: const EdgeInsets.only( - left: 8.0, - bottom: 4, + Align( + alignment: ownMessage + ? Alignment.bottomRight + : Alignment.bottomLeft, + child: AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: showReactionPicker + ? Padding( + padding: const EdgeInsets.all(4.0), + child: Material( + elevation: 4, + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, ), - child: - ownMessage || - event.room.isDirectChat - ? const SizedBox(height: 12) - : Row( - children: [ - if (sender.powerLevel >= - 50) - Padding( - padding: - const EdgeInsets.only( - right: 2.0, - ), - child: Icon( - sender.powerLevel >= - 100 - ? Icons - .admin_panel_settings - : Icons - .add_moderator_outlined, - size: 14, - color: theme - .colorScheme - .onPrimaryContainer, - ), - ), - Expanded( - child: FutureBuilder( - future: event - .fetchSenderUser(), - builder: (context, snapshot) { - final displayname = - snapshot.data - ?.calcDisplayname() ?? - sender - .calcDisplayname(); - return Text( - displayname, - style: TextStyle( - fontSize: 11, - fontWeight: - FontWeight - .bold, - color: - (theme.brightness == - Brightness - .light - ? displayname - .color - : displayname - .lightColorText), - shadows: - !wallpaperMode - ? null - : [ - const Shadow( - offset: Offset( - 0.0, - 0.0, - ), - blurRadius: - 3, - color: - Colors.black, - ), - ], - ), - maxLines: 1, - overflow: - TextOverflow - .ellipsis, - ); - }, - ), - ), - ], - ), - ), - Container( - alignment: alignment, - padding: const EdgeInsets.only( - left: 8, - ), - child: GestureDetector( - onLongPress: longPressSelect - ? null - : () { - HapticFeedback.heavyImpact(); - onSelect(event); - }, - child: AnimatedOpacity( - opacity: animateIn - ? 0 - : event.messageType == - MessageTypes - .BadEncrypted || - event.status.isSending - ? 0.5 - : 1, - duration: FluffyThemes - .animationDuration, - curve: - FluffyThemes.animationCurve, - child: Container( - decoration: BoxDecoration( - color: noBubble - ? Colors.transparent - : color, - borderRadius: borderRadius, - ), - clipBehavior: Clip.antiAlias, - child: BubbleBackground( - colors: colors, - ignore: - noBubble || - !ownMessage || - MediaQuery.highContrastOf( - context, - ), - scrollController: - scrollController, - child: Container( - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular( - AppConfig - .borderRadius, - ), - ), - constraints: - const BoxConstraints( - maxWidth: - FluffyThemes - .columnWidth * - 1.5, - ), - child: Column( - mainAxisSize: .min, - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - if (event.inReplyToEventId( - includingFallback: - false, - ) != - null) - FutureBuilder( - future: event - .getReplyEvent( - timeline, + shadowColor: theme + .colorScheme + .surface + .withAlpha(128), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisSize: .min, + children: [ + ...AppConfig.defaultReactions.map( + (emoji) => IconButton( + padding: EdgeInsets.zero, + icon: Center( + child: Opacity( + opacity: + sentReactions + .contains( + emoji, + ) + ? 0.33 + : 1, + child: Text( + emoji, + style: + const TextStyle( + fontSize: 20, ), - builder: - ( - BuildContext - context, - snapshot, - ) { - final replyEvent = - snapshot - .hasData - ? snapshot - .data! - : Event( - eventId: - event.inReplyToEventId() ?? - '\$fake_event_id', - content: { - 'msgtype': - 'm.text', - 'body': - '...', - }, - senderId: - event.senderId, - type: - 'm.room.message', - room: - event.room, - status: - EventStatus.sent, - originServerTs: - DateTime.now(), - ); - return Padding( - padding: - const EdgeInsets.only( - left: - 16, - right: - 16, - top: - 8, - ), - child: Material( - color: Colors - .transparent, - borderRadius: - ReplyContent - .borderRadius, - child: InkWell( - borderRadius: - ReplyContent.borderRadius, - onTap: () => scrollToEventId( - replyEvent - .eventId, - ), - child: AbsorbPointer( - child: ReplyContent( - replyEvent, - ownMessage: - ownMessage, - timeline: - timeline, - ), - ), - ), - ), + textAlign: TextAlign + .center, + ), + ), + ), + onPressed: + sentReactions + .contains(emoji) + ? null + : () { + onSelect(event); + event.room + .sendReaction( + event + .eventId, + emoji, ); - }, - ), - MessageContent( - displayEvent, - textColor: textColor, - linkColor: linkColor, - onInfoTab: onInfoTab, - borderRadius: - borderRadius, - timeline: timeline, - selected: selected, - bigEmojis: bigEmojis, - ), - if (event - .hasAggregatedEvents( - timeline, - RelationshipTypes - .edit, - )) - Padding( - padding: - const EdgeInsets.only( - bottom: 8.0, - left: 16.0, - right: 16.0, - ), - child: Row( - mainAxisSize: - MainAxisSize - .min, - spacing: 4.0, - children: [ - Icon( - Icons - .edit_outlined, - color: textColor - .withAlpha( - 164, - ), - size: 14, - ), - Text( - displayEvent - .originServerTs - .localizedTimeShort( - context, - ), - style: TextStyle( - color: textColor - .withAlpha( - 164, - ), - fontSize: - 11, - ), - ), - ], - ), - ), - ], + }, ), ), - ), - ), - ), - ), - ), - Align( - alignment: ownMessage - ? Alignment.bottomRight - : Alignment.bottomLeft, - child: AnimatedSize( - duration: - FluffyThemes.animationDuration, - curve: FluffyThemes.animationCurve, - child: showReactionPicker - ? Padding( - padding: - const EdgeInsets.all( - 4.0, - ), - child: Material( - elevation: 4, - borderRadius: - BorderRadius.circular( - AppConfig - .borderRadius, - ), - shadowColor: theme - .colorScheme - .surface - .withAlpha(128), - child: SingleChildScrollView( - scrollDirection: - Axis.horizontal, - child: Row( - mainAxisSize: .min, - children: [ - ...AppConfig.defaultReactions.map( - ( - emoji, - ) => IconButton( - padding: - EdgeInsets - .zero, - icon: Center( - child: Opacity( - opacity: - sentReactions.contains( - emoji, - ) - ? 0.33 - : 1, - child: Text( - emoji, - style: const TextStyle( - fontSize: - 20, - ), - textAlign: - TextAlign - .center, - ), - ), - ), - onPressed: - sentReactions - .contains( - emoji, - ) - ? null - : () { - onSelect( - event, - ); - event.room.sendReaction( - event - .eventId, - emoji, - ); - }, - ), - ), - IconButton( - icon: const Icon( - Icons - .add_reaction_outlined, - ), - tooltip: L10n.of( + IconButton( + icon: const Icon( + Icons + .add_reaction_outlined, + ), + tooltip: L10n.of( + context, + ).customReaction, + onPressed: () async { + final emoji = await showAdaptiveBottomSheet( + context: context, + builder: (context) => Scaffold( + appBar: AppBar( + title: Text( + L10n.of( context, ).customReaction, - onPressed: () async { - final emoji = await showAdaptiveBottomSheet( - context: - context, - builder: (context) => Scaffold( - appBar: AppBar( - title: Text( - L10n.of( - context, - ).customReaction, - ), - leading: CloseButton( - onPressed: () => Navigator.of( - context, - ).pop(null), - ), - ), - body: SizedBox( - height: double - .infinity, - child: EmojiPicker( - onEmojiSelected: - ( - _, - emoji, - ) => - Navigator.of( - context, - ).pop( - emoji.emoji, - ), - config: Config( - locale: Localizations.localeOf( - context, - ), - emojiViewConfig: const EmojiViewConfig( - backgroundColor: - Colors.transparent, - ), - bottomActionBarConfig: const BottomActionBarConfig( - enabled: - false, - ), - categoryViewConfig: CategoryViewConfig( - initCategory: - Category.SMILEYS, - backspaceColor: - theme.colorScheme.primary, - iconColor: theme.colorScheme.primary.withAlpha( - 128, - ), - iconColorSelected: - theme.colorScheme.primary, - indicatorColor: - theme.colorScheme.primary, - backgroundColor: - theme.colorScheme.surface, - ), - skinToneConfig: SkinToneConfig( - dialogBackgroundColor: Color.lerp( - theme.colorScheme.surface, - theme.colorScheme.primaryContainer, - 0.75, - )!, - indicatorColor: - theme.colorScheme.onSurface, - ), - ), - ), - ), - ), - ); - if (emoji == - null) { - return; - } - if (sentReactions - .contains( - emoji, - )) { - return; - } - onSelect(event); - - await event.room - .sendReaction( - event - .eventId, - emoji, - ); - }, ), - ], + leading: CloseButton( + onPressed: () => + Navigator.of( + context, + ).pop(null), + ), + ), + body: SizedBox( + height: + double.infinity, + child: EmojiPicker( + onEmojiSelected: + (_, emoji) => + Navigator.of( + context, + ).pop( + emoji + .emoji, + ), + config: Config( + locale: + Localizations.localeOf( + context, + ), + emojiViewConfig: + const EmojiViewConfig( + backgroundColor: + Colors + .transparent, + ), + bottomActionBarConfig: + const BottomActionBarConfig( + enabled: + false, + ), + categoryViewConfig: CategoryViewConfig( + initCategory: + Category + .SMILEYS, + backspaceColor: theme + .colorScheme + .primary, + iconColor: theme + .colorScheme + .primary + .withAlpha( + 128, + ), + iconColorSelected: theme + .colorScheme + .primary, + indicatorColor: theme + .colorScheme + .primary, + backgroundColor: theme + .colorScheme + .surface, + ), + skinToneConfig: SkinToneConfig( + dialogBackgroundColor: Color.lerp( + theme + .colorScheme + .surface, + theme + .colorScheme + .primaryContainer, + 0.75, + )!, + indicatorColor: theme + .colorScheme + .onSurface, + ), + ), + ), + ), ), - ), - ), - ) - : const SizedBox.shrink(), + ); + if (emoji == null) { + return; + } + if (sentReactions + .contains(emoji)) { + return; + } + onSelect(event); + + await event.room + .sendReaction( + event.eventId, + emoji, + ); + }, + ), + ], + ), + ), ), - ), - ], - ), - ), - ], + ) + : const SizedBox.shrink(), + ), ), ], ), - ); - }, - ), - - AnimatedSize( - duration: FluffyThemes.animationDuration, - curve: FluffyThemes.animationCurve, - alignment: Alignment.bottomCenter, - child: !hasReactions - ? const SizedBox.shrink() - : Padding( - padding: EdgeInsets.only( - top: 1.0, - left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0, - right: ownMessage ? 0 : 12.0, ), - child: MessageReactions(event, timeline), - ), - ), - if (enterThread != null) + ], + ), + ], + ), + AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, alignment: Alignment.bottomCenter, - child: threadChildren.isEmpty + child: !hasReactions ? const SizedBox.shrink() : Padding( - padding: const EdgeInsets.only( - top: 2.0, - bottom: 8.0, - left: Avatar.defaultSize + 8, + padding: EdgeInsets.only( + top: 1.0, + left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0, + right: ownMessage ? 0 : 12.0, ), - child: ConstrainedBox( - constraints: const BoxConstraints( - maxWidth: FluffyThemes.columnWidth * 1.5, + child: MessageReactions(event, timeline), + ), + ), + if (enterThread != null) + AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + alignment: Alignment.bottomCenter, + child: threadChildren.isEmpty + ? const SizedBox.shrink() + : Padding( + padding: const EdgeInsets.only( + top: 2.0, + bottom: 8.0, + left: Avatar.defaultSize + 8, ), - child: TextButton.icon( - style: TextButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(4), + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 1.5, + ), + child: TextButton.icon( + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4), + ), + foregroundColor: + theme.colorScheme.onSecondaryContainer, + backgroundColor: + theme.colorScheme.secondaryContainer, + ), + onPressed: () => enterThread(event.eventId), + icon: const Icon(Icons.message), + label: Text( + '${L10n.of(context).countReplies(threadChildren.length)} | ${threadChildren.first.calcLocalizedBodyFallback(MatrixLocals(L10n.of(context)), withSenderNamePrefix: true)}', + maxLines: 1, + overflow: TextOverflow.ellipsis, ), - foregroundColor: - theme.colorScheme.onSecondaryContainer, - backgroundColor: - theme.colorScheme.secondaryContainer, - ), - onPressed: () => enterThread(event.eventId), - icon: const Icon(Icons.message), - label: Text( - '${L10n.of(context).countReplies(threadChildren.length)} | ${threadChildren.first.calcLocalizedBodyFallback(MatrixLocals(L10n.of(context)), withSenderNamePrefix: true)}', - maxLines: 1, - overflow: TextOverflow.ellipsis, ), ), ), - ), - ), - if (displayReadMarker) - Row( - children: [ - Expanded( - child: Divider( - color: theme.colorScheme.surfaceContainerHighest, - ), - ), - Container( - margin: const EdgeInsets.symmetric( - horizontal: 4, - vertical: 16.0, - ), - padding: const EdgeInsets.symmetric( - horizontal: 8, - vertical: 2, - ), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius / 3, - ), - color: theme.colorScheme.surface.withAlpha(128), - ), - child: Text( - L10n.of(context).readUpToHere, - style: TextStyle( - fontSize: 12 * AppSettings.fontSizeFactor.value, + ), + if (displayReadMarker) + Row( + children: [ + Expanded( + child: Divider( + color: theme.colorScheme.surfaceContainerHighest, ), ), - ), - Expanded( - child: Divider( - color: theme.colorScheme.surfaceContainerHighest, + Container( + margin: const EdgeInsets.symmetric( + horizontal: 4, + vertical: 16.0, + ), + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 3, + ), + color: theme.colorScheme.surface.withAlpha(128), + ), + child: Text( + L10n.of(context).readUpToHere, + style: TextStyle( + fontSize: 12 * AppSettings.fontSizeFactor.value, + ), + ), ), - ), - ], - ), - ], + Expanded( + child: Divider( + color: theme.colorScheme.surfaceContainerHighest, + ), + ), + ], + ), + ], + ), ), ), ), @@ -1033,3 +936,37 @@ class BubblePainter extends CustomPainter { return scrollable.position != oldScrollable?.position; } } + +class _AnimateIn extends StatefulWidget { + final bool animateIn; + final Widget child; + const _AnimateIn({required this.animateIn, required this.child}); + + @override + State<_AnimateIn> createState() => __AnimateInState(); +} + +class __AnimateInState extends State<_AnimateIn> { + bool _animationFinished = false; + @override + Widget build(BuildContext context) { + if (!widget.animateIn) return widget.child; + if (!_animationFinished) { + WidgetsBinding.instance.addPostFrameCallback((_) { + setState(() { + _animationFinished = true; + }); + }); + } + return AnimatedOpacity( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + opacity: _animationFinished ? 1 : 0, + child: AnimatedSize( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: _animationFinished ? widget.child : const SizedBox.shrink(), + ), + ); + } +} diff --git a/lib/pages/settings_style/settings_style.dart b/lib/pages/settings_style/settings_style.dart index c4749568..273d2684 100644 --- a/lib/pages/settings_style/settings_style.dart +++ b/lib/pages/settings_style/settings_style.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:file_picker/file_picker.dart'; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/file_selector.dart'; @@ -111,32 +110,6 @@ class SettingsStyleController extends State { ThemeMode get currentTheme => ThemeController.of(context).themeMode; Color? get currentColor => ThemeController.of(context).primaryColor; - static final List customColors = [ - null, - AppConfig.chatColor, - Colors.indigo, - Colors.blue, - Colors.blueAccent, - Colors.teal, - Colors.tealAccent, - Colors.green, - Colors.greenAccent, - Colors.yellow, - Colors.yellowAccent, - Colors.orange, - Colors.orangeAccent, - Colors.red, - Colors.redAccent, - Colors.pink, - Colors.pinkAccent, - Colors.purple, - Colors.purpleAccent, - Colors.blueGrey, - Colors.grey, - Colors.white, - Colors.black, - ]; - void switchTheme(ThemeMode? newTheme) { if (newTheme == null) return; switch (newTheme) { diff --git a/lib/pages/settings_style/settings_style_view.dart b/lib/pages/settings_style/settings_style_view.dart index 9391bbf3..e2945077 100644 --- a/lib/pages/settings_style/settings_style_view.dart +++ b/lib/pages/settings_style/settings_style_view.dart @@ -82,14 +82,13 @@ class SettingsStyleView extends StatelessWidget { Theme.of(context).brightness == Brightness.light ? light?.primary : dark?.primary; - final colors = List.from( - SettingsStyleController.customColors, - ); + final colors = [null, AppConfig.chatColor, ...Colors.primaries]; if (systemColor == null) { colors.remove(null); } return GridView.builder( shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 64, ), From 6c05ed8aaa39a10dd5d7e95e07071ddc0130ed83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 12 Mar 2026 17:34:59 +0100 Subject: [PATCH 262/333] chore: Add support button everywhere --- lib/config/app_config.dart | 3 ++- lib/l10n/intl_be.arb | 2 -- lib/l10n/intl_ca.arb | 1 - lib/l10n/intl_cs.arb | 1 - lib/l10n/intl_de.arb | 3 +-- lib/l10n/intl_en.arb | 4 ++-- lib/l10n/intl_es.arb | 1 - lib/l10n/intl_et.arb | 3 +-- lib/l10n/intl_eu.arb | 3 +-- lib/l10n/intl_fi.arb | 2 -- lib/l10n/intl_ga.arb | 3 +-- lib/l10n/intl_gl.arb | 3 +-- lib/l10n/intl_hr.arb | 1 - lib/l10n/intl_id.arb | 1 - lib/l10n/intl_kab.arb | 1 - lib/l10n/intl_lv.arb | 1 - lib/l10n/intl_nb.arb | 3 +-- lib/l10n/intl_nl.arb | 3 +-- lib/l10n/intl_pl.arb | 2 +- lib/l10n/intl_pt_BR.arb | 1 - lib/l10n/intl_ru.arb | 1 - lib/l10n/intl_sv.arb | 1 - lib/l10n/intl_ta.arb | 3 +-- lib/l10n/intl_uk.arb | 1 - lib/l10n/intl_uz.arb | 1 - lib/l10n/intl_zh.arb | 3 +-- .../chat_list/client_chooser_button.dart | 21 +++++++++---------- 27 files changed, 24 insertions(+), 49 deletions(-) diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 0dcb6c4c..6e53d61b 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -37,7 +37,8 @@ abstract class AppConfig { static const String supportUrl = 'https://github.com/krille-chan/fluffychat/issues'; static const String changelogUrl = 'https://fluffy.chat/en/changelog/'; - static const String donationUrl = 'https://ko-fi.com/krille'; + static const String donationUrl = + 'https://fluffychat.im/faq/#how_can_i_support_fluffychat'; static const Set defaultReactions = {'👍', '❤️', '😂', '😮', '😢'}; diff --git a/lib/l10n/intl_be.arb b/lib/l10n/intl_be.arb index 05534575..338e33f9 100644 --- a/lib/l10n/intl_be.arb +++ b/lib/l10n/intl_be.arb @@ -2992,8 +2992,6 @@ } } }, - "donate": "Даць грошы", - "@donate": {}, "startedAPoll": "{username} пачаў апытанне.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_ca.arb b/lib/l10n/intl_ca.arb index 796ba782..e2535014 100644 --- a/lib/l10n/intl_ca.arb +++ b/lib/l10n/intl_ca.arb @@ -2691,7 +2691,6 @@ } } }, - "donate": "Dona", "startedAPoll": "{username} ha creat una enquesta.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb index 9b61e29e..ead46d2d 100644 --- a/lib/l10n/intl_cs.arb +++ b/lib/l10n/intl_cs.arb @@ -2560,7 +2560,6 @@ } } }, - "donate": "Přispět", "startedAPoll": "{username} spustil/a hlasování.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 10fc72d9..b4e4c0a6 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -2697,7 +2697,6 @@ } } }, - "donate": "Spenden", "resume": "Fortsetzen", "startedAPoll": "{username} hat eine Umfrage gestartet.", "@startedAPoll": { @@ -2789,4 +2788,4 @@ "searchOrEnterHomeserverAddress": "Homeserver-Adresse suchen oder eingeben", "matrixId": "Matrix ID", "reset": "Zurücksetzen" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 4226d4fd..e88217c8 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -2681,7 +2681,6 @@ } } }, - "donate": "Donate", "startedAPoll": "{username} started a poll.", "@startedAPoll": { "type": "String", @@ -2782,5 +2781,6 @@ "description": "This should be a very short string because there is not much space in the button!" }, "createNewChat": "Create new chat", - "reset": "Reset" + "reset": "Reset", + "supportFluffyChat": "Support FluffyChat" } \ No newline at end of file diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index b580147b..0ef41aea 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -2713,7 +2713,6 @@ } } }, - "donate": "Donar", "pollQuestion": "Pregunta de encuesta", "answerOption": "Respuesta", "addAnswerOption": "Añadir respuesta", diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index 75e03967..5dde2146 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -2690,7 +2690,6 @@ } } }, - "donate": "Toeta meid rahaliselt", "startedAPoll": "{username} koostas küsitluse.", "@startedAPoll": { "type": "String", @@ -2793,4 +2792,4 @@ "description": "This should be a very short string because there is not much space in the button!" }, "createNewChat": "Loo uus vestlus" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_eu.arb b/lib/l10n/intl_eu.arb index caf6e44f..15766e64 100644 --- a/lib/l10n/intl_eu.arb +++ b/lib/l10n/intl_eu.arb @@ -2672,7 +2672,6 @@ } } }, - "donate": "Egin dohaintza", "spaceMemberOf": "{spaces} guneko kidea", "@spaceMemberOf": { "type": "String", @@ -2794,4 +2793,4 @@ }, "createNewChat": "Sortu txat berria", "reset": "Berrezarri" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_fi.arb b/lib/l10n/intl_fi.arb index be92c553..9c26272b 100644 --- a/lib/l10n/intl_fi.arb +++ b/lib/l10n/intl_fi.arb @@ -3003,8 +3003,6 @@ } } }, - "donate": "Lahjoita", - "@donate": {}, "startedAPoll": "{username} aloitti kyselyn.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index 38eb9803..db7ed298 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -2696,7 +2696,6 @@ } } }, - "donate": "Tabhair Síntiús", "startedAPoll": "Chuir {username} tús le pobalbhreith.", "@startedAPoll": { "type": "String", @@ -2800,4 +2799,4 @@ }, "createNewChat": "Cruthaigh comhrá nua", "reset": "Athshocraigh" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index 13fa86d8..6c19e5fa 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -2672,7 +2672,6 @@ } } }, - "donate": "Doar", "spaceMemberOf": "Participa no espazo {spaces}", "@spaceMemberOf": { "type": "String", @@ -2793,4 +2792,4 @@ "description": "This should be a very short string because there is not much space in the button!" }, "createNewChat": "Crear nova conversa" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_hr.arb b/lib/l10n/intl_hr.arb index e2132063..cba7322e 100644 --- a/lib/l10n/intl_hr.arb +++ b/lib/l10n/intl_hr.arb @@ -2692,7 +2692,6 @@ } } }, - "donate": "Doniraj", "startedAPoll": "{username} je pokrenuo/la anketu.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_id.arb b/lib/l10n/intl_id.arb index 65174f6c..b0877b55 100644 --- a/lib/l10n/intl_id.arb +++ b/lib/l10n/intl_id.arb @@ -2691,7 +2691,6 @@ } } }, - "donate": "Donasi", "startedAPoll": "{username} memulai polling.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index e2e2fa63..f0464eef 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -1392,7 +1392,6 @@ } } }, - "donate": "Mudd tawsa", "startedAPoll": "{username}yessenker tafrent.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_lv.arb b/lib/l10n/intl_lv.arb index cfca1b49..c81ba6ca 100644 --- a/lib/l10n/intl_lv.arb +++ b/lib/l10n/intl_lv.arb @@ -2673,7 +2673,6 @@ } } }, - "donate": "Ziedot", "startedAPoll": "{username} uzsāka aptauju.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 41ad546d..a3fad8ec 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -2540,7 +2540,6 @@ } } }, - "donate": "Doner", "banUserDescription": "Brukeren vil bli utestengt fra chatten og vil ikke kunne delta i chatten igjen før utestengelsen er opphevet.", "unbanUserDescription": "Brukeren vil kunne gå inn i chatten igjen hvis vedkommende prøver.", "kickUserDescription": "Brukeren blir kastet ut av chatten, men ikke utestengt. I offentlige chatter kan brukeren bli med på nytt når som helst.", @@ -2801,4 +2800,4 @@ }, "createNewChat": "Opprett ny chat", "reset": "Nullstill" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index e8273fea..00ad6495 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -2661,7 +2661,6 @@ "longPressToRecordVoiceMessage": "Lang drukken om een spraakbericht op te nemen.", "pause": "Pauzeer", "resume": "Hervat", - "donate": "Doneer", "removeFromSpaceDescription": "De chat zal worden verwijderd uit de space, maar blijft in je chats.", "countChats": "{chats} chats", "@countChats": { @@ -2793,4 +2792,4 @@ }, "createNewChat": "Creëer nieuw chat", "reset": "Herstellen" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index cfb6dbe5..1b14a592 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -2699,4 +2699,4 @@ "moreEvents": "Więcej zdarzeń", "declineInvitation": "Odrzuć zaproszenie", "@declineInvitation": {} -} +} \ No newline at end of file diff --git a/lib/l10n/intl_pt_BR.arb b/lib/l10n/intl_pt_BR.arb index e5be40fa..dae54b88 100644 --- a/lib/l10n/intl_pt_BR.arb +++ b/lib/l10n/intl_pt_BR.arb @@ -2689,7 +2689,6 @@ } } }, - "donate": "Doar", "startedAPoll": "{username} iniciou uma enquete.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index aad8890b..7341066d 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -2640,7 +2640,6 @@ } } }, - "donate": "Пожертвовать", "startedAPoll": "{username} начал опрос.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_sv.arb b/lib/l10n/intl_sv.arb index 87f9ebd4..82fb566c 100644 --- a/lib/l10n/intl_sv.arb +++ b/lib/l10n/intl_sv.arb @@ -2606,7 +2606,6 @@ } } }, - "donate": "Donera", "answerOption": "Svarsalternativ", "addAnswerOption": "Lägg till svarsalternativ", "allowMultipleAnswers": "Tillåt flera svar", diff --git a/lib/l10n/intl_ta.arb b/lib/l10n/intl_ta.arb index 4e2b6aa2..cfbff0b0 100644 --- a/lib/l10n/intl_ta.arb +++ b/lib/l10n/intl_ta.arb @@ -2684,7 +2684,6 @@ } } }, - "donate": "நன்கொடை", "startedAPoll": "{username} ஒரு வாக்கெடுப்பைத் தொடங்கினார்.", "@startedAPoll": { "type": "String", @@ -2785,4 +2784,4 @@ "description": "This should be a very short string because there is not much space in the button!" }, "createNewChat": "புதிய அரட்டையை உருவாக்கு" -} +} \ No newline at end of file diff --git a/lib/l10n/intl_uk.arb b/lib/l10n/intl_uk.arb index f7234515..72b90b9a 100644 --- a/lib/l10n/intl_uk.arb +++ b/lib/l10n/intl_uk.arb @@ -2690,7 +2690,6 @@ } } }, - "donate": "Задонатити", "startedAPoll": "Нове опитування від {username}.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_uz.arb b/lib/l10n/intl_uz.arb index 3567af88..96343138 100644 --- a/lib/l10n/intl_uz.arb +++ b/lib/l10n/intl_uz.arb @@ -2598,7 +2598,6 @@ } } }, - "donate": "Xayriya qilmoq", "startedAPoll": "{username} so‘rovnoma boshladi.", "@startedAPoll": { "type": "String", diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 42279065..161ce396 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -2690,7 +2690,6 @@ } } }, - "donate": "捐赠", "startedAPoll": "{username} 启动了投票。", "@startedAPoll": { "type": "String", @@ -2794,4 +2793,4 @@ }, "createNewChat": "新建聊天", "reset": "重置" -} +} \ No newline at end of file diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index b4dca19d..f4093cb0 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -69,17 +69,6 @@ class ClientChooserButton extends StatelessWidget { ], ), ), - if (Matrix.of(context).backgroundPush?.firebaseEnabled != true) - PopupMenuItem( - value: SettingsAction.support, - child: Row( - children: [ - const Icon(Icons.favorite, color: Colors.red), - const SizedBox(width: 18), - Text(L10n.of(context).donate), - ], - ), - ), PopupMenuItem( value: SettingsAction.settings, child: Row( @@ -90,6 +79,16 @@ class ClientChooserButton extends StatelessWidget { ], ), ), + PopupMenuItem( + value: SettingsAction.support, + child: Row( + children: [ + Icon(Icons.volunteer_activism, color: Colors.red), + const SizedBox(width: 18), + Text(L10n.of(context).supportFluffyChat), + ], + ), + ), const PopupMenuDivider(), for (final bundle in bundles) ...[ if (matrix.accountBundles[bundle]!.length != 1 || From 9ede56427f348f09d07b4c3b352e7005e65e07ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 12 Mar 2026 17:55:50 +0100 Subject: [PATCH 263/333] chore: Login with localhost --- lib/pages/sign_in/view_model/sign_in_view_model.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart index 411dcc50..3f5fbfa5 100644 --- a/lib/pages/sign_in/view_model/sign_in_view_model.dart +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -39,7 +39,7 @@ class SignInViewModel extends ValueNotifier { .toList() ?? []; if (filterText.length >= 3 && - filterText.contains('.') && + (filterText.contains('.') || filterText == 'localhost') && Uri.tryParse(filterText) != null && !filteredPublicHomeservers.any( (homeserver) => homeserver.name == filterText, From 54ba19d39e8aa7b7d40156f740ee1ce071b1560b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 13 Mar 2026 08:30:47 +0100 Subject: [PATCH 264/333] chore: Adjust support button design --- lib/config/app_config.dart | 2 - lib/config/setting_keys.dart | 4 +- lib/l10n/intl_en.arb | 7 +- lib/pages/chat_list/chat_list.dart | 69 +++++++++++++++++++ .../chat_list/client_chooser_button.dart | 7 +- macos/Podfile.lock | 8 +-- 6 files changed, 83 insertions(+), 14 deletions(-) diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 6e53d61b..8eae9406 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -37,8 +37,6 @@ abstract class AppConfig { static const String supportUrl = 'https://github.com/krille-chan/fluffychat/issues'; static const String changelogUrl = 'https://fluffy.chat/en/changelog/'; - static const String donationUrl = - 'https://fluffychat.im/faq/#how_can_i_support_fluffychat'; static const Set defaultReactions = {'👍', '❤️', '😂', '😮', '😢'}; diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 471f8897..6cbc1127 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -66,7 +66,9 @@ enum AppSettings { 'https://fluffychat.im/en/privacy', ), tos('chat.fluffy.tos_url', 'https://fluffychat.im/en/tos'), - sendTimelineEventTimeout('chat.fluffy.send_timeline_event_timeout', 15); + sendTimelineEventTimeout('chat.fluffy.send_timeline_event_timeout', 15), + lastSeenSupportBanner('chat.fluffy.last_seen_support_banner', 0), + supportBannerOptOut('chat.fluffy.support_banner_opt_out', false); final String key; final T defaultValue; diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index e88217c8..d99e59b8 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -2782,5 +2782,10 @@ }, "createNewChat": "Create new chat", "reset": "Reset", - "supportFluffyChat": "Support FluffyChat" + "supportFluffyChat": "Support FluffyChat", + "support": "Support", + "fluffyChatSupportBannerMessage": "FluffyChat needs YOUR help!\nFluffyChat will always be free, but development and hosting still cost money. The future of the project depends on support from people like you.", + "skipSupportingFluffyChat": "Skip supporting FluffyChat", + "iDoNotWantToSupport": "I do not want to support", + "iAlreadySupportFluffyChat": "I already support FluffyChat" } \ No newline at end of file diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 75181bf0..20705027 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -10,6 +10,7 @@ import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart' as sdk; import 'package:matrix/matrix.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart'; +import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -366,6 +367,7 @@ class ChatListController extends State _hackyWebRTCFixForWeb(); WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { + _showLastSeenSupportBanner(); searchServer = Matrix.of( context, ).store.getString(_serverStoreNamespace); @@ -390,6 +392,73 @@ class ChatListController extends State super.dispose(); } + Future _showLastSeenSupportBanner() async { + if (AppSettings.supportBannerOptOut.value) return; + + if (AppSettings.lastSeenSupportBanner.value == 0) { + await AppSettings.lastSeenSupportBanner.setItem( + DateTime.now().millisecondsSinceEpoch, + ); + return; + } + + final lastSeenSupportBanner = DateTime.fromMillisecondsSinceEpoch( + AppSettings.lastSeenSupportBanner.value, + ); + + if (DateTime.now().difference(lastSeenSupportBanner) >= + Duration(days: 6 * 7)) { + final messenger = ScaffoldMessenger.of(context); + messenger.showMaterialBanner( + MaterialBanner( + leading: CloseButton( + onPressed: () async { + final okCancelResult = await showOkCancelAlertDialog( + context: context, + title: L10n.of(context).skipSupportingFluffyChat, + message: L10n.of(context).fluffyChatSupportBannerMessage, + okLabel: L10n.of(context).iDoNotWantToSupport, + cancelLabel: L10n.of(context).iAlreadySupportFluffyChat, + isDestructive: true, + ); + switch (okCancelResult) { + case null: + return; + case OkCancelResult.ok: + messenger.clearMaterialBanners(); + return; + case OkCancelResult.cancel: + messenger.clearMaterialBanners(); + await AppSettings.supportBannerOptOut.setItem(true); + return; + } + }, + ), + content: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Text(L10n.of(context).fluffyChatSupportBannerMessage), + ), + actions: [ + TextButton( + onPressed: () { + messenger.clearMaterialBanners(); + launchUrlString( + 'https://fluffychat.im/faq/#how_can_i_support_fluffychat', + ); + }, + child: Text(L10n.of(context).support), + ), + ], + ), + ); + await AppSettings.lastSeenSupportBanner.setItem( + DateTime.now().millisecondsSinceEpoch, + ); + } + + return; + } + Future chatContextAction( Room room, BuildContext posContext, [ diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index f4093cb0..8cde34e1 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -4,7 +4,6 @@ import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; @@ -83,7 +82,7 @@ class ClientChooserButton extends StatelessWidget { value: SettingsAction.support, child: Row( children: [ - Icon(Icons.volunteer_activism, color: Colors.red), + Icon(Icons.favorite, color: Colors.red), const SizedBox(width: 18), Text(L10n.of(context).supportFluffyChat), ], @@ -223,7 +222,9 @@ class ClientChooserButton extends StatelessWidget { FluffyShare.shareInviteLink(context); break; case SettingsAction.support: - launchUrlString(AppConfig.donationUrl); + launchUrlString( + 'https://fluffychat.im/faq/#how_can_i_support_fluffychat', + ); break; case SettingsAction.settings: context.go('/rooms/settings'); diff --git a/macos/Podfile.lock b/macos/Podfile.lock index a4387410..e803f959 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,6 +1,4 @@ PODS: - - app_links (6.4.1): - - FlutterMacOS - audio_session (0.0.1): - FlutterMacOS - desktop_drop (0.0.1): @@ -76,7 +74,6 @@ PODS: - FlutterMacOS DEPENDENCIES: - - app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`) - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) - desktop_webview_window (from `Flutter/ephemeral/.symlinks/plugins/desktop_webview_window/macos`) @@ -114,8 +111,6 @@ SPEC REPOS: - WebRTC-SDK EXTERNAL SOURCES: - app_links: - :path: Flutter/ephemeral/.symlinks/plugins/app_links/macos audio_session: :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos desktop_drop: @@ -178,7 +173,6 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/window_to_front/macos SPEC CHECKSUMS: - app_links: 05a6ec2341985eb05e9f97dc63f5837c39895c3f audio_session: eaca2512cf2b39212d724f35d11f46180ad3a33e desktop_drop: 10a3e6a7fa9dbe350541f2574092fecfa345a07b desktop_webview_window: 7e37af677d6d19294cb433d9b1d878ef78dffa4d @@ -187,7 +181,7 @@ SPEC CHECKSUMS: emoji_picker_flutter: 51ca408e289d84d1e460016b2a28721ec754fcf7 file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a file_selector_macos: 9e9e068e90ebee155097d00e89ae91edb2374db7 - flutter_local_notifications: 4bf37a31afde695b56091b4ae3e4d9c7a7e6cda0 + flutter_local_notifications: 1fc7ffb10a83d6a2eeeeddb152d43f1944b0aad0 flutter_new_badger: 6fe9bf7e42793a164032c21f164c0ad9985cd0f2 flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23 flutter_vodozemac: fd2ea9cb3e2a37beaac883a369811fbfe042fc53 From 1f42aa3605f73077323cb8f713f993598b74fbcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 13 Mar 2026 08:44:01 +0100 Subject: [PATCH 265/333] build: Update dart to 3.11.1 --- pubspec.lock | 2 +- pubspec.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 14243b0e..ad35a381 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2267,5 +2267,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.10.3 <4.0.0" + dart: ">=3.11.1 <4.0.0" flutter: "3.41.4" diff --git a/pubspec.yaml b/pubspec.yaml index 7123f797..543a9097 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -7,8 +7,8 @@ publish_to: none version: 2.4.0+3546 environment: - sdk: ">=3.10.0 <4.0.0" - flutter: 3.41.4 + sdk: ">=3.11.1 <4.0.0" + flutter: "3.41.4" dependencies: archive: ^4.0.7 From 54a7b4ea69be776d6b822f536d76b1005a378c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 13 Mar 2026 09:16:54 +0100 Subject: [PATCH 266/333] chore: Add config search textfield --- lib/widgets/config_viewer.dart | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/lib/widgets/config_viewer.dart b/lib/widgets/config_viewer.dart index 8fb826d8..e357e34a 100644 --- a/lib/widgets/config_viewer.dart +++ b/lib/widgets/config_viewer.dart @@ -16,6 +16,8 @@ class ConfigViewer extends StatefulWidget { } class _ConfigViewerState extends State { + String _searchQuery = ''; + Future _changeSetting( AppSettings appSetting, SharedPreferences store, @@ -56,6 +58,14 @@ class _ConfigViewerState extends State { @override Widget build(BuildContext context) { final theme = Theme.of(context); + final normalizedQuery = _searchQuery.trim().toLowerCase(); + final filteredSettings = AppSettings.values + .where((setting) { + if (normalizedQuery.isEmpty) return true; + return setting.name.toLowerCase().contains(normalizedQuery); + }) + .toList(growable: false); + return Scaffold( appBar: AppBar( title: Text(L10n.of(context).advancedConfigurations), @@ -76,12 +86,29 @@ class _ConfigViewerState extends State { style: TextStyle(color: theme.colorScheme.onErrorContainer), ), ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: TextField( + onChanged: (value) => setState(() => _searchQuery = value), + decoration: InputDecoration( + hintText: 'Search config key', + prefixIcon: const Icon(Icons.search), + border: const OutlineInputBorder(), + isDense: true, + filled: true, + fillColor: theme.colorScheme.surfaceContainerHighest.withAlpha( + 128, + ), + ), + ), + ), + const SizedBox(height: 8), Expanded( child: ListView.builder( - itemCount: AppSettings.values.length, + itemCount: filteredSettings.length, itemBuilder: (context, i) { final store = Matrix.of(context).store; - final appSetting = AppSettings.values[i]; + final appSetting = filteredSettings[i]; var value = ''; if (appSetting is AppSettings) { value = appSetting.value; From 0294b8d29b631fbc19eee384510a030eb2c1a270 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 13 Mar 2026 10:02:07 +0100 Subject: [PATCH 267/333] chore(translations): Translated using Weblate (English) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/en/ --- lib/l10n/intl_en.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index d99e59b8..6fd8c9c9 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -2784,8 +2784,8 @@ "reset": "Reset", "supportFluffyChat": "Support FluffyChat", "support": "Support", - "fluffyChatSupportBannerMessage": "FluffyChat needs YOUR help!\nFluffyChat will always be free, but development and hosting still cost money. The future of the project depends on support from people like you.", + "fluffyChatSupportBannerMessage": "❤️❤️❤️ FluffyChat needs YOUR help! ❤️❤️❤️\n\nFluffyChat will always be free, but development and hosting still cost money.\nThe future of the project depends on support from people like you.", "skipSupportingFluffyChat": "Skip supporting FluffyChat", "iDoNotWantToSupport": "I do not want to support", "iAlreadySupportFluffyChat": "I already support FluffyChat" -} \ No newline at end of file +} From 1157cf96b3545874ba81f081bfb733020657d33f Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 13 Mar 2026 10:31:36 +0100 Subject: [PATCH 268/333] chore(translations): Translated using Weblate (German) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/ --- lib/l10n/intl_de.arb | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index b4e4c0a6..c51732ca 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -2787,5 +2787,24 @@ "join": "Beitreten", "searchOrEnterHomeserverAddress": "Homeserver-Adresse suchen oder eingeben", "matrixId": "Matrix ID", - "reset": "Zurücksetzen" -} \ No newline at end of file + "reset": "Zurücksetzen", + "setPowerLevel": "Power-Level einstellen", + "makeModerator": "Zum Moderator machen", + "makeAdmin": "Zum Admin machen", + "removeModeratorRights": "Moderatorenrechte entziehen", + "removeAdminRights": "Adminrechte entziehen", + "powerLevel": "Power-Level", + "setPowerLevelDescription": "Die Power-Level legen fest, was ein Mitglied in diesem Raum tun darf und liegen üblicherweise zwischen 0 und 100.", + "owner": "Besitzer", + "mute": "Stumm", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Neuen Chat erstellen", + "supportFluffyChat": "FluffyChat unterstützen", + "support": "Unterstützen", + "fluffyChatSupportBannerMessage": "❤️❤️❤️ FluffyChat braucht DEINE Hilfe! ❤️❤️❤️\n\nFluffyChat wird immer kostenlos bleiben, aber Entwicklung und Hosting kosten Geld.\nDie Zukunft des Projekts hängt von deiner Unterstützung ab.", + "skipSupportingFluffyChat": "FluffyChat unterstützen überspringen", + "iDoNotWantToSupport": "Ich möchte nicht unterstützen", + "iAlreadySupportFluffyChat": "I unterstütze FluffyChat bereits" +} From 46b1a4846d47b56dfd8d16f6011582073690cb6d Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 13 Mar 2026 12:32:09 +0100 Subject: [PATCH 269/333] chore(translations): Translated using Weblate (English) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/en/ --- lib/l10n/intl_en.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 6fd8c9c9..ce95fcd5 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -2784,7 +2784,7 @@ "reset": "Reset", "supportFluffyChat": "Support FluffyChat", "support": "Support", - "fluffyChatSupportBannerMessage": "❤️❤️❤️ FluffyChat needs YOUR help! ❤️❤️❤️\n\nFluffyChat will always be free, but development and hosting still cost money.\nThe future of the project depends on support from people like you.", + "fluffyChatSupportBannerMessage": "FluffyChat needs YOUR help!\n❤️❤️❤️\nFluffyChat will always be free, but development and hosting still cost money.\nThe future of the project depends on support from people like you.", "skipSupportingFluffyChat": "Skip supporting FluffyChat", "iDoNotWantToSupport": "I do not want to support", "iAlreadySupportFluffyChat": "I already support FluffyChat" From 77fbf33f9028b03c1611509f931610e0cae98359 Mon Sep 17 00:00:00 2001 From: Jelv Date: Fri, 13 Mar 2026 12:15:36 +0100 Subject: [PATCH 270/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 99.6% (750 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index 00ad6495..e3874c71 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -2791,5 +2791,9 @@ "description": "This should be a very short string because there is not much space in the button!" }, "createNewChat": "Creëer nieuw chat", - "reset": "Herstellen" -} \ No newline at end of file + "reset": "Herstellen", + "fluffyChatSupportBannerMessage": "Fluffy Chat heeft JOUW hulp nodig. _\n\nFluffyChat zal altijd gratis zijn, maar ontwikkeling en hosting kost geld.\nDe toekomst van het project hangt af van steun van mensen zoals jij.", + "skipSupportingFluffyChat": "FluffyChat steunen overslaan", + "iDoNotWantToSupport": "Ik wil niet ondersteunen", + "iAlreadySupportFluffyChat": "Ik steun FluffyChat al" +} From 25814f4a5244c8b116b32c45a18192b03fee63b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Fri, 13 Mar 2026 12:20:40 +0100 Subject: [PATCH 271/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 99.8% (752 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 161ce396..40ff855a 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -2792,5 +2792,11 @@ "description": "This should be a very short string because there is not much space in the button!" }, "createNewChat": "新建聊天", - "reset": "重置" -} \ No newline at end of file + "reset": "重置", + "supportFluffyChat": "支持 FluffyChat", + "support": "支持", + "fluffyChatSupportBannerMessage": "❤️❤️❤️ FluffyChat 需要您的帮助! ❤️❤️❤️\n\nFluffyChat 将始终免费,但开发和托管仍然要花钱。\n项目的未来仰赖像您这样的人的支持。", + "skipSupportingFluffyChat": "跳过支持 FluffyChar", + "iDoNotWantToSupport": "我不想支持", + "iAlreadySupportFluffyChat": "我已支持 FluffyChat" +} From f64cc1e996c3499399c16ba7520907a26225e00b Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 13 Mar 2026 12:32:39 +0100 Subject: [PATCH 272/333] chore(translations): Translated using Weblate (German) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/ --- lib/l10n/intl_de.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index c51732ca..73d0b091 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -2803,7 +2803,7 @@ "createNewChat": "Neuen Chat erstellen", "supportFluffyChat": "FluffyChat unterstützen", "support": "Unterstützen", - "fluffyChatSupportBannerMessage": "❤️❤️❤️ FluffyChat braucht DEINE Hilfe! ❤️❤️❤️\n\nFluffyChat wird immer kostenlos bleiben, aber Entwicklung und Hosting kosten Geld.\nDie Zukunft des Projekts hängt von deiner Unterstützung ab.", + "fluffyChatSupportBannerMessage": "FluffyChat braucht DEINE Hilfe!\n❤️❤️❤️\nFluffyChat wird immer kostenlos bleiben, aber Entwicklung und Hosting kosten Geld.\nDie Zukunft des Projekts hängt von deiner Unterstützung ab.", "skipSupportingFluffyChat": "FluffyChat unterstützen überspringen", "iDoNotWantToSupport": "Ich möchte nicht unterstützen", "iAlreadySupportFluffyChat": "I unterstütze FluffyChat bereits" From 3b204373e930a27a462e03c5982498416089e8e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 13 Mar 2026 12:30:41 +0100 Subject: [PATCH 273/333] chore: Make banner light red --- lib/pages/chat_list/chat_list.dart | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 20705027..5b11ab6d 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -408,10 +408,13 @@ class ChatListController extends State if (DateTime.now().difference(lastSeenSupportBanner) >= Duration(days: 6 * 7)) { + final theme = Theme.of(context); final messenger = ScaffoldMessenger.of(context); messenger.showMaterialBanner( MaterialBanner( + backgroundColor: theme.colorScheme.errorContainer, leading: CloseButton( + color: theme.colorScheme.onErrorContainer, onPressed: () async { final okCancelResult = await showOkCancelAlertDialog( context: context, @@ -436,7 +439,10 @@ class ChatListController extends State ), content: Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Text(L10n.of(context).fluffyChatSupportBannerMessage), + child: Text( + L10n.of(context).fluffyChatSupportBannerMessage, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), ), actions: [ TextButton( @@ -446,7 +452,10 @@ class ChatListController extends State 'https://fluffychat.im/faq/#how_can_i_support_fluffychat', ); }, - child: Text(L10n.of(context).support), + child: Text( + L10n.of(context).support, + style: TextStyle(color: theme.colorScheme.onErrorContainer), + ), ), ], ), From 06827038d8a74a6bebdc1fa095e3f9a4d94d89fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 13 Mar 2026 12:31:06 +0100 Subject: [PATCH 274/333] chore: Introduce tool versions file --- .github/workflows/integrate.yaml | 12 ++++++------ .github/workflows/main_deploy.yaml | 4 ++-- .github/workflows/release.yaml | 8 ++++---- .tool_versions.yaml | 2 ++ pubspec.lock | 2 +- pubspec.yaml | 1 - 6 files changed, 15 insertions(+), 14 deletions(-) create mode 100644 .tool_versions.yaml diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index fb84067d..d528928d 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -14,7 +14,7 @@ jobs: - run: git diff --exit-code - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml cache: true - name: Check for unused translations run: flutter pub run translations_cleaner list-unused-terms -a @@ -52,7 +52,7 @@ jobs: - uses: ./.github/actions/free_up_space - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml cache: true - uses: moonrepo/setup-rust@v1 with: @@ -80,7 +80,7 @@ jobs: - uses: actions/checkout@v6 - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml cache: true - uses: moonrepo/setup-rust@v1 - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu @@ -104,7 +104,7 @@ jobs: - uses: actions/checkout@v6 - name: Install dependencies run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y - - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < pubspec.yaml)" >> $GITHUB_ENV + - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV - name: Install Flutter run: | git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git @@ -120,7 +120,7 @@ jobs: - uses: actions/checkout@v6 - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml cache: true - name: Use Xcode 16.4 run: sudo xcode-select --switch /Applications/Xcode_16.4.app @@ -194,7 +194,7 @@ jobs: echo "Generated AVD snapshot for caching." - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml cache: true - uses: remarkablemark/setup-maestro-cli@v1 - name: Load integration test env diff --git a/.github/workflows/main_deploy.yaml b/.github/workflows/main_deploy.yaml index d01adfc8..a6ccda28 100644 --- a/.github/workflows/main_deploy.yaml +++ b/.github/workflows/main_deploy.yaml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v6 - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml - uses: moonrepo/setup-rust@v1 - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu - name: Prepare web @@ -41,7 +41,7 @@ jobs: - uses: actions/checkout@v6 - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml cache: true - name: Set up Ruby uses: ruby/setup-ruby@v1 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 82c421d6..5170c0d0 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v6 - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml cache: true - uses: moonrepo/setup-rust@v1 - run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu @@ -80,7 +80,7 @@ jobs: - uses: actions/checkout@v6 - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml cache: true - name: Add Firebase Messaging run: | @@ -115,7 +115,7 @@ jobs: - uses: actions/checkout@v6 - name: Install dependencies run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y - - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < pubspec.yaml)" >> $GITHUB_ENV + - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV - name: Install Flutter run: | git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git @@ -141,7 +141,7 @@ jobs: - uses: actions/checkout@v6 - uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version-file: .tool_versions.yaml cache: true - name: Set up Ruby uses: ruby/setup-ruby@v1 diff --git a/.tool_versions.yaml b/.tool_versions.yaml new file mode 100644 index 00000000..65c36746 --- /dev/null +++ b/.tool_versions.yaml @@ -0,0 +1,2 @@ +environment: + flutter: 3.41.4 \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index ad35a381..ea5bca89 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2268,4 +2268,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.11.1 <4.0.0" - flutter: "3.41.4" + flutter: ">=3.38.4" diff --git a/pubspec.yaml b/pubspec.yaml index 543a9097..8318eb40 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,6 @@ version: 2.4.0+3546 environment: sdk: ">=3.11.1 <4.0.0" - flutter: "3.41.4" dependencies: archive: ^4.0.7 From de96b27e292b0feb5aa2e1af05d05ae058c13681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 13 Mar 2026 16:14:39 +0100 Subject: [PATCH 275/333] build: Update matrix dart sdk to 6.2.0 --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index ea5bca89..5e86af6c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1080,10 +1080,10 @@ packages: dependency: "direct main" description: name: matrix - sha256: c0214ee99a73957d3c02d54a60afcf9acee577b0924749085d6fdf556e8eba42 + sha256: "5bb38e98212bc4c3244c762a1af787f7239a38d2cfdf44488258283ff899f77c" url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.2.0" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 8318eb40..f62b7373 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,7 +51,7 @@ dependencies: just_audio: ^0.10.5 latlong2: ^0.9.1 linkify: ^5.0.0 - matrix: ^6.1.1 + matrix: ^6.2.0 mime: ^2.0.0 native_imaging: ^0.4.0 opus_caf_converter_dart: ^1.0.1 From f961b2243576d8e3d2bf942ea51f240e8d6e52f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 13 Mar 2026 16:20:07 +0100 Subject: [PATCH 276/333] feat: Implement low priority for rooms --- lib/l10n/intl_en.arb | 4 +++- lib/pages/chat_list/chat_list.dart | 26 +++++++++++++++++++++++++ lib/pages/chat_list/chat_list_item.dart | 11 +++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index ce95fcd5..1ce086ee 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -2787,5 +2787,7 @@ "fluffyChatSupportBannerMessage": "FluffyChat needs YOUR help!\n❤️❤️❤️\nFluffyChat will always be free, but development and hosting still cost money.\nThe future of the project depends on support from people like you.", "skipSupportingFluffyChat": "Skip supporting FluffyChat", "iDoNotWantToSupport": "I do not want to support", - "iAlreadySupportFluffyChat": "I already support FluffyChat" + "iAlreadySupportFluffyChat": "I already support FluffyChat", + "setLowPriority": "Set low priority", + "unsetLowPriority": "Unset low priority" } diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 5b11ab6d..317a15aa 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -595,6 +595,25 @@ class ChatListController extends State ], ), ), + PopupMenuItem( + value: ChatContextAction.lowPriority, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.isLowPriority + ? Icons.low_priority + : Icons.low_priority_outlined, + ), + const SizedBox(width: 12), + Text( + room.isLowPriority + ? L10n.of(context).unsetLowPriority + : L10n.of(context).setLowPriority, + ), + ], + ), + ), if (spacesWithPowerLevels.isNotEmpty) PopupMenuItem( value: ChatContextAction.addToSpace, @@ -728,6 +747,12 @@ class ChatListController extends State context: context, future: () => space.setSpaceChild(room.id), ); + case ChatContextAction.lowPriority: + await showFutureLoadingDialog( + context: context, + future: () => room.setLowPriority(!room.isLowPriority), + ); + return; } } @@ -937,6 +962,7 @@ enum ChatContextAction { open, goToSpace, favorite, + lowPriority, markUnread, mute, leave, diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index b3082812..abe0cb87 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -191,6 +191,17 @@ class ChatListItem extends StatelessWidget { padding: EdgeInsets.only(left: 4.0), child: Icon(Icons.notifications_off_outlined, size: 16), ), + if (room.isLowPriority) + Padding( + padding: EdgeInsets.only( + right: hasNotifications ? 4.0 : 0.0, + ), + child: Icon( + Icons.low_priority, + size: 16, + color: theme.colorScheme.primary, + ), + ), if (room.isFavourite) Padding( padding: EdgeInsets.only( From c9e16cc4691cf3d2202179126b96a0c92a99c1e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Mar 2026 09:35:04 +0000 Subject: [PATCH 277/333] build: (deps): bump wakelock_plus from 1.4.0 to 1.5.0 Bumps [wakelock_plus](https://github.com/fluttercommunity/wakelock_plus) from 1.4.0 to 1.5.0. - [Commits](https://github.com/fluttercommunity/wakelock_plus/compare/wakelock_plus_1.4.0...wakelock_plus_1.5.0) --- updated-dependencies: - dependency-name: wakelock_plus dependency-version: 1.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 5e86af6c..cbc45a05 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2117,18 +2117,18 @@ packages: dependency: "direct main" description: name: wakelock_plus - sha256: "9296d40c9adbedaba95d1e704f4e0b434be446e2792948d0e4aa977048104228" + sha256: e4e125b7c1a2f0e491e5452afdc0e25ab77b2d2775a7caa231fcc1c1f2162c47 url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0" wakelock_plus_platform_interface: dependency: transitive description: name: wakelock_plus_platform_interface - sha256: "036deb14cd62f558ca3b73006d52ce049fabcdcb2eddfe0bf0fe4e8a943b5cf2" + sha256: "24b84143787220a403491c2e5de0877fbbb87baf3f0b18a2a988973863db4b03" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" watcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f62b7373..edbdd819 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -80,7 +80,7 @@ dependencies: url_launcher: ^6.3.2 video_compress: ^3.1.4 video_player: ^2.11.1 - wakelock_plus: ^1.3.3 + wakelock_plus: ^1.5.0 webrtc_interface: ^1.3.0 dev_dependencies: From 17b53049955ac5fbc5c55fb2b6c704583a250011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 13 Mar 2026 18:43:55 +0100 Subject: [PATCH 278/333] chore: Add changelog for 2.5.0 --- CHANGELOG.md | 159 ++++++++++++++++++++++++++++++++++++++++++++ pubspec.yaml | 2 +- snap/snapcraft.yaml | 2 +- 3 files changed, 161 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 989fe36f..8c71b8ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,162 @@ +## v2.5.0 +FluffyChat 2.5.0 introduces a new homeserver picker for onboarding, better image compression performance and several smaller new features, design adjustments and bug fixes. + +- feat: Add mute notification action (Christian Kußowski) +- feat: Add presetHomeserver config to enforce a homeserver for web (Christian Kußowski) +- feat: Display particle animation on login page (Christian Kußowski) +- feat: Display read receipts for every event (Christian Kußowski) +- feat: Enable audio recording on web (Christian Kußowski) +- feat: Implement low priority for rooms (Christian Kußowski) +- feat: Implement matrix native oidc (Christian Kußowski) +- feat: Implement new sign in flow (Christian Kußowski) +- feat: OIDC Login on same page (Christian Kußowski) +- feat: Reenable native imaging for all platforms (Christian Kußowski) +- feat: Remember last successful logged in homeserver (Christian Kußowski) +- Add lld to install custom dependency for Linux in README (Stephen) +- build: Add llvm-18 to packages for snap (krille-chan) +- build: Add maestro based integration tests (Christian Kußowski) +- chore(translations): Added translation using Weblate (Albanian) (Besnik Bleta) +- chore(translations): Added translation using Weblate (Kabyle) (Amadɣas) +- chore(translations): Translated using Weblate (Basque) (xabirequejo) +- chore(translations): Translated using Weblate (Catalan) (fadelkon) +- chore(translations): Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山) +- chore(translations): Translated using Weblate (Croatian) (Milo Ivir) +- chore(translations): Translated using Weblate (Czech) (Matyáš Caras) +- chore(translations): Translated using Weblate (Danish) (Øjvind Fritjof Arnfred) +- chore(translations): Translated using Weblate (Dutch) (Jelv) +- chore(translations): Translated using Weblate (English) (Christian) +- chore(translations): Translated using Weblate (English) (SpikyBee) +- chore(translations): Translated using Weblate (Estonian) (Priit Jõerüüt) +- chore(translations): Translated using Weblate (Galician) (josé m.) +- chore(translations): Translated using Weblate (Georgian) (Dimitri Tabatadze) +- chore(translations): Translated using Weblate (Georgian) (Temuri Doghonadze) +- chore(translations): Translated using Weblate (German) (Christian) +- chore(translations): Translated using Weblate (German) (Ettore Atalan) +- chore(translations): Translated using Weblate (German) (nautilusx) +- chore(translations): Translated using Weblate (Hindi) (Vishal Singh) +- chore(translations): Translated using Weblate (Indonesian) (Arif Budiman) +- chore(translations): Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin) +- chore(translations): Translated using Weblate (Japanese) (NPL) +- chore(translations): Translated using Weblate (Japanese) (Sayaka Halton) +- chore(translations): Translated using Weblate (Kabyle) (Amadɣas) +- chore(translations): Translated using Weblate (Kabyle) (ButterflyOfFire) +- chore(translations): Translated using Weblate (Kabyle) (Christian) +- chore(translations): Translated using Weblate (Latvian) (Edgars Andersons) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye) +- chore(translations): Translated using Weblate (Norwegian Bokmål) (sunniva) +- chore(translations): Translated using Weblate (Persian) (saok91) +- chore(translations): Translated using Weblate (Polish) (gredzikk) +- chore(translations): Translated using Weblate (Portuguese (Brazil)) (Logaritmica) +- chore(translations): Translated using Weblate (Russian) (-) +- chore(translations): Translated using Weblate (Russian) (Artem Pereverzev) +- chore(translations): Translated using Weblate (Russian) (mikinol) +- chore(translations): Translated using Weblate (Spanish) (Kimby) +- chore(translations): Translated using Weblate (Spanish) (SpikyBee) +- chore(translations): Translated using Weblate (Swedish) (Malva Jakobsson) +- chore(translations): Translated using Weblate (Swedish) (spinningpaprika) +- chore(translations): Translated using Weblate (Tamil) (தமிழ்நேரம்) +- chore(translations): Translated using Weblate (Ukrainian) (Andriy Kushnir) +- chore(translations): Translated using Weblate (Ukrainian) (Ihor Hordiichuk) +- chore(translations): Translated using Weblate (Uzbek) (BeMeritus) +- chore: Add config search textfield (Christian Kußowski) +- chore: Add matrix notify workflow (Christian Kußowski) +- chore: Add recommended homeservers (Christian Kußowski) +- chore: Add reset button for config viewer (Christian Kußowski) +- chore: Add support button everywhere (Christian Kußowski) +- chore: Added deeplinks to test protocol (Christian Kußowski) +- chore: Adjust avatar size and chat list item design (krille-chan) +- chore: Adjust chat input row design (Christian Kußowski) +- chore: Adjust design (Christian Kußowski) +- chore: Adjust design of navrail (Christian Kußowski) +- chore: Adjust design of space avatars and more (Christian Kußowski) +- chore: Adjust design of user viewer and popup buttons (Christian Kußowski) +- chore: Adjust join space child UX (Christian Kußowski) +- chore: Adjust paddings (krille-chan) +- chore: Adjust power level UX (Christian Kußowski) +- chore: Adjust search field design (Christian Kußowski) +- chore: Adjust status header design (Christian Kußowski) +- chore: Adjust styles and animations (Christian Kußowski) +- chore: Adjust support button design (Christian Kußowski) +- chore: Always show filter for messages (Christian Kußowski) +- chore: Avoid unnecessary lambdas (Christian Kußowski) +- chore: Better context menu for space children (Christian Kußowski) +- chore: bump ios version (ShootingStarDragons) +- chore: Check conventional commits in CI (krille-chan) +- chore: Check if pubspec.lock is up to date in CI (Christian Kußowski) +- chore: Check of unused localizations (Christian Kußowski) +- chore: Clean up pages build (Christian Kußowski) +- chore: Display spaces filter chip when spaces present even without children (Christian Kußowski) +- chore: Execute dart code linter in CI (Christian Kußowski) +- chore: Exempt assignees from stale (Christian Kußowski) +- chore: Fix oidc login on web (Christian Kußowski) +- chore: Give issues and PRs more time for stale (Christian Kußowski) +- chore: Hide homepage button if not preset (Christian Kußowski) +- chore: Hide status list by default (Christian Kußowski) +- chore: Implement pick SSO provider from dialog and add tchncs.de (Christian Kußowski) +- chore: Introduce tool versions file (Christian Kußowski) +- chore: Login with localhost (Christian Kußowski) +- chore: Make banner light red (Christian Kußowski) +- chore: Make key fingerprints in chat encryption page selectable (Christian Kußowski) +- chore: make sendTimelineEventTimeout configurable (Christian Kußowski) +- chore: Make unread bubble full round (Christian Kußowski) +- chore: Move file cache to subdirectory (Christian Kußowski) +- chore: Move show image viewer one step up (Christian Kußowski) +- chore: Move website back to fluffychat.im (Christian Kußowski) +- chore: Only show confirm dialog once (Christian Kußowski) +- chore: Put oidc behind a feature flag until fixed (Christian Kußowski) +- chore: Remove converser from recommended homeservers as it doesn't have open registration (Christian Kußowski) +- chore: Remove frei.chat from homeserver list (Christian Kußowski) +- chore: Remove web notification custom sound (Christian Kußowski) +- chore: Replace duplicate check for stale bot (Christian Kußowski) +- chore: Retry sign in tap in tests (Christian Kußowski) +- chore: Run matrix notification in pull request target (Christian Kußowski) +- chore: Sanitize hash param for oidc (Christian Kußowski) +- chore: Set erase flag true on account deactivation (krille-chan) +- chore: Set operations per run to 1000 (krille-chan) +- chore: Skip matrix notify for events from myself (Christian Kußowski) +- chore: Update locale config (Christian Kußowski) +- chore: Update matrix ID localization (Christian Kußowski) +- chore: Update recommended homeservers (Christian Kußowski) +- chore: Update redirect android scheme (Christian Kußowski) +- chore: Use fixed version of fcm shared isolate (Christian Kußowski) +- fix: Add app id to TileLayer user agent (Vespe-r) +- fix: Add missing @@locale (Krille-chan) +- fix: Audioplayer on web buggy (Christian Kußowski) +- fix: build failed on archlinux (ShootingStarDragons) +- fix: Do not cancel notification on reply (Christian Kußowski) +- fix: Do not display formatted body if body is just filename (Christian Kußowski) +- fix: Do not route to backup on soft logout (Christian Kußowski) +- fix: Edit space child button opens space details page and not space child details page (Christian Kußowski) +- fix: Fix formatting of messages with newlines (Philip Fritzsche) +- fix: get correct aspect ratio from VideoPlayerController (Matias) +- fix: Join room by alias even if not found (Christian Kußowski) +- fix: Open deep links (Christian Kußowski) +- fix: Receipt row not auto updating (Christian Kußowski) +- fix: Receipts disappear after reaction (Christian Kußowski) +- fix: Reply voice message displays a broken html body (Christian Kußowski) +- fix: Send reply to voice messages (Christian Kußowski) +- fix: Set mimetype for video player on web (Christian Kußowski) +- fix: Use correct own person for android notification replies (Christian Kußowski) +- fix: Wrong placeholder in kab (Christian Kußowski) +- refactor: Add Flutter lints (Christian Kußowski) +- refactor: Add more linter rules (Christian Kußowski) +- refactor: Add more stricter lints (Christian Kußowski) +- refactor: Avoid redundant async (Christian Kußowski) +- refactor: Avoid unnecessary bool comparison (Christian Kußowski) +- refactor: Better UX for create space children (Christian Kußowski) +- refactor: Disable custom image resizer for macOS and windows (Christian Kußowski) +- refactor: Do show message bubble even for big emotes (Christian Kußowski) +- refactor: Enable avoid-returning-widgets lint (Christian Kußowski) +- refactor: Enable more strict lints (Christian Kußowski) +- refactor: Enable rule avoid dynamic (Christian Kußowski) +- refactor: Make file events more fail safe for failed to send (Christian Kußowski) +- refactor: Remove animation dependency (Christian Kußowski) +- refactor: Remove unused localizations (Christian Kußowski) +- refactor: Remove unused translations (Christian Kußowski) +- refactor: Use getCryptoIdentityState to check backup state (krille-chan) +- refactor: Use more robust and performant way to detect single emoji messages (Christian Kußowski) +- refactor: Use native uri data from bytes instead of html (Christian Kußowski) + ## v2.4.0 FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to easily add your own sticker packs. diff --git a/pubspec.yaml b/pubspec.yaml index edbdd819..65fa697b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none # On version bump please also increase: # 1. The build number (for F-Droid) # 2. The version in /snap/snapcraft.yaml -version: 2.4.0+3546 +version: 2.5.0+3547 environment: sdk: ">=3.11.1 <4.0.0" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index ca9a0a16..8f58da35 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,7 +1,7 @@ name: fluffychat title: FluffyChat base: core24 -version: 2.4.0 +version: 2.5.0 license: AGPL-3.0 summary: The cutest messenger in the Matrix network description: | From ac24b86a3a9470daa3f765f2355a7b085369fd1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 13 Mar 2026 19:12:38 +0100 Subject: [PATCH 279/333] chore: Follow up low priority --- lib/pages/chat_list/chat_list.dart | 70 +++++++++++++++--------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 317a15aa..30aac367 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -578,42 +578,44 @@ class ChatListController extends State ], ), ), - PopupMenuItem( - value: ChatContextAction.favorite, - child: Row( - mainAxisSize: .min, - children: [ - Icon( - room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined, - ), - const SizedBox(width: 12), - Text( - room.isFavourite - ? L10n.of(context).unpin - : L10n.of(context).pin, - ), - ], + if (!room.isLowPriority) + PopupMenuItem( + value: ChatContextAction.favorite, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined, + ), + const SizedBox(width: 12), + Text( + room.isFavourite + ? L10n.of(context).unpin + : L10n.of(context).pin, + ), + ], + ), ), - ), - PopupMenuItem( - value: ChatContextAction.lowPriority, - child: Row( - mainAxisSize: .min, - children: [ - Icon( - room.isLowPriority - ? Icons.low_priority - : Icons.low_priority_outlined, - ), - const SizedBox(width: 12), - Text( - room.isLowPriority - ? L10n.of(context).unsetLowPriority - : L10n.of(context).setLowPriority, - ), - ], + if (!room.isFavourite) + PopupMenuItem( + value: ChatContextAction.lowPriority, + child: Row( + mainAxisSize: .min, + children: [ + Icon( + room.isLowPriority + ? Icons.low_priority + : Icons.low_priority_outlined, + ), + const SizedBox(width: 12), + Text( + room.isLowPriority + ? L10n.of(context).unsetLowPriority + : L10n.of(context).setLowPriority, + ), + ], + ), ), - ), if (spacesWithPowerLevels.isNotEmpty) PopupMenuItem( value: ChatContextAction.addToSpace, From f6a739b78ec57215113b855f03efc240b707d9a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sat, 14 Mar 2026 11:16:43 +0100 Subject: [PATCH 280/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index db7ed298..09e0c180 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -2798,5 +2798,11 @@ "description": "This should be a very short string because there is not much space in the button!" }, "createNewChat": "Cruthaigh comhrá nua", - "reset": "Athshocraigh" -} \ No newline at end of file + "reset": "Athshocraigh", + "supportFluffyChat": "Tacaigh le FluffyChat", + "support": "Tacaíocht", + "fluffyChatSupportBannerMessage": "Tá DO chabhair ag teastáil ó FluffyChat!\n❤️❤️❤️\nBeidh FluffyChat saor in aisce i gcónaí, ach cosnaíonn forbairt agus óstáil airgead fós.\nBraitheann todhchaí an tionscadail ar thacaíocht ó dhaoine cosúil leatsa.", + "skipSupportingFluffyChat": "Seachain tacú le FluffyChat", + "iDoNotWantToSupport": "Nílim ag iarraidh tacú leis", + "iAlreadySupportFluffyChat": "Tacaím le FluffyChat cheana féin" +} From 1bd1298443f5c6eef2a958c0d508542450916493 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 13 Mar 2026 17:40:13 +0100 Subject: [PATCH 281/333] chore(translations): Translated using Weblate (German) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/ --- lib/l10n/intl_de.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 73d0b091..80d52545 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -2780,7 +2780,7 @@ "createNewAccount": "Neues Konto erstellen", "signUpGreeting": "FluffyChat ist dezentral! Wähle einen Server, auf dem du dein Konto erstellen möchtest, und los geht's!", "signInGreeting": "Du hast bereits ein Konto bei Matrix? Willkommen zurück! Wähle deinen Homeserver aus und melde dich an.", - "appIntro": "Mit FluffyChat kannst du mit deinen Freunden chatten. Es ist ein sicherer, dezentralisierter [Matrix]-Messenger! Erfahre mehr auf https://matrix.org, wenn du möchtest, oder melde dich einfach an.", + "appIntro": "Mit FluffyChat kannst du mit deinen Freunden chatten. Es ist ein sicherer, dezentralisierter [Matrix]-Messenger! Erfahre mehr auf https://matrix.org wenn du möchtest, oder melde dich einfach an.", "theProcessWasCanceled": "Der Vorgang wurde abgebrochen.", "federationBaseUrl": "Basis-URL der Föderation", "clientWellKnownInformation": "Bekannte Informationen zum Client:", From 358c7f25d4ce58258a49ab895188f2146b87283a Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Sat, 14 Mar 2026 06:29:31 +0100 Subject: [PATCH 282/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index a3fad8ec..f7f0b366 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -2799,5 +2799,11 @@ "description": "This should be a very short string because there is not much space in the button!" }, "createNewChat": "Opprett ny chat", - "reset": "Nullstill" -} \ No newline at end of file + "reset": "Nullstill", + "supportFluffyChat": "Støtt FluffyChat", + "support": "Støtte", + "fluffyChatSupportBannerMessage": "FluffyChat trenger DIN hjelp!\n❤️❤️❤️\nFluffyChat vil alltid være gratis, men utvikling og drift koster fortsatt penger. \nProsjektets fremtid avhenger av støtte fra folk som deg.", + "skipSupportingFluffyChat": "Hopp over støtte til FluffyChat", + "iDoNotWantToSupport": "Jeg ønsker ikke å støtte", + "iAlreadySupportFluffyChat": "Jeg støtter allerede FluffyChat" +} From b333d78c8cdc45360ff8ef667955ef1516de44fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 13 Mar 2026 15:44:39 +0100 Subject: [PATCH 283/333] chore(translations): Translated using Weblate (Estonian) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/ --- lib/l10n/intl_et.arb | 49 +++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index 5dde2146..d04dfd7b 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -98,7 +98,7 @@ "type": "String", "placeholders": {} }, - "askSSSSSign": "Selleks, et teist osapoolt identifitseerivat allkirja anda, palun sisesta oma turvahoidla paroolifraas või taastevõti.", + "askSSSSSign": "Selleks, et teist osapoolt identifitseerivat allkirja anda, palun sisesta oma turvahoidla salafraas või taastevõti.", "@askSSSSSign": { "type": "String", "placeholders": {} @@ -339,7 +339,7 @@ "type": "String", "placeholders": {} }, - "changeTheNameOfTheGroup": "Muuda vestlusrühma nime", + "changeTheNameOfTheGroup": "Muuda jututoa nime", "@changeTheNameOfTheGroup": { "type": "String", "placeholders": {} @@ -489,7 +489,7 @@ "type": "String", "placeholders": {} }, - "contactHasBeenInvitedToTheGroup": "Sinu kontakt on kutsutud liituma vestlusrühma", + "contactHasBeenInvitedToTheGroup": "Sinu kontakt on kutsutud liituma jututoaga", "@contactHasBeenInvitedToTheGroup": { "type": "String", "placeholders": {} @@ -776,22 +776,22 @@ "type": "String", "placeholders": {} }, - "group": "Vestlusrühm", + "group": "Jututuba", "@group": { "type": "String", "placeholders": {} }, - "groupIsPublic": "Vestlusrühm on avalik", + "groupIsPublic": "Jututuba on avalik", "@groupIsPublic": { "type": "String", "placeholders": {} }, - "groups": "Vestlusrühmad", + "groups": "Jututoad", "@groups": { "type": "String", "placeholders": {} }, - "groupWith": "Vestlusrühm {displayname} kasutajanimega", + "groupWith": "Jututuba {displayname} kasutajanimega", "@groupWith": { "type": "String", "placeholders": { @@ -862,7 +862,7 @@ "type": "String", "placeholders": {} }, - "incorrectPassphraseOrKey": "Vigane paroolifraas või taastevõti", + "incorrectPassphraseOrKey": "Vigane salafraas või taastevõti", "@incorrectPassphraseOrKey": { "type": "String", "placeholders": {} @@ -877,7 +877,7 @@ "type": "String", "placeholders": {} }, - "inviteContactToGroup": "Kutsu sõpru ja tuttavaid {groupName} liikmeks", + "inviteContactToGroup": "Kutsu sõpru ja tuttavaid {groupName} jututoa liikmeks", "@inviteContactToGroup": { "type": "String", "placeholders": { @@ -1221,7 +1221,7 @@ "type": "String", "placeholders": {} }, - "passphraseOrKey": "paroolifraas või taastevõti", + "passphraseOrKey": "salafraas või taastevõti", "@passphraseOrKey": { "type": "String", "placeholders": {} @@ -1839,7 +1839,7 @@ "type": "String", "placeholders": {} }, - "whoIsAllowedToJoinThisGroup": "Kes võivad selle vestlusrühmaga liituda", + "whoIsAllowedToJoinThisGroup": "Kes võivad selle jututoaga liituda", "@whoIsAllowedToJoinThisGroup": { "type": "String", "placeholders": {} @@ -1927,7 +1927,7 @@ "type": "String", "description": "Usage hint for the command /dm" }, - "commandHint_create": "Loo tühi vestlusrühm\nKrüptimise keelamiseks kasuta --no-encryption võtit", + "commandHint_create": "Loo tühi jututuba\nKrüptimise keelamiseks kasuta --no-encryption võtit", "@commandHint_create": { "type": "String", "description": "Usage hint for the command /create" @@ -2049,7 +2049,7 @@ } } }, - "commandHint_markasgroup": "Märgi vestlusrühmaks", + "commandHint_markasgroup": "Märgi jututoaks", "commandHint_markasdm": "Märgi otsevestusluseks antud Matrixi ID jaoks", "whyIsThisMessageEncrypted": "Miks see sõnum pole loetav?", "noKeyForThisMessage": "See võib juhtuda, kui sõnum oli saadetud enne, kui siin seadmes oma kontoga sisse logisid.\n\nSamuti võib juhtuda siis, kui saatja on lugemises selles seadmes blokeerinud või on tekkinud tõrkeid veebiühenduses.\n\nAga mõnes teises seadmes saad seda sõnumit lugeda? Siis sa võid sõnumi sealt üle tõsta. Ava Seadistused -> Seadmed ning kontrolli, et kõik sinu seadmed on omavahel verifitseeritud. Kui avad selle vestluse või jututoa ning mõlemad sessioonid on avatud, siis vajalikud krüptovõtmed saadetakse automaatset.\n\nKas sa soovid vältida krüptovõtmete kadumist väljalogimisel ja seadmete vahetusel? Siis palun kontrolli, et seadistuses on krüptovõtmete varundus sisse lülitatud.", @@ -2130,7 +2130,7 @@ "importNow": "Impordi kohe", "importEmojis": "Impordi emojid", "sendTypingNotifications": "Saada kirjutamise teavitusi", - "createGroup": "Loo vestlusrühm", + "createGroup": "Loo jututuba", "tryAgain": "Proovi uuesti", "chatPermissions": "Vestluse õigused", "chatDescription": "Vestluse kirjeldus", @@ -2166,7 +2166,7 @@ } } }, - "inviteGroupChat": "📨 Kutse vestlusrühma", + "inviteGroupChat": "📨 Kutse jututuppa", "emoteKeyboardNoRecents": "Hiljuti kasutatud emotikonid kuvame siin...", "@emoteKeyboardNoRecents": { "type": "String", @@ -2201,9 +2201,9 @@ "pleaseEnterANumber": "Palun sisesta 0'st suurem number", "kickUserDescription": "See kasutaja on nüüd jutuoast välja müksatud, kuid talle pole seatud suhtluskeeldu. Avaliku jututoa puhul saab ta alati uuesti liituda.", "blockListDescription": "Sul on võimalik blokeerida neid kasutajaid, kes sind segavad. Oma isiklikku blokerimisloendisse lisatud kasutajad ei saa sulle saata sõnumeid ega kutseid.", - "createGroupAndInviteUsers": "Lisavestlusrühm ja kutsu sinna kasutajaid", + "createGroupAndInviteUsers": "Lisa jututuba ja kutsu sinna kasutajaid", "blockedUsers": "Blokeeritud kasutajad", - "groupCanBeFoundViaSearch": "Vestlusrühm on leitav otsinguga", + "groupCanBeFoundViaSearch": "Jututuba on leitav otsinguga", "noUsersFoundWithQuery": "Päringuga „{query}“ ei leidunud kahkus ühtegi kasutajat. Palun kontrolli, et päringus poleks vigu.", "@noUsersFoundWithQuery": { "type": "String", @@ -2218,7 +2218,7 @@ "commandHint_sendraw": "Saada json oma algupärasel kujul", "wrongRecoveryKey": "Vabandust..., see ei tundu olema korrektne taastevõti.", "blockUsername": "Eira kasutajanime", - "groupName": "Vestlusrühma nimi", + "groupName": "Jututoa nimi", "databaseMigrationTitle": "Andmebaas on optimeeritud", "searchChatsRooms": "Otsi #vestlusi, @kasutajaid...", "databaseMigrationBody": "Palun oota üks hetk. Natuke võib kuluda aega.", @@ -2442,7 +2442,7 @@ "changeGeneralChatSettings": "Muuda vestluse üldiseid seadistusi", "inviteOtherUsers": "Kutsu teisi osalejaid sellesse vestlusesse", "changeTheChatPermissions": "Muuda vestluse õigusi", - "changeTheDescriptionOfTheGroup": "Muuda vestluse kirjeldust", + "changeTheDescriptionOfTheGroup": "Muuda vestluse/jututoa kirjeldust", "chatPermissionsDescription": "Määra erinevatele kasutajatele selles vestluses vajalikud õigused. Tüüpiliselt on need 0, 50 ja 100 (vastavalt kasutajad, moderaatorid ja peakasutajad), kuid igasugused vahepealsed variatsioonid on ka võimalikud.", "invitedBy": "📩 Kutsujaks {user}", "@invitedBy": { @@ -2791,5 +2791,12 @@ "@mute": { "description": "This should be a very short string because there is not much space in the button!" }, - "createNewChat": "Loo uus vestlus" -} \ No newline at end of file + "createNewChat": "Loo uus vestlus", + "reset": "Lähtesta", + "supportFluffyChat": "Toeta FluffyChati", + "support": "Toeta meid", + "iAlreadySupportFluffyChat": "Ma juba toetan FluffyChati arendust", + "fluffyChatSupportBannerMessage": "FluffyChat vajab SINU abi!\n❤️❤️❤️\nFluffyChat jääb alati vabaks ja vabalt saadavaks, aga arendus ja serveriteenused vajavad ikkagi rahastamist.\nMeie projekti tulevik sõltub sinust ja teistest kasutajatest, nagu sina.", + "skipSupportingFluffyChat": "Jäta FluffyChati toetamine vahele", + "iDoNotWantToSupport": "Ma ei soovi toetada" +} From df9325a5e44a4edc11a52b73f9f310d9e00c365e Mon Sep 17 00:00:00 2001 From: Jelv Date: Sat, 14 Mar 2026 09:33:25 +0100 Subject: [PATCH 284/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index e3874c71..a6ca78a7 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -2792,8 +2792,10 @@ }, "createNewChat": "Creëer nieuw chat", "reset": "Herstellen", - "fluffyChatSupportBannerMessage": "Fluffy Chat heeft JOUW hulp nodig. _\n\nFluffyChat zal altijd gratis zijn, maar ontwikkeling en hosting kost geld.\nDe toekomst van het project hangt af van steun van mensen zoals jij.", + "fluffyChatSupportBannerMessage": "Fluffy Chat heeft JOUW hulp nodig. _\n❤️❤️❤️\nFluffyChat zal altijd gratis zijn, maar ontwikkeling en hosting kost geld.\nDe toekomst van het project hangt af van steun van mensen zoals jij.", "skipSupportingFluffyChat": "FluffyChat steunen overslaan", "iDoNotWantToSupport": "Ik wil niet ondersteunen", - "iAlreadySupportFluffyChat": "Ik steun FluffyChat al" + "iAlreadySupportFluffyChat": "Ik steun FluffyChat al", + "supportFluffyChat": "FluffyChat steunen", + "support": "Steunen" } From b8a2d19d2fe5b410a2508948952fe1596128e5a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Fri, 13 Mar 2026 12:46:57 +0100 Subject: [PATCH 285/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 40ff855a..d12a454a 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -2795,7 +2795,7 @@ "reset": "重置", "supportFluffyChat": "支持 FluffyChat", "support": "支持", - "fluffyChatSupportBannerMessage": "❤️❤️❤️ FluffyChat 需要您的帮助! ❤️❤️❤️\n\nFluffyChat 将始终免费,但开发和托管仍然要花钱。\n项目的未来仰赖像您这样的人的支持。", + "fluffyChatSupportBannerMessage": "FluffyChat 需要您的帮助!\n❤️❤️❤️\nFluffyChat 将始终免费,但开发和托管仍然要花钱。\n项目的未来仰赖像您这样的人的支持。", "skipSupportingFluffyChat": "跳过支持 FluffyChar", "iDoNotWantToSupport": "我不想支持", "iAlreadySupportFluffyChat": "我已支持 FluffyChat" From f6c4e693022a5701c60125edd9acccaa73430722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m=2E?= Date: Fri, 13 Mar 2026 15:00:24 +0100 Subject: [PATCH 286/333] chore(translations): Translated using Weblate (Galician) Currently translated at 100.0% (753 of 753 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/ --- lib/l10n/intl_gl.arb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index 6c19e5fa..98270a46 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -2791,5 +2791,12 @@ "@mute": { "description": "This should be a very short string because there is not much space in the button!" }, - "createNewChat": "Crear nova conversa" -} \ No newline at end of file + "createNewChat": "Crear nova conversa", + "reset": "Restablecer", + "supportFluffyChat": "Apoia a FluffyChat", + "support": "Axuda", + "fluffyChatSupportBannerMessage": "FluffyChat precisa a TÚA axuda!\n❤️❤️❤️\nFluffyChat vai ser sempre gratuíta, pero o desenvolvemento e a hospedaxe costan cartos.\nO futuro do proxecto depende da axuda de persoas coma ti.", + "skipSupportingFluffyChat": "Omitir apoiar a FluffyChat", + "iDoNotWantToSupport": "Non quero axudar", + "iAlreadySupportFluffyChat": "Xa apoiei a FluffyChat" +} From f9bb2715b06ee7d54be4455c72940c8b131c388f Mon Sep 17 00:00:00 2001 From: Aegeontis <140899260+Aegeontis@users.noreply.github.com> Date: Sat, 14 Mar 2026 16:26:12 +0100 Subject: [PATCH 287/333] fix: invert condition for creating voipPlugin --- lib/widgets/matrix.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 252ab213..0e322e10 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -339,7 +339,7 @@ class MatrixState extends State with WidgetsBindingObserver { } Future createVoipPlugin() async { - if (AppSettings.experimentalVoip.value) { + if (!AppSettings.experimentalVoip.value) { voipPlugin = null; return; } From dda8e6cbc7177a297db49012fc92deeead6029c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Sat, 14 Mar 2026 13:30:30 +0100 Subject: [PATCH 288/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (755 of 755 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index d12a454a..be172484 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -2798,5 +2798,7 @@ "fluffyChatSupportBannerMessage": "FluffyChat 需要您的帮助!\n❤️❤️❤️\nFluffyChat 将始终免费,但开发和托管仍然要花钱。\n项目的未来仰赖像您这样的人的支持。", "skipSupportingFluffyChat": "跳过支持 FluffyChar", "iDoNotWantToSupport": "我不想支持", - "iAlreadySupportFluffyChat": "我已支持 FluffyChat" + "iAlreadySupportFluffyChat": "我已支持 FluffyChat", + "setLowPriority": "设置低优先级", + "unsetLowPriority": "取消设置低优先级" } From eab984541e5edd769ba5aa8cc4202e9f0f2faa62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m=2E?= Date: Sat, 14 Mar 2026 19:10:31 +0100 Subject: [PATCH 289/333] chore(translations): Translated using Weblate (Galician) Currently translated at 100.0% (755 of 755 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/ --- lib/l10n/intl_gl.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index 98270a46..aac975fb 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -2798,5 +2798,7 @@ "fluffyChatSupportBannerMessage": "FluffyChat precisa a TÚA axuda!\n❤️❤️❤️\nFluffyChat vai ser sempre gratuíta, pero o desenvolvemento e a hospedaxe costan cartos.\nO futuro do proxecto depende da axuda de persoas coma ti.", "skipSupportingFluffyChat": "Omitir apoiar a FluffyChat", "iDoNotWantToSupport": "Non quero axudar", - "iAlreadySupportFluffyChat": "Xa apoiei a FluffyChat" + "iAlreadySupportFluffyChat": "Xa apoiei a FluffyChat", + "setLowPriority": "Establecer prioridade baixa", + "unsetLowPriority": "Non establecer prioridade baixa" } From 682090c6d751be70dbe394b93d96d66a64aa43f8 Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Mon, 16 Mar 2026 06:09:28 +0100 Subject: [PATCH 290/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (755 of 755 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index f7f0b366..085b157b 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -2805,5 +2805,7 @@ "fluffyChatSupportBannerMessage": "FluffyChat trenger DIN hjelp!\n❤️❤️❤️\nFluffyChat vil alltid være gratis, men utvikling og drift koster fortsatt penger. \nProsjektets fremtid avhenger av støtte fra folk som deg.", "skipSupportingFluffyChat": "Hopp over støtte til FluffyChat", "iDoNotWantToSupport": "Jeg ønsker ikke å støtte", - "iAlreadySupportFluffyChat": "Jeg støtter allerede FluffyChat" + "iAlreadySupportFluffyChat": "Jeg støtter allerede FluffyChat", + "setLowPriority": "Sett lav prioritet", + "unsetLowPriority": "Fjern lav prioritet" } From 0134e9c3674de6d9780d3e52cfa8be1ce78e818b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Sun, 15 Mar 2026 07:40:37 +0100 Subject: [PATCH 291/333] chore(translations): Translated using Weblate (Estonian) Currently translated at 100.0% (755 of 755 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/ --- lib/l10n/intl_et.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index d04dfd7b..7357fe1c 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -2798,5 +2798,7 @@ "iAlreadySupportFluffyChat": "Ma juba toetan FluffyChati arendust", "fluffyChatSupportBannerMessage": "FluffyChat vajab SINU abi!\n❤️❤️❤️\nFluffyChat jääb alati vabaks ja vabalt saadavaks, aga arendus ja serveriteenused vajavad ikkagi rahastamist.\nMeie projekti tulevik sõltub sinust ja teistest kasutajatest, nagu sina.", "skipSupportingFluffyChat": "Jäta FluffyChati toetamine vahele", - "iDoNotWantToSupport": "Ma ei soovi toetada" + "iDoNotWantToSupport": "Ma ei soovi toetada", + "setLowPriority": "Märgi vähetähtsaks", + "unsetLowPriority": "Eemalda märkimine vähetähtsaks" } From 14ef8a1d0e9bb839c0225c143999e01b34cc0090 Mon Sep 17 00:00:00 2001 From: Jelv Date: Sun, 15 Mar 2026 14:57:35 +0100 Subject: [PATCH 292/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (755 of 755 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index a6ca78a7..4896a6e3 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -2797,5 +2797,7 @@ "iDoNotWantToSupport": "Ik wil niet ondersteunen", "iAlreadySupportFluffyChat": "Ik steun FluffyChat al", "supportFluffyChat": "FluffyChat steunen", - "support": "Steunen" + "support": "Steunen", + "setLowPriority": "Lage prioriteit instellen", + "unsetLowPriority": "Lage prioriteit uitschakelen" } From 9e2953350215d6cda45bea11d5c4ab24ef46544a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 16 Mar 2026 09:17:00 +0100 Subject: [PATCH 293/333] chore: Fix releas web job --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 5170c0d0..56c3800c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -48,7 +48,7 @@ jobs: asset_content_type: application/gzip - name: Clone fluffychat website run: | - git@github.com:krille-chan/fluffychat-website.git + git clone https://github.com/krille-chan/fluffychat-website.git cp CHANGELOG.md fluffychat-website/ cp PRIVACY.md fluffychat-website/ - name: Build website From 7128ba98b2f0acf084e54e197aedac7a0ee3cc90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 16 Mar 2026 09:43:16 +0100 Subject: [PATCH 294/333] refactor: Remove unused dependencies and add CI check --- .github/workflows/integrate.yaml | 4 + dart_dependency_validator.yaml | 3 + pubspec.lock | 83 +------------------ pubspec.yaml | 5 -- .../flutter/generated_plugin_registrant.cc | 3 - windows/flutter/generated_plugins.cmake | 1 - 6 files changed, 9 insertions(+), 90 deletions(-) create mode 100644 dart_dependency_validator.yaml diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index d528928d..97a56b04 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -28,6 +28,10 @@ jobs: - name: Check license compliance run: dart run license_checker check-licenses -c licenses.yaml --problematic - run: flutter analyze + - name: Search unused dependencies + run: | + dart pub global activate dependency_validator + dart pub global run dependency_validator - run: dart run dart_code_linter:metrics analyze lib --reporter=github - run: dart run dart_code_linter:metrics check-unused-code lib - run: dart run dart_code_linter:metrics check-unused-files lib diff --git a/dart_dependency_validator.yaml b/dart_dependency_validator.yaml new file mode 100644 index 00000000..3655d235 --- /dev/null +++ b/dart_dependency_validator.yaml @@ -0,0 +1,3 @@ +ignore: + - handy_window + - sqlcipher_flutter_libs \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index cbc45a05..08fd79c7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -242,7 +242,7 @@ packages: source: hosted version: "1.0.2" cupertino_icons: - dependency: "direct main" + dependency: transitive description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 @@ -462,11 +462,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_driver: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" flutter_foreground_task: dependency: "direct main" description: @@ -674,11 +669,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" - fuchsia_remote_debug_protocol: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" geoclue: dependency: transitive description: @@ -911,11 +901,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.6.0" - integration_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" intl: dependency: "direct main" description: @@ -1013,7 +998,7 @@ packages: source: hosted version: "1.6.2" linkify: - dependency: "direct main" + dependency: transitive description: name: linkify sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832" @@ -1252,54 +1237,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 - url: "https://pub.dev" - source: hosted - version: "12.0.1" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" - url: "https://pub.dev" - source: hosted - version: "13.0.1" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 - url: "https://pub.dev" - source: hosted - version: "9.4.7" - permission_handler_html: - dependency: transitive - description: - name: permission_handler_html - sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.dev" - source: hosted - version: "0.1.3+5" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.dev" - source: hosted - version: "4.3.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.dev" - source: hosted - version: "0.2.1" petitparser: dependency: transitive description: @@ -1801,14 +1738,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.0" - sync_http: - dependency: transitive - description: - name: sync_http - sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" - url: "https://pub.dev" - source: hosted - version: "0.3.1" synchronized: dependency: transitive description: @@ -2170,14 +2099,6 @@ packages: url: "https://github.com/google/webcrypto.dart.git" source: git version: "0.6.0" - webdriver: - dependency: transitive - description: - name: webdriver - sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade" - url: "https://pub.dev" - source: hosted - version: "3.1.0" webkit_inspection_protocol: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 65fa697b..cee10f98 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,6 @@ dependencies: chewie: ^1.13.0 collection: ^1.18.0 cross_file: ^0.3.5 - cupertino_icons: any desktop_drop: ^0.7.0 desktop_notifications: ^0.6.3 device_info_plus: ^12.3.0 @@ -50,7 +49,6 @@ dependencies: intl: any just_audio: ^0.10.5 latlong2: ^0.9.1 - linkify: ^5.0.0 matrix: ^6.2.0 mime: ^2.0.0 native_imaging: ^0.4.0 @@ -59,7 +57,6 @@ dependencies: particles_network: ^1.9.3 path: ^1.9.0 path_provider: ^2.1.2 - permission_handler: ^12.0.1 pretty_qr_code: ^3.6.0 provider: ^6.0.2 punycode: ^1.0.0 @@ -90,8 +87,6 @@ dev_dependencies: flutter_test: sdk: flutter import_sorter: ^4.6.0 - integration_test: - sdk: flutter license_checker: ^1.6.2 translations_cleaner: ^0.1.1 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 42b9ae09..3d960ade 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -41,8 +40,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); GeolocatorWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("GeolocatorWindows")); - PermissionHandlerWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); RecordWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 93b91c2e..bcdc0344 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -11,7 +11,6 @@ list(APPEND FLUTTER_PLUGIN_LIST flutter_secure_storage_windows flutter_webrtc geolocator_windows - permission_handler_windows record_windows screen_retriever_windows share_plus From 9fde066a5b98dc884e9682d1403a76f70490252c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 16 Mar 2026 13:09:53 +0100 Subject: [PATCH 295/333] build: Add changelog --- .../fastlane/metadata/android/en-US/changelogs/default.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/android/fastlane/metadata/android/en-US/changelogs/default.txt b/android/fastlane/metadata/android/en-US/changelogs/default.txt index 5eed864e..82538b07 100644 --- a/android/fastlane/metadata/android/en-US/changelogs/default.txt +++ b/android/fastlane/metadata/android/en-US/changelogs/default.txt @@ -1,4 +1,3 @@ -FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to -easily add your own sticker packs. -It also improves the search and image gallery in chats, especially encrypted chats. -Besides that this update comes with a lot of fixes and improvements under the hood. \ No newline at end of file +FluffyChat 2.5.0 introduces a new homeserver picker for onboarding, +better image compression performance and several smaller new features, +design adjustments and bug fixes. \ No newline at end of file From 64140f5781e44548db326c362645a79d5c86f46b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:41:20 +0000 Subject: [PATCH 296/333] build: (deps): bump webrtc_interface from 1.4.0 to 1.5.1 Bumps webrtc_interface from 1.4.0 to 1.5.1. --- updated-dependencies: - dependency-name: webrtc_interface dependency-version: 1.5.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 08fd79c7..3b6c6ab6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2119,10 +2119,10 @@ packages: dependency: "direct main" description: name: webrtc_interface - sha256: ad0e5786b2acd3be72a3219ef1dde9e1cac071cf4604c685f11b61d63cdd6eb3 + sha256: c6f100eac5057d9a817a60473126f9828c796d42884d498af4f339c97b21014f url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.1" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index cee10f98..d162429e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -78,7 +78,7 @@ dependencies: video_compress: ^3.1.4 video_player: ^2.11.1 wakelock_plus: ^1.5.0 - webrtc_interface: ^1.3.0 + webrtc_interface: ^1.5.1 dev_dependencies: dart_code_linter: ^3.2.1 From baf67c365d6da6cd8cdc599a4779565bad0e2c9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 17 Mar 2026 10:40:05 +0100 Subject: [PATCH 297/333] chore: Add vs code settings --- .vscode/settings.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..d7e23866 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "emeraldwalk.runonsave": { + "commands": [ + { + "match": "\\.dart$", + "cmd": "dart run import_sorter:main --no-comments ${fileBasename}" + } + ] + } +} \ No newline at end of file From 11649dd01e9e127108277d22851a06f3484531c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 17 Mar 2026 10:40:35 +0100 Subject: [PATCH 298/333] build: Increase build number fixes https://github.com/krille-chan/fluffychat/issues/2720 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index cee10f98..6776ec92 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none # On version bump please also increase: # 1. The build number (for F-Droid) # 2. The version in /snap/snapcraft.yaml -version: 2.5.0+3547 +version: 2.5.0+3550 environment: sdk: ">=3.11.1 <4.0.0" From 5c45e797f22e982e751375d7a4025b0be369b27b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Mon, 16 Mar 2026 12:24:16 +0100 Subject: [PATCH 299/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (755 of 755 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index 09e0c180..15dc3a0b 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -2804,5 +2804,7 @@ "fluffyChatSupportBannerMessage": "Tá DO chabhair ag teastáil ó FluffyChat!\n❤️❤️❤️\nBeidh FluffyChat saor in aisce i gcónaí, ach cosnaíonn forbairt agus óstáil airgead fós.\nBraitheann todhchaí an tionscadail ar thacaíocht ó dhaoine cosúil leatsa.", "skipSupportingFluffyChat": "Seachain tacú le FluffyChat", "iDoNotWantToSupport": "Nílim ag iarraidh tacú leis", - "iAlreadySupportFluffyChat": "Tacaím le FluffyChat cheana féin" + "iAlreadySupportFluffyChat": "Tacaím le FluffyChat cheana féin", + "setLowPriority": "Socraigh tosaíocht íseal", + "unsetLowPriority": "Díshuiteáil tosaíocht íseal" } From 8643d35a1e9e820596a735696126232c59810c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 18 Mar 2026 08:36:33 +0100 Subject: [PATCH 300/333] chore: Follow up animate in --- lib/pages/chat/chat_event_list.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index 79cf5354..18da7f67 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -119,7 +119,9 @@ class ChatEventList extends StatelessWidget { // The message at this index: final event = events[i]; - final animateIn = i == 0 && controller.firstUpdateReceived; + final animateIn = + event.eventId == timeline.events.first.eventId && + controller.firstUpdateReceived; final nextEvent = i + 1 < events.length ? events[i + 1] : null; final previousEvent = i > 0 ? events[i - 1] : null; From 0a42f28cf113dfe2c692456d17cb7e3cc687a652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Thu, 19 Mar 2026 16:25:20 +0100 Subject: [PATCH 301/333] refactor: Switch from maestro to flutter integration tests --- .github/workflows/integrate.yaml | 54 +-- README.md | 14 + .../data/environment_constants.dart | 14 + integration_test/dendrite/data/dendrite.yaml | 327 ------------------ integration_test/flows/auth_flows.dart | 44 +++ integration_test/flows/basic_messaging.dart | 42 +++ .../flows/login_and_chat_backup.dart | 23 ++ integration_test/login.yaml | 36 -- integration_test/mobile_test.dart | 14 + .../utils/fluffy_chat_tester.dart | 117 +++++++ lib/main.dart | 11 +- lib/pages/bootstrap/bootstrap_dialog.dart | 52 ++- lib/pages/chat/chat_input_row.dart | 1 + lib/pages/chat/input_bar.dart | 1 + .../chat_list/client_chooser_button.dart | 31 +- lib/pages/settings/settings.dart | 1 - lib/pages/sign_in/sign_in_page.dart | 225 ++++++------ lib/utils/fluffy_share.dart | 11 +- .../show_ok_cancel_alert_dialog.dart | 2 + lib/widgets/future_loading_dialog.dart | 6 +- lib/widgets/matrix.dart | 1 - pubspec.lock | 31 ++ pubspec.yaml | 2 + scripts/create_fdroid_repos.sh | 67 ---- scripts/integration-check-release-build.sh | 26 -- scripts/integration-prepare-homeserver.sh | 11 - scripts/integration-prepare-host.sh | 6 - scripts/integration-server-conduit.sh | 12 - scripts/integration-server-dendrite.sh | 14 - scripts/integration-server-synapse.sh | 5 - scripts/integration-start-avd.sh | 4 - scripts/prepare-fdroid.sh | 12 - scripts/prepare_integration_test.sh | 23 ++ scripts/update-dependencies.sh | 6 - 34 files changed, 507 insertions(+), 739 deletions(-) create mode 100644 integration_test/data/environment_constants.dart delete mode 100644 integration_test/dendrite/data/dendrite.yaml create mode 100644 integration_test/flows/auth_flows.dart create mode 100644 integration_test/flows/basic_messaging.dart create mode 100644 integration_test/flows/login_and_chat_backup.dart delete mode 100644 integration_test/login.yaml create mode 100644 integration_test/mobile_test.dart create mode 100644 integration_test/utils/fluffy_chat_tester.dart delete mode 100755 scripts/create_fdroid_repos.sh delete mode 100755 scripts/integration-check-release-build.sh delete mode 100755 scripts/integration-prepare-homeserver.sh delete mode 100755 scripts/integration-prepare-host.sh delete mode 100755 scripts/integration-server-conduit.sh delete mode 100755 scripts/integration-server-dendrite.sh delete mode 100755 scripts/integration-server-synapse.sh delete mode 100755 scripts/integration-start-avd.sh delete mode 100755 scripts/prepare-fdroid.sh create mode 100755 scripts/prepare_integration_test.sh delete mode 100755 scripts/update-dependencies.sh diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 97a56b04..48d4975f 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -91,7 +91,7 @@ jobs: - run: flutter pub get - name: Prepare web run: ./scripts/prepare-web.sh - - run: flutter build web --dart-define=WITH_SEMANTICS=true + - run: flutter build web - name: Upload Web Build uses: actions/upload-artifact@v7 with: @@ -140,7 +140,7 @@ jobs: integration_test: runs-on: ubuntu-latest timeout-minutes: 60 - needs: [ build_debug_apk ] + needs: [ code_tests ] strategy: matrix: api-level: [34] @@ -151,10 +151,6 @@ jobs: AVD_CONFIG_PATH: "~/.android/avd/test.avd/config.ini" steps: - uses: actions/checkout@v6 - - uses: actions/download-artifact@v8 - with: - name: debug-apk-x64 - path: . - uses: ./.github/actions/free_up_space # https://github.blog/changelog/2023-02-23-hardware-accelerated-android-virtualization-on-actions-windows-and-linux-larger-hosted-runners/ - name: Enable KVM group perms @@ -200,26 +196,20 @@ jobs: with: flutter-version-file: .tool_versions.yaml cache: true - - uses: remarkablemark/setup-maestro-cli@v1 - - name: Load integration test env - run: cat integration_test/data/integration_users.env >> $GITHUB_ENV + - uses: moonrepo/setup-rust@v1 + with: + cache: true + - name: Cache Gradle + uses: actions/cache@v5 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: gradle-${{ runner.os }}- + - run: ./scripts/add-firebase-messaging.sh - name: Prepare Homeserver - run: | - docker run -d --name synapse --tmpfs /data \ - --volume="$(pwd)/integration_test/synapse/data/homeserver.yaml":/data/homeserver.yaml:rw \ - --volume="$(pwd)/integration_test/synapse/data/localhost.log.config":/data/localhost.log.config:rw \ - -p 80:80 matrixdotorg/synapse:latest - while ! curl -XGET "http://$HOMESERVER/_matrix/client/v3/login" >/dev/null 2>/dev/null; do - echo "Waiting for homeserver to be available... (GET http://$HOMESERVER/_matrix/client/v3/login)" - sleep 2 - done - - echo "Homeserver is online!" - - # create users - curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER1_NAME\", \"password\":\"$USER1_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" - curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER2_NAME\", \"password\":\"$USER2_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" - + run: ./scripts/prepare_integration_test.sh - name: Integration tests id: integration_tests uses: reactivecircus/android-emulator-runner@v2 @@ -234,16 +224,4 @@ jobs: ram-size: 4096M sdcard-path-or-size: 4096M emulator-options: -no-snapshot-save -no-window -wipe-data -accel on -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - script: | - flutter run --use-application-binary=$PWD/app-debug.apk > flutter_logs.txt 2>&1 & - FLUTTER_PID=$! - maestro test integration_test/login.yaml --env HOMESERVER=10.0.2.2 --env USER1_NAME=${USER1_NAME} --env USER1_PW=${USER1_PW} - kill $FLUTTER_PID 2>/dev/null || true - cp flutter_logs.txt ~/.maestro/tests/ - - name: Upload Flutter and Maestro logs - if: failure() - uses: actions/upload-artifact@v7 - with: - name: maestro-logs - path: ~/.maestro/tests - if-no-files-found: ignore \ No newline at end of file + script: flutter test integration_test/mobile_test.dart \ No newline at end of file diff --git a/README.md b/README.md index b118f085..50fccbfc 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,20 @@ flutter build windows --release flutter build macos --release ``` +## How to run integration tests + +You need to have docker installed locally! Run the preparation script before every test run: + +```sh +./scripts/prepare_integration_test.sh +``` + +Then run all tests with: + +```sh +flutter test integration_test/mobile_test.dart +``` + # Special thanks diff --git a/integration_test/data/environment_constants.dart b/integration_test/data/environment_constants.dart new file mode 100644 index 00000000..57e8f20a --- /dev/null +++ b/integration_test/data/environment_constants.dart @@ -0,0 +1,14 @@ +const homeserver = String.fromEnvironment( + 'HOMESERVER', + defaultValue: '10.0.2.2', +); +const user1Name = String.fromEnvironment('USER1_NAME', defaultValue: 'alice'); +const user1Pw = String.fromEnvironment( + 'USER1_PW', + defaultValue: 'AliceInWonderland', +); +const user2Name = String.fromEnvironment('USER2_NAME', defaultValue: 'bob'); +const user2Pw = String.fromEnvironment( + 'USER2_PW', + defaultValue: 'JoWirSchaffenDas', +); diff --git a/integration_test/dendrite/data/dendrite.yaml b/integration_test/dendrite/data/dendrite.yaml deleted file mode 100644 index f1e95fd4..00000000 --- a/integration_test/dendrite/data/dendrite.yaml +++ /dev/null @@ -1,327 +0,0 @@ -# This is the Dendrite configuration file. -# -# The configuration is split up into sections - each Dendrite component has a -# configuration section, in addition to the "global" section which applies to -# all components. - -# The version of the configuration file. -version: 2 - -# Global Matrix configuration. This configuration applies to all components. -global: - # The domain name of this homeserver. - server_name: localhost - - # The path to the signing private key file, used to sign requests and events. - # Note that this is NOT the same private key as used for TLS! To generate a - # signing key, use "./bin/generate-keys --private-key matrix_key.pem". - private_key: matrix_key.pem - - # The paths and expiry timestamps (as a UNIX timestamp in millisecond precision) - # to old signing private keys that were formerly in use on this domain. These - # keys will not be used for federation request or event signing, but will be - # provided to any other homeserver that asks when trying to verify old events. - old_private_keys: - # - private_key: old_matrix_key.pem - # expired_at: 1601024554498 - - # How long a remote server can cache our server signing key before requesting it - # again. Increasing this number will reduce the number of requests made by other - # servers for our key but increases the period that a compromised key will be - # considered valid by other homeservers. - key_validity_period: 168h0m0s - - # Global database connection pool, for PostgreSQL monolith deployments only. If - # this section is populated then you can omit the "database" blocks in all other - # sections. For polylith deployments, or monolith deployments using SQLite databases, - # you must configure the "database" block for each component instead. - database: - connection_string: - max_open_conns: - max_idle_conns: - conn_max_lifetime: - - # Configuration for in-memory caches. Caches can often improve performance by - # keeping frequently accessed items (like events, identifiers etc.) in memory - # rather than having to read them from the database. - cache: - # The estimated maximum size for the global cache in bytes, or in terabytes, - # gigabytes, megabytes or kilobytes when the appropriate 'tb', 'gb', 'mb' or - # 'kb' suffix is specified. Note that this is not a hard limit, nor is it a - # memory limit for the entire process. A cache that is too small may ultimately - # provide little or no benefit. - max_size_estimated: 1gb - - # The maximum amount of time that a cache entry can live for in memory before - # it will be evicted and/or refreshed from the database. Lower values result in - # easier admission of new cache entries but may also increase database load in - # comparison to higher values, so adjust conservatively. Higher values may make - # it harder for new items to make it into the cache, e.g. if new rooms suddenly - # become popular. - max_age: 1h - - # The server name to delegate server-server communications to, with optional port - # e.g. localhost:443 - well_known_server_name: "" - - # Lists of domains that the server will trust as identity servers to verify third - # party identifiers such as phone numbers and email addresses. - trusted_third_party_id_servers: - - matrix.org - - vector.im - - # Disables federation. Dendrite will not be able to communicate with other servers - # in the Matrix federation and the federation API will not be exposed. - disable_federation: false - - # Configures the handling of presence events. Inbound controls whether we receive - # presence events from other servers, outbound controls whether we send presence - # events for our local users to other servers. - presence: - enable_inbound: false - enable_outbound: false - - # Configures phone-home statistics reporting. These statistics contain the server - # name, number of active users and some information on your deployment config. - # We use this information to understand how Dendrite is being used in the wild. - report_stats: - enabled: false - endpoint: https://matrix.org/report-usage-stats/push - - # Server notices allows server admins to send messages to all users on the server. - server_notices: - enabled: false - # The local part, display name and avatar URL (as a mxc:// URL) for the user that - # will send the server notices. These are visible to all users on the deployment. - local_part: "_server" - display_name: "Server Alerts" - avatar_url: "" - # The room name to be used when sending server notices. This room name will - # appear in user clients. - room_name: "Server Alerts" - - # Configuration for NATS JetStream - jetstream: - # A list of NATS Server addresses to connect to. If none are specified, an - # internal NATS server will be started automatically when running Dendrite in - # monolith mode. For polylith deployments, it is required to specify the address - # of at least one NATS Server node. - addresses: - # - localhost:4222 - - # Persistent directory to store JetStream streams in. This directory should be - # preserved across Dendrite restarts. - storage_path: ./ - - # The prefix to use for stream names for this homeserver - really only useful - # if you are running more than one Dendrite server on the same NATS deployment. - topic_prefix: Dendrite - - # Configuration for Prometheus metric collection. - metrics: - enabled: false - basic_auth: - username: metrics - password: metrics - - # Optional DNS cache. The DNS cache may reduce the load on DNS servers if there - # is no local caching resolver available for use. - dns_cache: - enabled: false - cache_size: 256 - cache_lifetime: "5m" # 5 minutes; https://pkg.go.dev/time@master#ParseDuration - -# Configuration for the Appservice API. -app_service_api: - database: - connection_string: file:app_service_api.db - - # Disable the validation of TLS certificates of appservices. This is - # not recommended in production since it may allow appservice traffic - # to be sent to an insecure endpoint. - disable_tls_validation: true - - # Appservice configuration files to load into this homeserver. - config_files: - # - /path/to/appservice_registration.yaml - -# Configuration for the Client API. -client_api: - # Prevents new users from being able to register on this homeserver, except when - # using the registration shared secret below. - registration_disabled: false - - # Prevents new guest accounts from being created. Guest registration is also - # disabled implicitly by setting 'registration_disabled' above. - guests_disabled: true - - # If set, allows registration by anyone who knows the shared secret, regardless - # of whether registration is otherwise disabled. - registration_shared_secret: "" - - # Whether to require reCAPTCHA for registration. If you have enabled registration - # then this is HIGHLY RECOMMENDED to reduce the risk of your homeserver being used - # for coordinated spam attacks. - enable_registration_captcha: false - - # Settings for ReCAPTCHA. - recaptcha_public_key: "" - recaptcha_private_key: "" - recaptcha_bypass_secret: "" - recaptcha_siteverify_api: "" - - # TURN server information that this homeserver should send to clients. - turn: - turn_user_lifetime: "" - turn_uris: - # - turn:turn.server.org?transport=udp - # - turn:turn.server.org?transport=tcp - turn_shared_secret: "" - turn_username: "" - turn_password: "" - - # Settings for rate-limited endpoints. Rate limiting kicks in after the threshold - # number of "slots" have been taken by requests from a specific host. Each "slot" - # will be released after the cooloff time in milliseconds. Server administrators - # and appservice users are exempt from rate limiting by default. - rate_limiting: - enabled: true - threshold: 5 - cooloff_ms: 500 - exempt_user_ids: - # - "@user:domain.com" - -# Configuration for the Federation API. -federation_api: - database: - connection_string: file:federation_api.db - - # How many times we will try to resend a failed transaction to a specific server. The - # backoff is 2**x seconds, so 1 = 2 seconds, 2 = 4 seconds, 3 = 8 seconds etc. Once - # the max retries are exceeded, Dendrite will no longer try to send transactions to - # that server until it comes back to life and connects to us again. - send_max_retries: 16 - - # Disable the validation of TLS certificates of remote federated homeservers. Do not - # enable this option in production as it presents a security risk! - disable_tls_validation: false - - # Perspective keyservers to use as a backup when direct key fetches fail. This may - # be required to satisfy key requests for servers that are no longer online when - # joining some rooms. - key_perspectives: - - server_name: matrix.org - keys: - - key_id: ed25519:auto - public_key: Noi6WqcDj0QmPxCNQqgezwTlBKrfqehY1u2FyWP9uYw - - key_id: ed25519:a_RXGa - public_key: l8Hft5qXKn1vfHrg3p4+W8gELQVo8N13JkluMfmn2sQ - - # This option will control whether Dendrite will prefer to look up keys directly - # or whether it should try perspective servers first, using direct fetches as a - # last resort. - prefer_direct_fetch: false - -# Configuration for the Media API. -media_api: - database: - connection_string: file:media_api.db - - # Storage path for uploaded media. May be relative or absolute. - base_path: ./media_store - - # The maximum allowed file size (in bytes) for media uploads to this homeserver - # (0 = unlimited). If using a reverse proxy, ensure it allows requests at least - #this large (e.g. the client_max_body_size setting in nginx). - max_file_size_bytes: 10485760 - - # Whether to dynamically generate thumbnails if needed. - dynamic_thumbnails: false - - # The maximum number of simultaneous thumbnail generators to run. - max_thumbnail_generators: 10 - - # A list of thumbnail sizes to be generated for media content. - thumbnail_sizes: - - width: 32 - height: 32 - method: crop - - width: 96 - height: 96 - method: crop - - width: 640 - height: 480 - method: scale - -# Configuration for enabling experimental MSCs on this homeserver. -mscs: - database: - connection_string: file:mscs.db - mscs: - # - msc2836 # (Threading, see https://github.com/matrix-org/matrix-doc/pull/2836) - # - msc2946 # (Spaces Summary, see https://github.com/matrix-org/matrix-doc/pull/2946) - -# Configuration for the Sync API. -sync_api: - # This option controls which HTTP header to inspect to find the real remote IP - # address of the client. This is likely required if Dendrite is running behind - # a reverse proxy server. - # real_ip_header: X-Real-IP - database: - connection_string: file:sync_api.db - -key_server: - database: - connection_string: file:key_server.db - -room_server: - database: - connection_string: file:room_server.db - - -# Configuration for the User API. -user_api: - account_database: - connection_string: file:user_api.db - - # The cost when hashing passwords on registration/login. Default: 10. Min: 4, Max: 31 - # See https://pkg.go.dev/golang.org/x/crypto/bcrypt for more information. - # Setting this lower makes registration/login consume less CPU resources at the cost - # of security should the database be compromised. Setting this higher makes registration/login - # consume more CPU resources but makes it harder to brute force password hashes. This value - # can be lowered if performing tests or on embedded Dendrite instances (e.g WASM builds). - bcrypt_cost: 10 - - # The length of time that a token issued for a relying party from - # /_matrix/client/r0/user/{userId}/openid/request_token endpoint - # is considered to be valid in milliseconds. - # The default lifetime is 3600000ms (60 minutes). - # openid_token_lifetime_ms: 3600000 - -# Configuration for Opentracing. -# See https://github.com/matrix-org/dendrite/tree/master/docs/tracing for information on -# how this works and how to set it up. -tracing: - enabled: false - jaeger: - serviceName: "" - disabled: false - rpc_metrics: false - tags: [] - sampler: null - reporter: null - headers: null - baggage_restrictions: null - throttler: null - -# Logging configuration. The "std" logging type controls the logs being sent to -# stdout. The "file" logging type controls logs being written to a log folder on -# the disk. Supported log levels are "debug", "info", "warn", "error". -logging: - - type: std - level: info - - type: file - level: info - params: - path: ./logs - diff --git a/integration_test/flows/auth_flows.dart b/integration_test/flows/auth_flows.dart new file mode 100644 index 00000000..e16fd686 --- /dev/null +++ b/integration_test/flows/auth_flows.dart @@ -0,0 +1,44 @@ +import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; +import 'package:flutter/material.dart'; + +import '../data/environment_constants.dart'; +import '../utils/fluffy_chat_tester.dart'; + +extension AuthFlows on FluffyChatTester { + Future login() async { + await waitFor('Sign in'); + await tapOn('Sign in'); + await enterText(TextField, 'http://$homeserver', index: 0); + await tapOn(RadioListTile, index: 0); + await tapOn('Continue'); + await waitFor('Log in to http://$homeserver'); + await enterText(TextField, user1Name, index: 0); + await enterText(TextField, user1Pw, index: 1); + await tapOn('Login'); + } + + Future logout() async { + await tapOn(Key('accounts_and_settings_buttons')); + await tapOn('Settings'); + await scrollUntilVisible('Logout'); + await tapOn('Logout'); + await tapOn(Key('ok_cancel_alert_dialog_ok_button')); + await waitFor('Sign in'); + } + + Future skipNoNotificationsDialog() async { + if (await isVisible('Push notifications not available')) { + await tapOn('Do not show again'); + } + } + + Future ensureLoggedIn() async { + if (await isVisible('Sign in') == false) return false; + + await login(); + await tapOn(CloseButton); + await tapOn('Skip'); + await skipNoNotificationsDialog(); + return true; + } +} diff --git a/integration_test/flows/basic_messaging.dart b/integration_test/flows/basic_messaging.dart new file mode 100644 index 00000000..eb3e0944 --- /dev/null +++ b/integration_test/flows/basic_messaging.dart @@ -0,0 +1,42 @@ +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../utils/fluffy_chat_tester.dart'; +import 'auth_flows.dart'; + +Future basicMessaging(WidgetTester widgetTester) => widgetTester + .startFluffyChatTest() + .then((tester) => tester._basicMessaging()); + +extension on FluffyChatTester { + Future _basicMessaging() async { + final shouldLogout = await ensureLoggedIn(); + + // Create a new group chat + await tapOn(FloatingActionButton); + await tapOn('Create group'); + await enterText(TextField, 'Test Group 01'); + await tapOn('Create a group and invite users'); + await waitFor('Invite contact'); + await goBack(); + + // Send a message + const testMessage = 'Hello from integration test!'; + await enterText(Key('chat_input_field'), testMessage); + await tapOn(Key('send_button')); + + // Ensure message is visible + await waitFor(testMessage); + + // Archive the chat + await tapOn(ChatSettingsPopupMenu); + await tapOn('Leave'); + await waitFor('Are you sure?'); + await tapOn('Leave'); + await waitFor(ChatList); + + if (shouldLogout) await logout(); + } +} diff --git a/integration_test/flows/login_and_chat_backup.dart b/integration_test/flows/login_and_chat_backup.dart new file mode 100644 index 00000000..b588c444 --- /dev/null +++ b/integration_test/flows/login_and_chat_backup.dart @@ -0,0 +1,23 @@ +import 'package:flutter_test/flutter_test.dart'; + +import '../utils/fluffy_chat_tester.dart'; +import 'auth_flows.dart'; + +Future loginAndChatBackup(WidgetTester widgetTester) => widgetTester + .startFluffyChatTest() + .then((tester) => tester._loginAndChatBackup()); + +extension on FluffyChatTester { + Future _loginAndChatBackup() async { + await login(); + + // Skip bootstrap + await tapOn('Copy to clipboard'); + await tapOn('Next'); + await tapOn('Close'); + + await skipNoNotificationsDialog(); + + await logout(); + } +} diff --git a/integration_test/login.yaml b/integration_test/login.yaml deleted file mode 100644 index 5bd1a3bd..00000000 --- a/integration_test/login.yaml +++ /dev/null @@ -1,36 +0,0 @@ -appId: chat.fluffy.fluffychat ---- -- extendedWaitUntil: # Wait for app to be visible - visible: "Sign in" - timeout: 60000 -- retry: - maxRetries: 10 # Emulator might need some time to be ready to - commands: - - tapOn: "Sign in" -- tapOn: "Search or enter homeserver address" -- inputText: "http://${HOMESERVER}" -- pressKey: "back" -- tapOn: - id: "homeserver_tile_0" -- tapOn: - id: "connect_to_homeserver_button" -- assertVisible: "Log in to http://${HOMESERVER}" -- inputText: "${USER1_NAME}" -- tapOn: "Password" -- inputText: "${USER1_PW}" -- tapOn: "Login" # Click the login button -- tapOn: - id: "store_in_secure_storage" -- tapOn: "Next" -- tapOn: - text: "Close" - index: 1 -- assertVisible: "Push notifications not available" -- tapOn: "Do not show again" -- tapOn: - id: "accounts_and_settings" # Open the popup menu -- tapOn: "Settings" -- scrollUntilVisible: - element: "Logout" -- tapOn: "Logout" -- tapOn: "Logout" # Confirm logout dialog \ No newline at end of file diff --git a/integration_test/mobile_test.dart b/integration_test/mobile_test.dart new file mode 100644 index 00000000..fe10b949 --- /dev/null +++ b/integration_test/mobile_test.dart @@ -0,0 +1,14 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'flows/basic_messaging.dart'; +import 'flows/login_and_chat_backup.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + group('FluffyChat Integration Tests', () { + testWidgets('Login and logout flow', loginAndChatBackup); + testWidgets('Basic Messaging', basicMessaging); + }); +} diff --git a/integration_test/utils/fluffy_chat_tester.dart b/integration_test/utils/fluffy_chat_tester.dart new file mode 100644 index 00000000..fe3f754a --- /dev/null +++ b/integration_test/utils/fluffy_chat_tester.dart @@ -0,0 +1,117 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:fluffychat/main.dart' as app; + +extension type FluffyChatTester(WidgetTester tester) { + static int _printCounter = 1; + + void _print(String message) { + debugPrint( + '[INTEGRATION TEST] ${DateTime.now().toIso8601String()} | Step ${_printCounter++} - $message', + ); + } + + Future isVisible( + Object object, { + Duration timeout = const Duration(seconds: 3), + }) async { + final end = DateTime.now().add(timeout); + while (object.toFinder().evaluate().isEmpty) { + if (DateTime.now().isAfter(end)) { + return false; + } + await tester.pump(const Duration(milliseconds: 500)); + } + return true; + } + + Future waitFor( + Object object, { + Duration timeout = const Duration(seconds: 30), + }) async { + _print('👀 Waiting for "$object" (${timeout.inSeconds}s)'); + final end = DateTime.now().add(timeout); + while (object.toFinder().evaluate().isEmpty) { + if (DateTime.now().isAfter(end)) { + throw Exception('⏱️ Timed out waiting for "$object"!'); + } + await tester.pump(const Duration(milliseconds: 500)); + } + } + + Future _ensureVisible(Object object, {int? index}) async { + var finder = object.toFinder(); + if (finder.evaluate().isEmpty) await waitFor(object); + + if (finder.evaluate().length > 1) { + if (index == null) { + throw Exception( + '⚠️ Found ${finder.evaluate().length} "$object" objects. Please specify an index!', + ); + } + if (finder.evaluate().length <= index) { + throw Exception( + '⚠️ Found ${finder.evaluate().length} "$object" objects. So index $index does not exist!', + ); + } + finder = finder.at(index); + } + return finder; + } + + Future tapOn(Object object, {int? index}) async { + final finder = await _ensureVisible(object, index: index); + + _print('👆 Tapping on "$object"'); + await tester.tap(finder); + await tester.pumpAndSettle(); + } + + Future goBack() async { + _print('🔙 Going a page back'); + await tester.pageBack(); + } + + Future enterText(Object object, String text, {int? index}) async { + final finder = await _ensureVisible(object, index: index); + + _print('⌨️ Enter "$text" into "$object"'); + await tester.enterText(finder, text); + FocusManager.instance.primaryFocus?.unfocus(); + await tester.pumpAndSettle(); + } + + Future scrollUntilVisible( + Object object, { + int? index, + Object? scrollable, + }) async { + _print('📜 Scrolling to "$object"'); + await tester.scrollUntilVisible( + object.toFinder(), + 500.0, + scrollable: scrollable?.toFinder() ?? find.byType(Scrollable).last, + ); + await tester.pumpAndSettle(); + } +} + +extension on Object { + Finder toFinder() => switch (this) { + final Finder finder => finder, + final String string => find.text(string), + final Key key => find.byKey(key), + final IconData icon => find.byIcon(icon), + final Type type => find.byType(type), + final Widget widget => find.byWidget(widget), + _ => throw Exception('Unsupported finder type: $runtimeType'), + }; +} + +extension StartTest on WidgetTester { + Future startFluffyChatTest() async { + app.main(); + + return FluffyChatTester(this); + } +} diff --git a/lib/main.dart b/lib/main.dart index 12bd01e1..4817f1df 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,7 +3,6 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/semantics.dart'; import 'package:collection/collection.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; @@ -22,6 +21,8 @@ import 'widgets/fluffy_chat_app.dart'; ReceivePort? mainIsolateReceivePort; +bool _vodozemacInitialized = false; + void main() async { if (PlatformInfos.isAndroid) { final port = mainIsolateReceivePort = ReceivePort(); @@ -49,7 +50,10 @@ void main() async { final store = await AppSettings.init(); Logs().i('Welcome to ${AppSettings.applicationName.value} <3'); - await vod.init(wasmPath: './assets/assets/vodozemac/'); + if (!_vodozemacInitialized) { + await vod.init(wasmPath: './assets/assets/vodozemac/'); + _vodozemacInitialized = true; + } Logs().nativeColors = !PlatformInfos.isIOS; final clients = await ClientManager.getClients(store: store); @@ -103,9 +107,6 @@ Future startGui(List clients, SharedPreferences store) async { await firstClient?.accountDataLoading; runApp(FluffyChatApp(clients: clients, pincode: pin, store: store)); - if (const String.fromEnvironment('WITH_SEMANTICS') == 'true') { - SemanticsBinding.instance.ensureSemantics(); - } } /// Watches the lifecycle changes to start the application when it diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index 88d30813..2be97eed 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -204,39 +204,31 @@ class BootstrapDialogState extends State { ), const SizedBox(height: 16), if (_supportsSecureStorage) - Semantics( - identifier: 'store_in_secure_storage', - child: CheckboxListTile.adaptive( - contentPadding: const EdgeInsets.symmetric( - horizontal: 8.0, - ), - value: _storeInSecureStorage, - activeColor: theme.colorScheme.primary, - onChanged: (b) { - setState(() { - _storeInSecureStorage = b; - }); - }, - title: Text(_getSecureStorageLocalizedName()), - subtitle: Text( - L10n.of(context).storeInSecureStorageDescription, - ), + CheckboxListTile.adaptive( + contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), + value: _storeInSecureStorage, + activeColor: theme.colorScheme.primary, + onChanged: (b) { + setState(() { + _storeInSecureStorage = b; + }); + }, + title: Text(_getSecureStorageLocalizedName()), + subtitle: Text( + L10n.of(context).storeInSecureStorageDescription, ), ), const SizedBox(height: 16), - Semantics( - identifier: 'copy_to_clipboard', - child: CheckboxListTile.adaptive( - contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), - value: _recoveryKeyCopied, - activeColor: theme.colorScheme.primary, - onChanged: (b) { - FluffyShare.share(key!, context); - setState(() => _recoveryKeyCopied = true); - }, - title: Text(L10n.of(context).copyToClipboard), - subtitle: Text(L10n.of(context).saveKeyManuallyDescription), - ), + CheckboxListTile.adaptive( + contentPadding: const EdgeInsets.symmetric(horizontal: 8.0), + value: _recoveryKeyCopied, + activeColor: theme.colorScheme.primary, + onChanged: (b) { + FluffyShare.share(key!, context, copyOnly: true); + setState(() => _recoveryKeyCopied = true); + }, + title: Text(L10n.of(context).copyToClipboard), + subtitle: Text(L10n.of(context).saveKeyManuallyDescription), ), const SizedBox(height: 16), ElevatedButton.icon( diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index ae774ca7..e1bee846 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -382,6 +382,7 @@ class ChatInputRow extends StatelessWidget { ), ) : IconButton( + key: Key('send_button'), tooltip: L10n.of(context).send, onPressed: controller.send, style: IconButton.styleFrom( diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index bc1261ff..22becb30 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -385,6 +385,7 @@ class InputBar extends StatelessWidget { Widget build(BuildContext context) { final theme = Theme.of(context); return Autocomplete>( + key: Key('chat_input_field'), focusNode: focusNode, textEditingController: controller, optionsBuilder: getSuggestions, diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index 8cde34e1..fdf196d8 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -173,23 +173,20 @@ class ClientChooserButton extends StatelessWidget { clipBehavior: Clip.hardEdge, borderRadius: BorderRadius.circular(99), color: Colors.transparent, - child: Semantics( - identifier: 'accounts_and_settings', - child: PopupMenuButton( - tooltip: 'Accounts and settings', - popUpAnimationStyle: FluffyThemes.isColumnMode(context) - ? AnimationStyle.noAnimation - : null, // https://github.com/flutter/flutter/issues/167180 - onSelected: (o) => _clientSelected(o, context), - itemBuilder: _bundleMenuItems, - child: Center( - child: Avatar( - mxContent: snapshot.data?.avatarUrl, - name: - snapshot.data?.displayName ?? - matrix.client.userID?.localpart, - size: 32, - ), + child: PopupMenuButton( + key: Key('accounts_and_settings_buttons'), + tooltip: 'Accounts and settings', + popUpAnimationStyle: FluffyThemes.isColumnMode(context) + ? AnimationStyle.noAnimation + : null, // https://github.com/flutter/flutter/issues/167180 + onSelected: (o) => _clientSelected(o, context), + itemBuilder: _bundleMenuItems, + child: Center( + child: Avatar( + mxContent: snapshot.data?.avatarUrl, + name: + snapshot.data?.displayName ?? matrix.client.userID?.localpart, + size: 32, ), ), ), diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 2611af78..4f5be9a8 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -79,7 +79,6 @@ class SettingsController extends State { context: context, future: () => matrix.client.logout(), ); - context.go('/'); } Future setAvatarAction() async { diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index 242ee57e..276cd264 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -96,104 +96,98 @@ class SignInPage extends StatelessWidget { itemBuilder: (context, i) { final server = publicHomeservers[i]; final website = server.website; - return Semantics( - identifier: 'homeserver_tile_$i', - child: RadioListTile( - value: server, - enabled: - state.loginLoading.connectionState != - ConnectionState.waiting, - title: Row( - children: [ - Expanded( - child: Text(server.name ?? 'Unknown'), - ), - if (website != null) - SizedBox.square( - dimension: 32, - child: IconButton( - icon: const Icon( - Icons.open_in_new_outlined, - size: 16, - ), - onPressed: () => - launchUrlString(website), + return RadioListTile( + value: server, + enabled: + state.loginLoading.connectionState != + ConnectionState.waiting, + title: Row( + children: [ + Expanded( + child: Text(server.name ?? 'Unknown'), + ), + if (website != null) + SizedBox.square( + dimension: 32, + child: IconButton( + icon: const Icon( + Icons.open_in_new_outlined, + size: 16, ), + onPressed: () => + launchUrlString(website), ), - ], - ), - subtitle: Column( - spacing: 4.0, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - if (server.features?.isNotEmpty == true) - Wrap( - spacing: 4.0, - runSpacing: 4.0, - children: [ - ...?server.languages?.map( - (language) => Material( - borderRadius: - BorderRadius.circular( - AppConfig.borderRadius, - ), - color: theme - .colorScheme - .tertiaryContainer, - child: Padding( - padding: - const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, - ), - child: Text( - language, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onTertiaryContainer, - ), - ), - ), - ), - ), - ...server.features!.map( - (feature) => Material( - borderRadius: - BorderRadius.circular( - AppConfig.borderRadius, - ), - color: theme - .colorScheme - .secondaryContainer, - child: Padding( - padding: - const EdgeInsets.symmetric( - horizontal: 6.0, - vertical: 3.0, - ), - child: Text( - feature, - style: TextStyle( - fontSize: 10, - color: theme - .colorScheme - .onSecondaryContainer, - ), - ), - ), - ), - ), - ], - ), - Text( - server.description ?? - 'A matrix homeserver', ), - ], - ), + ], + ), + subtitle: Column( + spacing: 4.0, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + if (server.features?.isNotEmpty == true) + Wrap( + spacing: 4.0, + runSpacing: 4.0, + children: [ + ...?server.languages?.map( + (language) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .tertiaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + language, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onTertiaryContainer, + ), + ), + ), + ), + ), + ...server.features!.map( + (feature) => Material( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, + ), + color: theme + .colorScheme + .secondaryContainer, + child: Padding( + padding: + const EdgeInsets.symmetric( + horizontal: 6.0, + vertical: 3.0, + ), + child: Text( + feature, + style: TextStyle( + fontSize: 10, + color: theme + .colorScheme + .onSecondaryContainer, + ), + ), + ), + ), + ), + ], + ), + Text( + server.description ?? 'A matrix homeserver', + ), + ], ), ); }, @@ -217,29 +211,26 @@ class SignInPage extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(16.0), child: SafeArea( - child: Semantics( - identifier: 'connect_to_homeserver_button', - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: theme.colorScheme.primary, - foregroundColor: theme.colorScheme.onPrimary, - ), - onPressed: - state.loginLoading.connectionState == - ConnectionState.waiting - ? null - : () => connectToHomeserverFlow( - selectedHomserver, - context, - viewModel.setLoginLoading, - signUp, - ), - child: - state.loginLoading.connectionState == - ConnectionState.waiting - ? const CircularProgressIndicator.adaptive() - : Text(L10n.of(context).continueText), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + foregroundColor: theme.colorScheme.onPrimary, ), + onPressed: + state.loginLoading.connectionState == + ConnectionState.waiting + ? null + : () => connectToHomeserverFlow( + selectedHomserver, + context, + viewModel.setLoginLoading, + signUp, + ), + child: + state.loginLoading.connectionState == + ConnectionState.waiting + ? const CircularProgressIndicator.adaptive() + : Text(L10n.of(context).continueText), ), ), ), diff --git a/lib/utils/fluffy_share.dart b/lib/utils/fluffy_share.dart index c2bd2a5d..0c72d284 100644 --- a/lib/utils/fluffy_share.dart +++ b/lib/utils/fluffy_share.dart @@ -24,9 +24,14 @@ abstract class FluffyShare { return; } await Clipboard.setData(ClipboardData(text: text)); - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text(L10n.of(context).copiedToClipboard))); + if (!PlatformInfos.isMobile) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + showCloseIcon: true, + content: Text(L10n.of(context).copiedToClipboard), + ), + ); + } return; } diff --git a/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart index 3b6c7268..d295a9ca 100644 --- a/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart +++ b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart @@ -41,11 +41,13 @@ Future showOkCancelAlertDialog({ ), actions: [ AdaptiveDialogAction( + key: Key('ok_cancel_alert_dialog_cancel_button'), onPressed: () => Navigator.of(context).pop(OkCancelResult.cancel), child: Text(cancelLabel ?? L10n.of(context).cancel), ), AdaptiveDialogAction( + key: Key('ok_cancel_alert_dialog_ok_button'), onPressed: () => Navigator.of(context).pop(OkCancelResult.ok), autofocus: true, diff --git a/lib/widgets/future_loading_dialog.dart b/lib/widgets/future_loading_dialog.dart index cc6b1b40..b883cda9 100644 --- a/lib/widgets/future_loading_dialog.dart +++ b/lib/widgets/future_loading_dialog.dart @@ -85,7 +85,11 @@ class LoadingDialogState extends State { void initState() { super.initState(); widget.future.then( - (result) => Navigator.of(context).pop>(Result.value(result)), + (result) { + if (!mounted) return; + if (!Navigator.of(context).canPop()) return; + Navigator.of(context).pop>(Result.value(result)); + }, onError: (e, s) => setState(() { exception = e; stackTrace = s; diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 0e322e10..f5cd50a2 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -371,7 +371,6 @@ class MatrixState extends State with WidgetsBindingObserver { onKeyVerificationRequestSub.values.map((s) => s.cancel()); onLogoutSub.values.map((s) => s.cancel()); onNotification.values.map((s) => s.cancel()); - client.httpClient.close(); linuxNotifications?.close(); diff --git a/pubspec.lock b/pubspec.lock index 08fd79c7..0158ec42 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -462,6 +462,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_foreground_task: dependency: "direct main" description: @@ -669,6 +674,11 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" geoclue: dependency: transitive description: @@ -901,6 +911,11 @@ packages: url: "https://pub.dev" source: hosted version: "4.6.0" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: "direct main" description: @@ -1738,6 +1753,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.0" + sync_http: + dependency: transitive + description: + name: sync_http + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" + source: hosted + version: "0.3.1" synchronized: dependency: transitive description: @@ -2099,6 +2122,14 @@ packages: url: "https://github.com/google/webcrypto.dart.git" source: git version: "0.6.0" + webdriver: + dependency: transitive + description: + name: webdriver + sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade" + url: "https://pub.dev" + source: hosted + version: "3.1.0" webkit_inspection_protocol: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 6776ec92..d83c3eb3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -87,6 +87,8 @@ dev_dependencies: flutter_test: sdk: flutter import_sorter: ^4.6.0 + integration_test: + sdk: flutter license_checker: ^1.6.2 translations_cleaner: ^0.1.1 diff --git a/scripts/create_fdroid_repos.sh b/scripts/create_fdroid_repos.sh deleted file mode 100755 index 595e1cfa..00000000 --- a/scripts/create_fdroid_repos.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env bash - -GITLAB_PROJECT_ID="16112282" - -# repo directory for build -mkdir fdroid/repo -# ... and for deployment -mkdir repo - -git fetch - -# building nightly repo - -cd fdroid - -cp config.nightly.py config.py - -PIPELINES="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines\?ref=main\&status=success\&order_by=updated_at | jq '.[].id' | head -n3)" - -cp ../build/android/app-release.apk repo/fluffychat-latest.apk - -for PIPELINE in $PIPELINES -do - JOB="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines/$PIPELINE/jobs | jq -r '.[] | select(.name == "build_android_apk").id')" - if [ -n $JOB ]; then - URI="https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/jobs/$JOB/artifacts/build/android/app-release.apk" - FILENAME="fluffychat-$PIPELINE.apk" - echo "Downloading $FILENAME from $URI ..." - wget --output-document="$FILENAME" "$URI" - mv "$FILENAME" repo - fi -done - -fdroid update --rename-apks -mkdir /fdroid && fdroid deploy -rm -rf /fdroid/archive -cd .. && mv -v /fdroid repo/nightly - -# building stable + RC repo - -rm -rf /fdroid fdroid/repo - -mkdir fdroid/repo - -cd fdroid -rm -f repo/*.apk - -cp config.stable.py config.py - -PIPELINES="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines\?scope=tags\&status=success\&order_by=updated_at | jq '.[].id' | head -n3)" - -for PIPELINE in $PIPELINES -do - JOB="$(curl https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/pipelines/$PIPELINE/jobs | jq -r '.[] | select(.name == "build_android_apk").id')" - if [ -n $JOB ]; then - URI="https://gitlab.com/api/v4/projects/${GITLAB_PROJECT_ID}/jobs/$JOB/artifacts/build/android/app-release.apk" - FILENAME="fluffychat-$PIPELINE.apk" - echo "Downloading $FILENAME from $URI ..." - wget --output-document="$FILENAME" "$URI" - mv "$FILENAME" repo - fi -done - -fdroid update --rename-apks -mkdir /fdroid && fdroid deploy -rm -rf /fdroid/archive -cd .. && mv -v /fdroid repo/stable diff --git a/scripts/integration-check-release-build.sh b/scripts/integration-check-release-build.sh deleted file mode 100755 index 5e329189..00000000 --- a/scripts/integration-check-release-build.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -# generate a temporary signing key adn apply its configuration -cd android -KEYFILE="$(pwd)/key.jks" -echo "Generating signing configuration with $KEYFILE..." -keytool -genkey -keyalg RSA -alias key -keysize 4096 -dname "cn=FluffyChat CI, ou=Head of bad integration tests, o=FluffyChat HQ, c=TLH" -keypass FLUFFYCHAT -storepass FLUFFYCHAT -validity 1 -keystore "$KEYFILE" -storetype "pkcs12" -echo "storePassword=FLUFFYCHAT" >> key.properties -echo "keyPassword=FLUFFYCHAT" >> key.properties -echo "keyAlias=key" >> key.properties -echo "storeFile=$KEYFILE" >> key.properties -ls | grep key -cd .. - -# build release mode APK -flutter pub get -flutter build apk --release - -# install and launch APK -flutter install -adb shell am start -n chat.fluffy.fluffychat/chat.fluffy.fluffychat.MainActivity - -sleep 5 - -# check whether FluffyChat runs -adb shell ps | awk '{print $9}' | grep chat.fluffy.fluffychat diff --git a/scripts/integration-prepare-homeserver.sh b/scripts/integration-prepare-homeserver.sh deleted file mode 100755 index 61c43e07..00000000 --- a/scripts/integration-prepare-homeserver.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - - -while ! curl -XGET "http://localhost/_matrix/client/v3/login" >/dev/null 2>/dev/null; do - echo "Waiting for homeserver to be available... (GET http://localhost/_matrix/client/v3/login)" - sleep 2 -done - -# create users -curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER1_NAME\", \"password\":\"$USER1_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://localhost/_matrix/client/r0/register" -curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER2_NAME\", \"password\":\"$USER2_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://localhost/_matrix/client/r0/register" diff --git a/scripts/integration-prepare-host.sh b/scripts/integration-prepare-host.sh deleted file mode 100755 index f110aab7..00000000 --- a/scripts/integration-prepare-host.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -if ! command -v apk &>/dev/null; then - apt update && apt install -y -qq docker.io ldnsutils grep scrcpy ffmpeg -else - apk update && apk add docker drill grep scrcpy ffmpeg -fi diff --git a/scripts/integration-server-conduit.sh b/scripts/integration-server-conduit.sh deleted file mode 100755 index f4b031f5..00000000 --- a/scripts/integration-server-conduit.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash -docker run -d \ - -e CONDUIT_SERVER_NAME="localhost" \ - -e CONDUIT_PORT="8008" \ - -e CONDUIT_DATABASE_BACKEND="rocksdb" \ - -e CONDUIT_ALLOW_REGISTRATION=true \ - -e CONDUIT_ALLOW_FEDERATION=true \ - -e CONDUIT_MAX_REQUEST_SIZE="20000000" \ - -e CONDUIT_TRUSTED_SERVERS="[\"conduit.rs\"]" \ - -e CONDUIT_MAX_CONCURRENT_REQUESTS="100" \ - -e CONDUIT_LOG="info,rocket=off,_=off,sled=off" \ - --name conduit -p 80:8008 matrixconduit/matrix-conduit:latest diff --git a/scripts/integration-server-dendrite.sh b/scripts/integration-server-dendrite.sh deleted file mode 100755 index ee23da19..00000000 --- a/scripts/integration-server-dendrite.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash -chown -R 991:991 integration_test/dendrite - -# creating integration test SSL certificates -docker run --rm --entrypoint="" \ - --volume="$(pwd)/integration_test/dendrite/data":/mnt:rw \ - matrixdotorg/dendrite-monolith:latest \ - /usr/bin/generate-keys \ - -private-key /mnt/matrix_key.pem \ - -tls-cert /mnt/server.crt \ - -tls-key /mnt/server.key - -docker run -d --volume="$(pwd)/integration_test/dendrite/data":/etc/dendrite:rw \ - --name dendrite -p 80:8008 matrixdotorg/dendrite-monolith:latest -really-enable-open-registration diff --git a/scripts/integration-server-synapse.sh b/scripts/integration-server-synapse.sh deleted file mode 100755 index 03d21847..00000000 --- a/scripts/integration-server-synapse.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -docker run -d --name synapse --tmpfs /data \ - --volume="$(pwd)/integration_test/synapse/data/homeserver.yaml":/data/homeserver.yaml:rw \ - --volume="$(pwd)/integration_test/synapse/data/localhost.log.config":/data/localhost.log.config:rw \ - -p 80:80 matrixdotorg/synapse:latest diff --git a/scripts/integration-start-avd.sh b/scripts/integration-start-avd.sh deleted file mode 100755 index fb608e44..00000000 --- a/scripts/integration-start-avd.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -chmod 777 -R /dev/kvm -adb start-server -emulator -avd test -wipe-data -no-audio -no-boot-anim -no-window -accel on -gpu swiftshader_indirect diff --git a/scripts/prepare-fdroid.sh b/scripts/prepare-fdroid.sh deleted file mode 100755 index f9384b0f..00000000 --- a/scripts/prepare-fdroid.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -cp -r android/fastlane fdroid/metadata/chat.fluffy.fluffychat -cd fdroid -echo $FDROID_KEY | base64 --decode --ignore-garbage > key.jks -echo $FDROID_NIGHTLY_KEY | base64 --decode --ignore-garbage > key.nightly.jks -echo "keypass=\"${FDROID_KEY_PASS}\"" >> config.stable.py -echo "keystorepass=\"${FDROID_KEY_PASS}\"" >> config.stable.py -echo "keypass=\"${FDROID_NIGHTLY_KEY_PASS}\"" >> config.nightly.py -echo "keystorepass=\"${FDROID_NIGHTLY_KEY_PASS}\"" >> config.nightly.py -chmod 600 config.stable.py key.jks config.nightly.py key.nightly.jks -cd .. diff --git a/scripts/prepare_integration_test.sh b/scripts/prepare_integration_test.sh new file mode 100755 index 00000000..e1eb01eb --- /dev/null +++ b/scripts/prepare_integration_test.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +source integration_test/data/integration_users.env + +docker rm -f synapse 2>/dev/null || true + +docker run -d --name synapse --tmpfs /data \ + --volume="$(pwd)/integration_test/synapse/data/homeserver.yaml":/data/homeserver.yaml:rw \ + --volume="$(pwd)/integration_test/synapse/data/localhost.log.config":/data/localhost.log.config:rw \ + -p 80:80 matrixdotorg/synapse:latest + +while ! curl -XGET "http://$HOMESERVER/_matrix/client/v3/login" >/dev/null 2>/dev/null; do +echo "Waiting for homeserver to be available... (GET http://$HOMESERVER/_matrix/client/v3/login)" + sleep 2 +done + +echo "Homeserver is online!" + +# create users +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER1_NAME\", \"password\":\"$USER1_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" +curl -fS --retry 3 -XPOST -d "{\"username\":\"$USER2_NAME\", \"password\":\"$USER2_PW\", \"inhibit_login\":true, \"auth\": {\"type\":\"m.login.dummy\"}}" "http://$HOMESERVER/_matrix/client/r0/register" + +echo "Homeserver is ready! Please rerun this script every time before starting an integration test!" \ No newline at end of file diff --git a/scripts/update-dependencies.sh b/scripts/update-dependencies.sh deleted file mode 100755 index 5f783fc5..00000000 --- a/scripts/update-dependencies.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -ve -flutter pub upgrade --major-versions -flutter pub get -dart fix --apply -flutter format lib test -flutter pub run import_sorter:main --no-comments \ No newline at end of file From 28a43c8eadcfd1b9f45bc0488179ff93d71c7047 Mon Sep 17 00:00:00 2001 From: NPL Date: Thu, 19 Mar 2026 14:32:02 +0100 Subject: [PATCH 302/333] chore(translations): Translated using Weblate (Japanese) Currently translated at 72.7% (549 of 755 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ja/ --- lib/l10n/intl_ja.arb | 206 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 204 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_ja.arb b/lib/l10n/intl_ja.arb index 97ef471d..b82e405f 100644 --- a/lib/l10n/intl_ja.arb +++ b/lib/l10n/intl_ja.arb @@ -2193,5 +2193,207 @@ "hideInvalidOrUnknownMessageFormats": "無効であるか不明なメッセージ形式を隠す", "blockListDescription": "迷惑なユーザーをブロックすることができます。あなたの個人的なブロックリストに記載されたユーザーは、あらゆるメッセージやルームへの招待を受け取ることができません。", "invalidServerName": "無効なサーバー名", - "redactMessageDescription": "メッセージはこの会話のすべての参加者から削除されます。これは取り消すことができません。" -} \ No newline at end of file + "redactMessageDescription": "メッセージはこの会話のすべての参加者から削除されます。これは取り消すことができません。", + "commandHint_op": "ユーザーの権限レベルを付与する(デフォルト:50)", + "@commandHint_op": { + "type": "String", + "description": "Usage hint for the command /op" + }, + "optionalRedactReason": "(オプション)メッセージを削除する理由…", + "overview": "概観", + "passwordRecoverySettings": "パスワードの復元設定", + "setChatDescription": "チャットの説明を設定", + "dismiss": "棄却", + "invitedBy": "📩 {user}に招待されました", + "@invitedBy": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "hasKnocked": "🚪 {user}がノックしました", + "@hasKnocked": { + "placeholders": { + "user": { + "type": "String" + } + } + }, + "usersMustKnock": "ユーザーはノックする必要があります", + "noOneCanJoin": "誰も参加できません", + "knock": "ノック", + "saveKeyManuallyDescription": "この鍵をシステムの共有ダイアログかクリップボードから手動で保存してください。", + "fileIsTooBigForServer": "送信できません!このサーバーは添付数は{max}個までです。", + "@fileIsTooBigForServer": { + "type": "String", + "placeholders": { + "max": { + "type": "String" + } + } + }, + "fileHasBeenSavedAt": "ファイルは {path} に保存されています", + "@fileHasBeenSavedAt": { + "type": "String", + "placeholders": { + "path": { + "type": "String" + } + } + }, + "jumpToLastReadMessage": "最後に閲覧したメッセージまで移動する", + "readUpToHere": "ここまで既読です", + "jump": "移動", + "openLinkInBrowser": "リンクをブラウザで開く", + "reportErrorDescription": "😭 おっと。問題が発生しました。必要があれば、このバグを開発者に報告することができます。", + "setColorTheme": "カラーテーマの設定:", + "invite": "招待", + "inviteGroupChat": "📨 グループチャットへ招待する", + "invalidInput": "無効な入力です!", + "wrongPinEntered": "誤ったPINが入力されました!{seconds}秒後に再試行してください…", + "@wrongPinEntered": { + "type": "String", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "pleaseEnterANumber": "0以上の数値を入力してください", + "archiveRoomDescription": "チャットはアーカイブに移動されます。他のユーザーはあなたが退出したチャットを見ることができます。", + "roomUpgradeDescription": "チャットは新しい部屋バージョンで再作成されます。全参加者に新しいチャットへ切り替える必要があることが通知されます。部屋バージョンについては https://spec.matrix.org/latest/rooms/ をご覧ください", + "removeDevicesDescription": "このデバイスからログアウトするとメッセージを受け取ることができません。", + "banUserDescription": "ユーザーをチャットからBANすると、BANを解除されるまで再入室することはできません。", + "unbanUserDescription": "ユーザーが再試行時に再入室することができます。", + "pushNotificationsNotAvailable": "プッシュ通知は利用できません", + "learnMore": "詳しく知る", + "yourGlobalUserIdIs": "あなたのグローバルユーザーID: ", + "knocking": "ノックしています", + "searchChatsRooms": "#チャット,@ユーザーで検索…", + "nothingFound": "何も見つかりませんでした…", + "groupName": "グループ名", + "createGroupAndInviteUsers": "グループを作成してユーザーを招待する", + "groupCanBeFoundViaSearch": "グループは検索で見つけることができます", + "commandHint_sendraw": "生のJSONを送信する", + "databaseMigrationTitle": "データベースは最適化されています", + "databaseMigrationBody": "しばらくお待ちください。この操作は時間がかかります。", + "searchForUsers": "@ユーザー で検索…", + "pleaseEnterYourCurrentPassword": "現在のパスワードを入力してください", + "newPassword": "新しいパスワード", + "pleaseChooseAStrongPassword": "強力なパスワードを選択してください", + "markAsUnread": "未読としてマーク", + "userLevel": "{level} - ユーザー", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "moderatorLevel": "{level} - モデレーター", + "@moderatorLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "adminLevel": "{level} - 管理者", + "@adminLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "changeGeneralChatSettings": "全体のチャット設定を変更する", + "inviteOtherUsers": "他のユーザーをこのチャットに招待する", + "changeTheChatPermissions": "チャット権限を変更する", + "changeTheDescriptionOfTheGroup": "チャットの説明を変更する", + "updateInstalled": "🎉 アップデート {version} をインストールしました!", + "@updateInstalled": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "changelog": "変更履歴", + "sendCanceled": "送信を取り消しました", + "loginWithMatrixId": "Matrix-IDでログイン", + "calculatingFileSize": "ファイルサイズを計算しています…", + "prepareSendingAttachment": "送信する添付ファイルを準備しています…", + "sendingAttachment": "添付ファイルを送信しています…", + "generatingVideoThumbnail": "ビデオサムネイルを生成しています…", + "compressVideo": "ビデオを圧縮しています…", + "sendingAttachmentCountOfCount": "{length}個中{index}個の添付ファイルを送信しています…", + "@sendingAttachmentCountOfCount": { + "type": "integer", + "placeholders": { + "index": { + "type": "int" + }, + "length": { + "type": "int" + } + } + }, + "serverLimitReached": "サーバーのリミットに達しました!{seconds}秒お待ちください…", + "@serverLimitReached": { + "type": "integer", + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "oneOfYourDevicesIsNotVerified": "いずれかのデバイスが認証されていません", + "noticeChatBackupDeviceVerification": "注意:すべてのデバイスをチャットのバックアップに接続している場合、それらは自動的に認証されます。", + "continueText": "続ける", + "blur": "ぼかし:", + "opacity": "透過度:", + "setWallpaper": "壁紙を設定する", + "manageAccount": "アカウント管理", + "noContactInformationProvided": "サーバーから有効な連絡先情報が提供されていません", + "supportPage": "サポートページ", + "serverInformation": "サーバー情報:", + "name": "名前", + "version": "バージョン", + "website": "ウェブサイト", + "compress": "圧縮", + "boldText": "太字", + "italicText": "斜体", + "invalidUrl": "無効なURL", + "addLink": "リンクを追加", + "appWantsToUseForLogin": "'{server}' を使用してログインする", + "@appWantsToUseForLogin": { + "type": "String", + "placeholders": { + "server": { + "type": "String" + } + } + }, + "open": "開く", + "waitingForServer": "サーバーを待機中…", + "newChatRequest": "📩 新しいチャットを要求", + "contentNotificationSettings": "コンテンツ通知設定", + "generalNotificationSettings": "全体通知設定", + "roomNotificationSettings": "部屋通知設定", + "userSpecificNotificationSettings": "ユーザー毎の通知設定", + "otherNotificationSettings": "その他の通知設定", + "notificationRuleContainsUserName": "ユーザー名を含む", + "notificationRuleContainsUserNameDescription": "ユーザー名がメッセージに含まれる場合に通知します。", + "notificationRuleMaster": "すべての通知をミュート", + "notificationRuleSuppressNotices": "自動化されたメッセージを控える", + "notificationRuleSuppressNoticesDescription": "Botのような自動化されたクライアントからの通知を抑制します。", + "notificationRuleInviteForMeDescription": "ユーザーが部屋に招待されたときに通知します。", + "notificationRuleMasterDescription": "全ルールを上書きして通知をすべて無効にします。", + "notificationRuleIsUserMention": "ユーザーの言及", + "notificationRuleIsUserMentionDescription": "ユーザーがメッセージ内で直接言及されたときに通知します。" +} From e38dd75c4f0f5399f77eafd43f346e513900dc20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Mar 2026 08:01:21 +0100 Subject: [PATCH 303/333] fix: Unable to delete devices if server has no valid well known --- lib/pages/device_settings/device_settings.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/pages/device_settings/device_settings.dart b/lib/pages/device_settings/device_settings.dart index 014359a8..9c764452 100644 --- a/lib/pages/device_settings/device_settings.dart +++ b/lib/pages/device_settings/device_settings.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:async/async.dart' show Result; import 'package:collection/collection.dart' show IterableExtension; import 'package:matrix/encryption.dart'; -import 'package:matrix/matrix.dart'; +import 'package:matrix/matrix.dart' hide Result; import 'package:url_launcher/url_launcher_string.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -49,8 +50,8 @@ class DevicesSettingsController extends State { Future removeDevicesAction(List devices) async { final client = Matrix.of(context).client; - final wellKnown = await client.getWellknown(); - final accountManageUrl = wellKnown.additionalProperties + final wellKnown = await Result.capture(client.getWellknown()); + final accountManageUrl = wellKnown.asValue?.value.additionalProperties .tryGetMap('org.matrix.msc2965.authentication') ?.tryGet('account'); if (accountManageUrl != null) { From e988a34b76b39f0279f24df04fdac8ff9df9accb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Mar 2026 09:26:06 +0100 Subject: [PATCH 304/333] feat: Implement experimental jitsi group calls behind a feature flag --- lib/config/setting_keys.dart | 2 + lib/l10n/intl_en.arb | 11 +- lib/pages/chat/chat_view.dart | 9 +- lib/pages/chat/jitsi_popup_button.dart | 177 +++++++++++++++++++++++++ 4 files changed, 195 insertions(+), 4 deletions(-) create mode 100644 lib/pages/chat/jitsi_popup_button.dart diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 6cbc1127..88b3a485 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -40,6 +40,8 @@ enum AppSettings { showPresences('chat.fluffy.show_presences', true), displayNavigationRail('chat.fluffy.display_navigation_rail', false), experimentalVoip('chat.fluffy.experimental_voip', false), + jitsiFeature('chat.fluffy.enable_jitsi', false), + jitsiDomain('chat.fluffy.jitsi_domain', 'meet.jit.si'), shareKeysWith('chat.fluffy.share_keys_with_2', 'all'), noEncryptionWarningShown( 'chat.fluffy.no_encryption_warning_shown', diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 1ce086ee..7321c5b7 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -2789,5 +2789,14 @@ "iDoNotWantToSupport": "I do not want to support", "iAlreadySupportFluffyChat": "I already support FluffyChat", "setLowPriority": "Set low priority", - "unsetLowPriority": "Unset low priority" + "unsetLowPriority": "Unset low priority", + "jitsiGroupCalls": "Jitsi group calls", + "removeCallFromChat": "Remove call from chat", + "removeCallFromChatDescription": "Do you want to remove the call from the chat for all members?", + "removeCallForEveryone": "Remove call for everyone", + "startVoiceCall": "Start voice call", + "startVideoCall": "Start video call", + "joinVoiceCall": "Join voice call", + "joinVideoCall": "Join video call", + "live": "Live" } diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index 2c19524b..e9f71834 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -14,6 +14,7 @@ import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart'; import 'package:fluffychat/pages/chat/chat_app_bar_title.dart'; import 'package:fluffychat/pages/chat/chat_event_list.dart'; import 'package:fluffychat/pages/chat/encryption_button.dart'; +import 'package:fluffychat/pages/chat/jitsi_popup_button.dart'; import 'package:fluffychat/pages/chat/pinned_events.dart'; import 'package:fluffychat/pages/chat/reply_display.dart'; import 'package:fluffychat/utils/account_config.dart'; @@ -224,14 +225,16 @@ class ChatView extends StatelessWidget { ], ), ] else if (!controller.room.isArchived) ...[ - if (AppSettings.experimentalVoip.value && + if ((AppSettings.experimentalVoip.value && Matrix.of(context).voipPlugin != null && - controller.room.isDirectChat) + controller.room.isDirectChat)) IconButton( onPressed: controller.onPhoneButtonTap, icon: const Icon(Icons.call_outlined), tooltip: L10n.of(context).placeCall, - ), + ) + else if (AppSettings.jitsiFeature.value) + JitsiPopupButton(controller.room), EncryptionButton(controller.room), ChatSettingsPopupMenu(controller.room, true), ], diff --git a/lib/pages/chat/jitsi_popup_button.dart b/lib/pages/chat/jitsi_popup_button.dart new file mode 100644 index 00000000..aa25046c --- /dev/null +++ b/lib/pages/chat/jitsi_popup_button.dart @@ -0,0 +1,177 @@ +import 'package:flutter/material.dart'; + +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; + +class JitsiPopupButton extends StatelessWidget { + final Room room; + const JitsiPopupButton(this.room, {super.key}); + + Future _startCall(BuildContext context, bool isAudioOnly) async { + final l10n = L10n.of(context); + final urlResult = await showFutureLoadingDialog( + context: context, + future: () async { + final conferenceId = room.client.generateUniqueTransactionId(); + final domain = AppSettings.jitsiDomain.value; + final uri = Uri( + scheme: 'https', + host: domain, + path: conferenceId, + fragment: isAudioOnly ? 'config.startWithVideoMuted=true' : null, + ); + await room.addWidget( + MatrixWidget( + room: room, + name: 'Jitsi Meet', + type: 'jitsi', + url: uri.toString(), + data: { + 'domain': domain, + 'isAudioOnly': isAudioOnly, + 'conferenceId': conferenceId, + 'roomName': room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ), + }, + ), + ); + return uri; + }, + ); + final url = urlResult.result; + if (url == null) return; + await launchUrl(url); + + if (!context.mounted) return; + final consent = await showOkCancelAlertDialog( + context: context, + title: l10n.removeCallFromChat, + message: l10n.removeCallFromChatDescription, + okLabel: l10n.remove, + ); + + if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; + + await _endAllCalls(context); + } + + Future _endAllCalls(BuildContext context) => showFutureLoadingDialog( + context: context, + future: () async { + final activeJitsiCalls = room.states['im.vector.modular.widgets']?.values + .where((state) => state.content['type'] == 'jitsi'); + if (activeJitsiCalls == null) return; + for (final call in activeJitsiCalls) { + await room.deleteWidget(call.stateKey!); + } + }, + ); + + @override + Widget build(BuildContext context) { + final l10n = L10n.of(context); + final activeJitsiCalls = room.widgets + .where((widget) => widget.type == 'jitsi') + .map((widget) { + final isAudioOnly = widget.data?.tryGet('isAudioOnly') ?? false; + final domain = widget.data?.tryGet('domain'); + final conferenceId = widget.data?.tryGet('conferenceId'); + return ( + isAudioOnly: isAudioOnly, + domain: domain, + conferenceId: conferenceId, + ); + }) + .toList(); + final canEditCalls = room.canChangeStateEvent('im.vector.modular.widgets'); + if (activeJitsiCalls.isEmpty && !canEditCalls) { + return const SizedBox.shrink(); + } + return PopupMenuButton( + itemBuilder: (context) => [ + ...activeJitsiCalls.map( + (call) => PopupMenuItem( + onTap: () => launchUrl( + Uri( + scheme: 'https', + host: call.domain, + path: call.conferenceId, + fragment: call.isAudioOnly + ? 'config.startWithVideoMuted=true' + : null, + ), + ), + child: Row( + mainAxisSize: .min, + children: [ + Icon(call.isAudioOnly ? Icons.add_call : Icons.video_call), + const SizedBox(width: 12), + Text( + call.isAudioOnly ? l10n.joinVoiceCall : l10n.joinVideoCall, + ), + ], + ), + ), + ), + if (canEditCalls) ...[ + if (activeJitsiCalls.isEmpty) ...[ + PopupMenuItem( + onTap: () => _startCall(context, true), + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.add_call), + const SizedBox(width: 12), + Text(l10n.startVoiceCall), + ], + ), + ), + PopupMenuItem( + onTap: () => _startCall(context, false), + child: Row( + mainAxisSize: .min, + children: [ + const Icon(Icons.video_call), + const SizedBox(width: 12), + Text(l10n.startVideoCall), + ], + ), + ), + ] else + PopupMenuItem( + onTap: () => _endAllCalls(context), + child: Row( + mainAxisSize: .min, + children: [ + Icon( + Icons.call_end_outlined, + color: Theme.of(context).colorScheme.error, + ), + const SizedBox(width: 12), + Text( + l10n.removeCallForEveryone, + style: TextStyle( + color: Theme.of(context).colorScheme.error, + ), + ), + ], + ), + ), + ], + ], + icon: Badge( + label: Text(l10n.live), + isLabelVisible: activeJitsiCalls.isNotEmpty, + child: Icon(Icons.video_call_outlined), + ), + ); + } +} From bb188724ae8c77165613fdcb847996585517b85a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 20 Mar 2026 14:52:26 +0100 Subject: [PATCH 305/333] chore: Split up tests even more --- integration_test/flows/auth_flows.dart | 5 +++ integration_test/flows/basic_messaging.dart | 27 +++----------- integration_test/flows/chat_flows.dart | 35 +++++++++++++++++++ integration_test/mobile_test.dart | 4 +++ .../utils/fluffy_chat_tester.dart | 5 +-- lib/pages/chat/chat.dart | 2 ++ 6 files changed, 51 insertions(+), 27 deletions(-) create mode 100644 integration_test/flows/chat_flows.dart diff --git a/integration_test/flows/auth_flows.dart b/integration_test/flows/auth_flows.dart index e16fd686..d5aebf91 100644 --- a/integration_test/flows/auth_flows.dart +++ b/integration_test/flows/auth_flows.dart @@ -1,9 +1,13 @@ import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; import '../data/environment_constants.dart'; import '../utils/fluffy_chat_tester.dart'; +Future finalLogout(WidgetTester widgetTester) => + widgetTester.startFluffyChatTest().then((tester) => tester.logout()); + extension AuthFlows on FluffyChatTester { Future login() async { await waitFor('Sign in'); @@ -18,6 +22,7 @@ extension AuthFlows on FluffyChatTester { } Future logout() async { + await ensureLoggedIn(); await tapOn(Key('accounts_and_settings_buttons')); await tapOn('Settings'); await scrollUntilVisible('Logout'); diff --git a/integration_test/flows/basic_messaging.dart b/integration_test/flows/basic_messaging.dart index eb3e0944..c0c2547c 100644 --- a/integration_test/flows/basic_messaging.dart +++ b/integration_test/flows/basic_messaging.dart @@ -1,10 +1,9 @@ -import 'package:fluffychat/pages/chat_list/chat_list.dart'; -import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import '../utils/fluffy_chat_tester.dart'; import 'auth_flows.dart'; +import 'chat_flows.dart'; Future basicMessaging(WidgetTester widgetTester) => widgetTester .startFluffyChatTest() @@ -12,31 +11,13 @@ Future basicMessaging(WidgetTester widgetTester) => widgetTester extension on FluffyChatTester { Future _basicMessaging() async { - final shouldLogout = await ensureLoggedIn(); + await ensureLoggedIn(); + await ensureGroupChatCreated(); - // Create a new group chat - await tapOn(FloatingActionButton); - await tapOn('Create group'); - await enterText(TextField, 'Test Group 01'); - await tapOn('Create a group and invite users'); - await waitFor('Invite contact'); - await goBack(); - - // Send a message + await tapOn(ChatFlows.groupChatName); const testMessage = 'Hello from integration test!'; await enterText(Key('chat_input_field'), testMessage); await tapOn(Key('send_button')); - - // Ensure message is visible await waitFor(testMessage); - - // Archive the chat - await tapOn(ChatSettingsPopupMenu); - await tapOn('Leave'); - await waitFor('Are you sure?'); - await tapOn('Leave'); - await waitFor(ChatList); - - if (shouldLogout) await logout(); } } diff --git a/integration_test/flows/chat_flows.dart b/integration_test/flows/chat_flows.dart new file mode 100644 index 00000000..512a6af2 --- /dev/null +++ b/integration_test/flows/chat_flows.dart @@ -0,0 +1,35 @@ +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../utils/fluffy_chat_tester.dart'; +import 'auth_flows.dart'; + +Future archiveChats(WidgetTester widgetTester) => + widgetTester.startFluffyChatTest().then((tester) => tester._archiveChats()); + +extension ChatFlows on FluffyChatTester { + static const String groupChatName = 'Test Group 01'; + + Future ensureGroupChatCreated() async { + if (await isVisible(groupChatName)) return; + await tapOn(FloatingActionButton); + await tapOn('Create group'); + await enterText(TextField, groupChatName); + await tapOn('Create a group and invite users'); + await waitFor('Invite contact'); + await goBack(); + await goBack(); + } + + Future _archiveChats() async { + await ensureLoggedIn(); + await ensureGroupChatCreated(); + await tapOn(ChatSettingsPopupMenu); + await tapOn('Leave'); + await waitFor('Are you sure?'); + await tapOn('Leave'); + await waitFor(ChatList); + } +} diff --git a/integration_test/mobile_test.dart b/integration_test/mobile_test.dart index fe10b949..8da68b0a 100644 --- a/integration_test/mobile_test.dart +++ b/integration_test/mobile_test.dart @@ -1,7 +1,9 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; +import 'flows/auth_flows.dart'; import 'flows/basic_messaging.dart'; +import 'flows/chat_flows.dart'; import 'flows/login_and_chat_backup.dart'; void main() { @@ -10,5 +12,7 @@ void main() { group('FluffyChat Integration Tests', () { testWidgets('Login and logout flow', loginAndChatBackup); testWidgets('Basic Messaging', basicMessaging); + testWidgets('Archive chats', archiveChats); + testWidgets('Final logout', finalLogout); }); } diff --git a/integration_test/utils/fluffy_chat_tester.dart b/integration_test/utils/fluffy_chat_tester.dart index fe3f754a..b91736fc 100644 --- a/integration_test/utils/fluffy_chat_tester.dart +++ b/integration_test/utils/fluffy_chat_tester.dart @@ -67,10 +67,7 @@ extension type FluffyChatTester(WidgetTester tester) { await tester.pumpAndSettle(); } - Future goBack() async { - _print('🔙 Going a page back'); - await tester.pageBack(); - } + Future goBack() => tapOn(find.byTooltip('Back')); Future enterText(Object object, String text, {int? index}) async { final finder = await _ensureVisible(object, index: index); diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 6432bc39..731ca1b7 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -553,6 +553,7 @@ class ChatController extends State timeline?.cancelSubscriptions(); timeline = null; inputFocus.removeListener(_inputFocusListener); + if (currentlyTyping) room.setTyping(false); super.dispose(); } @@ -1289,6 +1290,7 @@ class ChatController extends State if (AppSettings.sendTypingNotifications.value) { typingCoolDown?.cancel(); typingCoolDown = Timer(const Duration(seconds: 2), () { + if (!mounted) return; typingCoolDown = null; currentlyTyping = false; room.setTyping(false); From e427c84c02c1106b06133b2fc21a4a91986aeab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Mar 2026 11:23:17 +0100 Subject: [PATCH 306/333] chore: Remove inspect calls --- lib/pages/chat_list/chat_list.dart | 3 --- .../chat_permissions_settings/chat_permissions_settings.dart | 3 --- lib/utils/matrix_sdk_extensions/event_extension.dart | 3 --- 3 files changed, 9 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 30aac367..51cc8f98 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -312,8 +311,6 @@ class ChatListController extends State return; } - inspect(files); - showScaffoldDialog( context: context, builder: (context) => ShareScaffoldDialog( diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart index e3dbfde4..9a7899cd 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -1,5 +1,3 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -51,7 +49,6 @@ class ChatPermissionsSettingsController extends State { } else { content[key] = newLevel; } - inspect(content); await showFutureLoadingDialog( context: context, future: () => room.client.setRoomStateWithKey( diff --git a/lib/utils/matrix_sdk_extensions/event_extension.dart b/lib/utils/matrix_sdk_extensions/event_extension.dart index 6f1138bf..66537ec2 100644 --- a/lib/utils/matrix_sdk_extensions/event_extension.dart +++ b/lib/utils/matrix_sdk_extensions/event_extension.dart @@ -1,5 +1,3 @@ -import 'dart:developer'; - import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -34,7 +32,6 @@ extension LocalizedBody on Event { Future shareFile(BuildContext context) async { final matrixFile = await _getFile(context); - inspect(matrixFile); matrixFile.result?.share(context); } From dcdaededd20b5c905979589ee2519bd79fd3f29d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Mar 2026 11:29:37 +0100 Subject: [PATCH 307/333] fix: GoRouter captures receive sharing intents sometimes --- lib/pages/chat_list/chat_list.dart | 3 ++- lib/widgets/fluffy_chat_app.dart | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 51cc8f98..2ec58c0f 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -306,7 +307,7 @@ class ChatListController extends State void _processIncomingSharedMedia(List files) { if (files.isEmpty) return; - + inspect(files); if (files.singleOrNull?.path.startsWith(AppConfig.deepLinkPrefix) == true) { return; } diff --git a/lib/widgets/fluffy_chat_app.dart b/lib/widgets/fluffy_chat_app.dart index af780379..e0cd0aa2 100644 --- a/lib/widgets/fluffy_chat_app.dart +++ b/lib/widgets/fluffy_chat_app.dart @@ -39,6 +39,10 @@ class FluffyChatApp extends StatelessWidget { routes: AppRoutes.routes, debugLogDiagnostics: true, redirect: (context, state) { + // Workaround for content sharings passed to go router: + if (state.uri.scheme == 'content') return null; + + // Pass deep links to app: if (state.uri.toString().startsWith(AppConfig.deepLinkPrefix)) { return '/rooms/newprivatechat?deeplink=${state.uri}'; } From 22901dc424019b854dac13b1a3b44d11456189a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Mar 2026 12:21:52 +0100 Subject: [PATCH 308/333] chore: Follow up sharing fix --- lib/widgets/fluffy_chat_app.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/fluffy_chat_app.dart b/lib/widgets/fluffy_chat_app.dart index e0cd0aa2..3b0b1e4f 100644 --- a/lib/widgets/fluffy_chat_app.dart +++ b/lib/widgets/fluffy_chat_app.dart @@ -40,7 +40,7 @@ class FluffyChatApp extends StatelessWidget { debugLogDiagnostics: true, redirect: (context, state) { // Workaround for content sharings passed to go router: - if (state.uri.scheme == 'content') return null; + if (state.uri.scheme == 'content') return '/'; // Pass deep links to app: if (state.uri.toString().startsWith(AppConfig.deepLinkPrefix)) { From 69588b8d69e68b55db27c9c0c51c13501bb98c41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Mar 2026 13:09:45 +0100 Subject: [PATCH 309/333] refactor: Replace import_sorter with directives_ordering lint --- .github/workflows/integrate.yaml | 2 -- .vscode/settings.json | 9 +++---- CONTRIBUTING.md | 5 ++-- analysis_options.yaml | 1 + .../utils/fluffy_chat_tester.dart | 2 +- lib/config/routes.dart | 8 +++--- lib/config/setting_keys.dart | 6 ++--- lib/config/themes.dart | 5 ++-- lib/main.dart | 11 ++++---- lib/pages/archive/archive.dart | 6 ++--- lib/pages/archive/archive_view.dart | 8 +++--- lib/pages/bootstrap/bootstrap_dialog.dart | 13 +++++----- lib/pages/chat/chat.dart | 17 ++++++------- lib/pages/chat/chat_app_bar_list_tile.dart | 6 ++--- lib/pages/chat/chat_app_bar_title.dart | 8 +++--- lib/pages/chat/chat_emoji_picker.dart | 7 +++--- lib/pages/chat/chat_event_list.dart | 8 +++--- lib/pages/chat/chat_input_row.dart | 7 +++--- lib/pages/chat/chat_view.dart | 7 +++--- lib/pages/chat/encryption_button.dart | 5 ++-- lib/pages/chat/event_info_dialog.dart | 6 ++--- lib/pages/chat/events/audio_player.dart | 17 ++++++------- lib/pages/chat/events/cute_events.dart | 6 ++--- lib/pages/chat/events/html_message.dart | 13 +++++----- lib/pages/chat/events/image_bubble.dart | 9 +++---- lib/pages/chat/events/message.dart | 11 ++++---- lib/pages/chat/events/message_content.dart | 11 ++++---- .../chat/events/message_download_content.dart | 8 +++--- lib/pages/chat/events/message_reactions.dart | 6 ++--- lib/pages/chat/events/poll.dart | 8 +++--- lib/pages/chat/events/reply_content.dart | 7 +++--- lib/pages/chat/events/state_message.dart | 9 +++---- lib/pages/chat/events/video_player.dart | 9 +++---- lib/pages/chat/input_bar.dart | 11 ++++---- lib/pages/chat/jitsi_popup_button.dart | 8 +++--- lib/pages/chat/pinned_events.dart | 6 ++--- lib/pages/chat/recording_input_row.dart | 3 +-- lib/pages/chat/recording_view_model.dart | 11 ++++---- lib/pages/chat/reply_display.dart | 7 +++--- lib/pages/chat/seen_by_row.dart | 6 ++--- lib/pages/chat/send_file_dialog.dart | 11 ++++---- lib/pages/chat/send_location_dialog.dart | 10 +++----- lib/pages/chat/start_poll_bottom_sheet.dart | 6 ++--- lib/pages/chat/sticker_picker_dialog.dart | 7 +++--- lib/pages/chat/typing_indicators.dart | 3 +-- .../chat_access_settings_controller.dart | 8 +++--- .../chat_access_settings_page.dart | 6 ++--- lib/pages/chat_details/chat_details.dart | 8 +++--- lib/pages/chat_details/chat_details_view.dart | 11 ++++---- .../chat_details/participant_list_item.dart | 7 +++--- .../chat_encryption_settings.dart | 11 ++++---- .../chat_encryption_settings_view.dart | 12 ++++----- lib/pages/chat_list/chat_list.dart | 19 +++++++------- lib/pages/chat_list/chat_list_body.dart | 9 +++---- lib/pages/chat_list/chat_list_header.dart | 7 +++--- lib/pages/chat_list/chat_list_item.dart | 7 +++--- lib/pages/chat_list/chat_list_view.dart | 4 +-- .../chat_list/client_chooser_button.dart | 11 ++++---- lib/pages/chat_list/navi_rail_item.dart | 7 +++--- lib/pages/chat_list/space_view.dart | 10 +++----- lib/pages/chat_list/start_chat_fab.dart | 6 ++--- lib/pages/chat_list/status_msg_list.dart | 7 +++--- lib/pages/chat_list/unread_bubble.dart | 6 ++--- lib/pages/chat_members/chat_members_view.dart | 5 ++-- .../chat_permissions_settings.dart | 8 +++--- .../chat_permissions_settings_view.dart | 6 ++--- .../permission_list_tile.dart | 6 ++--- .../chat_search/chat_search_files_tab.dart | 6 ++--- .../chat_search/chat_search_images_tab.dart | 8 +++--- .../chat_search/chat_search_message_tab.dart | 10 +++----- lib/pages/chat_search/chat_search_page.dart | 6 ++--- lib/pages/chat_search/chat_search_view.dart | 3 +-- lib/pages/chat_search/search_footer.dart | 3 +-- .../device_settings/device_settings.dart | 11 ++++---- .../device_settings/device_settings_view.dart | 4 +-- .../user_device_list_item.dart | 7 +++--- lib/pages/dialer/dialer.dart | 11 ++++---- lib/pages/dialer/pip/pip_view.dart | 2 +- lib/pages/image_viewer/image_viewer.dart | 9 +++---- lib/pages/image_viewer/image_viewer_view.dart | 7 +++--- lib/pages/image_viewer/video_player.dart | 13 +++++----- .../intro/flows/restore_backup_flow.dart | 3 +-- lib/pages/intro/intro_page.dart | 10 +++----- lib/pages/intro/intro_page_presenter.dart | 16 ++++++------ .../invitation_selection.dart | 7 +++--- .../invitation_selection_view.dart | 7 +++--- .../key_verification_dialog.dart | 10 +++----- lib/pages/login/login.dart | 9 +++---- lib/pages/login/login_view.dart | 4 +-- lib/pages/new_group/new_group.dart | 10 +++----- lib/pages/new_group/new_group_view.dart | 3 +-- .../new_private_chat/new_private_chat.dart | 9 +++---- .../new_private_chat_view.dart | 11 ++++---- .../new_private_chat/qr_scanner_modal.dart | 6 ++--- lib/pages/settings/settings.dart | 13 +++++----- lib/pages/settings/settings_view.dart | 13 +++++----- lib/pages/settings_3pid/settings_3pid.dart | 7 +++--- .../settings_3pid/settings_3pid_view.dart | 6 ++--- .../settings_chat/settings_chat_view.dart | 7 +++--- .../import_archive_dialog.dart | 8 +++--- .../settings_emotes/settings_emotes.dart | 16 ++++++------ .../settings_emotes/settings_emotes_view.dart | 9 +++---- .../settings_homeserver_view.dart | 11 ++++---- .../settings_ignore_list.dart | 7 +++--- .../settings_ignore_list_view.dart | 4 +-- .../push_rule_extensions.dart | 3 +-- .../settings_notifications.dart | 7 +++--- .../settings_notifications_view.dart | 7 +++--- .../settings_password/settings_password.dart | 6 ++--- .../settings_password_view.dart | 6 ++--- .../settings_security/settings_security.dart | 7 +++--- .../settings_security_view.dart | 9 +++---- lib/pages/settings_style/settings_style.dart | 5 ++-- .../settings_style/settings_style_view.dart | 7 +++--- lib/pages/sign_in/sign_in_page.dart | 6 ++--- .../sign_in/view_model/sign_in_state.dart | 3 +-- .../view_model/sign_in_view_model.dart | 6 ++--- lib/utils/adaptive_bottom_sheet.dart | 3 +-- lib/utils/background_push.dart | 11 ++++---- lib/utils/client_manager.dart | 15 ++++++----- lib/utils/custom_http_client.dart | 5 ++-- lib/utils/date_time_extension.dart | 6 ++--- lib/utils/error_reporter.dart | 10 +++----- lib/utils/file_selector.dart | 4 +-- lib/utils/fluffy_share.dart | 9 +++---- lib/utils/init_with_restore.dart | 5 ++-- lib/utils/localized_exception_extension.dart | 5 ++-- lib/utils/markdown_context_builder.dart | 3 +-- .../event_extension.dart | 9 +++---- .../filtered_timeline_extension.dart | 3 +-- .../builder.dart | 8 +++--- .../cipher.dart | 10 +++----- .../matrix_file_extension.dart | 8 +++--- .../matrix_sdk_extensions/matrix_locals.dart | 3 +-- .../notification_background_handler.dart | 6 ++--- lib/utils/platform_infos.dart | 5 ++-- lib/utils/push_helper.dart | 12 ++++----- lib/utils/resize_video.dart | 3 +-- lib/utils/room_status_extension.dart | 3 +-- lib/utils/show_scaffold_dialog.dart | 3 +-- lib/utils/show_update_snackbar.dart | 8 +++--- .../sign_in_flows/calc_redirect_url.dart | 6 ++--- lib/utils/sign_in_flows/check_homeserver.dart | 12 ++++----- lib/utils/sign_in_flows/oidc_login.dart | 12 ++++----- lib/utils/sign_in_flows/sso_login.dart | 8 +++--- lib/utils/sync_status_localization.dart | 6 ++--- lib/utils/uia_request_manager.dart | 8 +++--- lib/utils/url_launcher.dart | 13 +++++----- lib/utils/voip_plugin.dart | 7 +++--- .../adaptive_dialog_action.dart | 3 +-- .../adaptive_dialogs/public_room_dialog.dart | 13 +++++----- .../show_ok_cancel_alert_dialog.dart | 6 ++--- .../show_text_input_dialog.dart | 6 ++--- lib/widgets/adaptive_dialogs/user_dialog.dart | 13 +++++----- lib/widgets/app_lock.dart | 4 +-- lib/widgets/avatar.dart | 6 ++--- lib/widgets/blur_hash.dart | 3 +-- lib/widgets/chat_settings_popup_menu.dart | 9 +++---- lib/widgets/config_viewer.dart | 8 +++--- lib/widgets/fluffy_chat_app.dart | 11 ++++---- lib/widgets/future_loading_dialog.dart | 4 +-- lib/widgets/layouts/login_scaffold.dart | 8 +++--- lib/widgets/layouts/max_width_body.dart | 3 +-- lib/widgets/layouts/two_column_layout.dart | 3 +-- .../local_notifications_extension.dart | 12 ++++----- lib/widgets/lock_screen.dart | 5 ++-- lib/widgets/matrix.dart | 25 +++++++++---------- .../member_actions_popup_menu_button.dart | 7 +++--- lib/widgets/mxc_image.dart | 6 ++--- lib/widgets/mxc_image_viewer.dart | 2 +- lib/widgets/navigation_rail.dart | 8 +++--- lib/widgets/permission_slider_dialog.dart | 3 +-- lib/widgets/presence_builder.dart | 6 ++--- lib/widgets/qr_code_viewer.dart | 15 ++++++----- lib/widgets/settings_switch_list_tile.dart | 3 +-- lib/widgets/share_scaffold_dialog.dart | 8 +++--- lib/widgets/theme_builder.dart | 6 ++--- lib/widgets/unread_rooms_badge.dart | 3 +-- pubspec.lock | 16 ------------ pubspec.yaml | 5 ---- 180 files changed, 553 insertions(+), 815 deletions(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 48d4975f..12ce32de 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -23,8 +23,6 @@ jobs: run: git diff --exit-code pubspec.lock - name: Check formatting run: dart format lib/ test/ --set-exit-if-changed - - name: Check import formatting - run: dart run import_sorter:main --no-comments --exit-if-changed - name: Check license compliance run: dart run license_checker check-licenses -c licenses.yaml --problematic - run: flutter analyze diff --git a/.vscode/settings.json b/.vscode/settings.json index d7e23866..79ce38d3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,7 @@ { - "emeraldwalk.runonsave": { - "commands": [ - { - "match": "\\.dart$", - "cmd": "dart run import_sorter:main --no-comments ${fileBasename}" - } + "[dart]": { + "editor.codeActionsOnSave": [ + "source.organizeImports" ] } } \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c192cc4..b1321195 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,9 +11,8 @@ To improve the process please make sure that you read the following guidelines c 4. Every Pull Request should change only one thing. For bigger changes it is often better to split them up in multiple Pull Requests. 5. [Sign your commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits). 6. Format the commit message as [Conventional Commits](https://www.conventionalcommits.org). -7. Format (`flutter format lib`) and sort impots (`dart run import_sorter:main --no-comments`) in all code files. -8. For bigger or complex changes (more than a couple of code lines) write an issue or refer to an existing issue and ask for approval from the maintainers (@krille-chan) **before** starting to implement it. This way you reduce the risk that your Pull Request get's declined. -9. Prefer simple and easy to maintain solutions over complexity and fancy ones. +7. For bigger or complex changes (more than a couple of code lines) write an issue or refer to an existing issue and ask for approval from the maintainers (@krille-chan) **before** starting to implement it. This way you reduce the risk that your Pull Request get's declined. +8. Prefer simple and easy to maintain solutions over complexity and fancy ones. # Code Style diff --git a/analysis_options.yaml b/analysis_options.yaml index 0b19afcf..05852ec2 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,6 +2,7 @@ include: package:flutter_lints/flutter.yaml linter: rules: + - directives_ordering - avoid_print - constant_identifier_names - prefer_final_locals diff --git a/integration_test/utils/fluffy_chat_tester.dart b/integration_test/utils/fluffy_chat_tester.dart index b91736fc..03fa7da7 100644 --- a/integration_test/utils/fluffy_chat_tester.dart +++ b/integration_test/utils/fluffy_chat_tester.dart @@ -1,6 +1,6 @@ +import 'package:fluffychat/main.dart' as app; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:fluffychat/main.dart' as app; extension type FluffyChatTester(WidgetTester tester) { static int _printCounter = 1; diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 6ae9d3b6..c6c683eb 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,10 +1,5 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/archive/archive.dart'; import 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart'; @@ -39,6 +34,9 @@ import 'package:fluffychat/widgets/layouts/two_column_layout.dart'; import 'package:fluffychat/widgets/log_view.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; abstract class AppRoutes { static FutureOr loggedInRedirect( diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart index 88b3a485..ea4d66f5 100644 --- a/lib/config/setting_keys.dart +++ b/lib/config/setting_keys.dart @@ -1,14 +1,12 @@ import 'dart:convert'; -import 'package:flutter/foundation.dart'; - import 'package:async/async.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import 'package:matrix/matrix_api_lite/utils/logs.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; - enum AppSettings { textMessageMaxLength('textMessageMaxLength', 16384), audioRecordingNumChannels('audioRecordingNumChannels', 1), diff --git a/lib/config/themes.dart b/lib/config/themes.dart index 42d83dc9..a84d8219 100644 --- a/lib/config/themes.dart +++ b/lib/config/themes.dart @@ -1,9 +1,8 @@ +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/config/setting_keys.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:fluffychat/config/setting_keys.dart'; -import 'app_config.dart'; - abstract class FluffyThemes { static const double columnWidth = 380.0; diff --git a/lib/main.dart b/lib/main.dart index 4817f1df..75dd92b7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,20 +1,19 @@ import 'dart:isolate'; import 'dart:ui'; +import 'package:collection/collection.dart'; +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/notification_background_handler.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:collection/collection.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; import 'package:matrix/matrix.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:universal_html/universal_html.dart' as web; -import 'package:fluffychat/config/app_config.dart'; -import 'package:fluffychat/utils/client_manager.dart'; -import 'package:fluffychat/utils/notification_background_handler.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; import 'config/setting_keys.dart'; import 'utils/background_push.dart'; import 'widgets/fluffy_chat_app.dart'; diff --git a/lib/pages/archive/archive.dart b/lib/pages/archive/archive.dart index 2481dfdd..5f8c1e23 100644 --- a/lib/pages/archive/archive.dart +++ b/lib/pages/archive/archive.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/archive/archive_view.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class Archive extends StatefulWidget { const Archive({super.key}); diff --git a/lib/pages/archive/archive_view.dart b/lib/pages/archive/archive_view.dart index 5ef4176f..e8f9b7f1 100644 --- a/lib/pages/archive/archive_view.dart +++ b/lib/pages/archive/archive_view.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/archive/archive.dart'; import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class ArchiveView extends StatelessWidget { final ArchiveController controller; diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index 2be97eed..4ade9f98 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -1,10 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/encryption.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/error_reporter.dart'; @@ -16,6 +9,12 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog. import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + import '../key_verification/key_verification_dialog.dart'; class BootstrapDialog extends StatefulWidget { diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 731ca1b7..255f1c81 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1,20 +1,11 @@ import 'dart:async'; import 'dart:io'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - import 'package:collection/collection.dart'; import 'package:desktop_drop/desktop_drop.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; import 'package:file_picker/file_picker.dart'; -import 'package:go_router/go_router.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:matrix/matrix.dart'; -import 'package:scroll_to_index/scroll_to_index.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -37,6 +28,14 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart' import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:go_router/go_router.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:matrix/matrix.dart'; +import 'package:scroll_to_index/scroll_to_index.dart'; + import '../../utils/account_bundles.dart'; import '../../utils/localized_exception_extension.dart'; import 'send_file_dialog.dart'; diff --git a/lib/pages/chat/chat_app_bar_list_tile.dart b/lib/pages/chat/chat_app_bar_list_tile.dart index 0f038a89..f3bf9cd1 100644 --- a/lib/pages/chat/chat_app_bar_list_tile.dart +++ b/lib/pages/chat/chat_app_bar_list_tile.dart @@ -1,8 +1,6 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; - import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; class ChatAppBarListTile extends StatelessWidget { final Widget? leading; diff --git a/lib/pages/chat/chat_app_bar_title.dart b/lib/pages/chat/chat_app_bar_title.dart index cbda4bc3..6ce556fb 100644 --- a/lib/pages/chat/chat_app_bar_title.dart +++ b/lib/pages/chat/chat_app_bar_title.dart @@ -1,8 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; @@ -11,6 +6,9 @@ import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/sync_status_localization.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/presence_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class ChatAppBarTitle extends StatelessWidget { final ChatController controller; diff --git a/lib/pages/chat/chat_emoji_picker.dart b/lib/pages/chat/chat_emoji_picker.dart index be845bdd..8173734c 100644 --- a/lib/pages/chat/chat_emoji_picker.dart +++ b/lib/pages/chat/chat_emoji_picker.dart @@ -1,11 +1,10 @@ -import 'package:flutter/material.dart'; - import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/sticker_picker_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import 'chat.dart'; class ChatEmojiPicker extends StatelessWidget { diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index 18da7f67..d4ff1163 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -1,9 +1,4 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart'; -import 'package:scroll_to_index/scroll_to_index.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; @@ -13,6 +8,9 @@ import 'package:fluffychat/pages/chat/typing_indicators.dart'; import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/filtered_timeline_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:scroll_to_index/scroll_to_index.dart'; class ChatEventList extends StatelessWidget { final ChatController controller; diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart index e1bee846..c0a664f6 100644 --- a/lib/pages/chat/chat_input_row.dart +++ b/lib/pages/chat/chat_input_row.dart @@ -1,8 +1,4 @@ -import 'package:flutter/material.dart'; - import 'package:emoji_picker_flutter/locales/default_emoji_set_locale.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/recording_input_row.dart'; @@ -12,6 +8,9 @@ import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../config/themes.dart'; import 'chat.dart'; import 'input_bar.dart'; diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index e9f71834..39a2c8f3 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -1,11 +1,7 @@ import 'dart:ui' as ui; -import 'package:flutter/material.dart'; - import 'package:badges/badges.dart'; import 'package:desktop_drop/desktop_drop.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -24,6 +20,9 @@ import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; import 'package:fluffychat/widgets/unread_rooms_badge.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/stream_extension.dart'; import 'chat_emoji_picker.dart'; import 'chat_input_row.dart'; diff --git a/lib/pages/chat/encryption_button.dart b/lib/pages/chat/encryption_button.dart index 594ec4e4..d6495f6f 100644 --- a/lib/pages/chat/encryption_button.dart +++ b/lib/pages/chat/encryption_button.dart @@ -1,10 +1,9 @@ -import 'package:flutter/material.dart'; - import 'package:badges/badges.dart' as b; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/l10n/l10n.dart'; import '../../widgets/matrix.dart'; class EncryptionButton extends StatelessWidget { diff --git a/lib/pages/chat/event_info_dialog.dart b/lib/pages/chat/event_info_dialog.dart index 9dd0e7bb..e7c75965 100644 --- a/lib/pages/chat/event_info_dialog.dart +++ b/lib/pages/chat/event_info_dialog.dart @@ -1,14 +1,12 @@ import 'dart:convert'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; extension EventInfoDialogExtension on Event { void showInfoDialog(BuildContext context) => showAdaptiveBottomSheet( diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index f78345d3..9fc2dbf1 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -1,22 +1,21 @@ import 'dart:async'; import 'dart:io'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - import 'package:async/async.dart'; -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:just_audio/just_audio.dart'; -import 'package:matrix/matrix.dart'; -import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart'; -import 'package:path_provider/path_provider.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/utils/error_reporter.dart'; import 'package:fluffychat/utils/file_description.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:matrix/matrix.dart'; +import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart'; +import 'package:path_provider/path_provider.dart'; + import '../../../utils/matrix_sdk_extensions/event_extension.dart'; import '../../../widgets/fluffy_chat_app.dart'; import '../../../widgets/matrix.dart'; diff --git a/lib/pages/chat/events/cute_events.dart b/lib/pages/chat/events/cute_events.dart index 60453771..01d53c6d 100644 --- a/lib/pages/chat/events/cute_events.dart +++ b/lib/pages/chat/events/cute_events.dart @@ -1,11 +1,9 @@ import 'dart:math'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class CuteContent extends StatefulWidget { final Event event; diff --git a/lib/pages/chat/events/html_message.dart b/lib/pages/chat/events/html_message.dart index 906c6c24..e4ded6f1 100644 --- a/lib/pages/chat/events/html_message.dart +++ b/lib/pages/chat/events/html_message.dart @@ -1,18 +1,17 @@ +import 'package:collection/collection.dart'; +import 'package:fluffychat/utils/code_highlight_theme.dart'; +import 'package:fluffychat/utils/event_checkbox_extension.dart'; +import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:fluffychat/widgets/mxc_image.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; - -import 'package:collection/collection.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; import 'package:highlight/highlight.dart' show highlight; import 'package:html/dom.dart' as dom; import 'package:html/parser.dart' as parser; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/utils/code_highlight_theme.dart'; -import 'package:fluffychat/utils/event_checkbox_extension.dart'; -import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/future_loading_dialog.dart'; -import 'package:fluffychat/widgets/mxc_image.dart'; import '../../../utils/url_launcher.dart'; class HtmlMessage extends StatelessWidget { diff --git a/lib/pages/chat/events/image_bubble.dart b/lib/pages/chat/events/image_bubble.dart index 845814fc..af703f05 100644 --- a/lib/pages/chat/events/image_bubble.dart +++ b/lib/pages/chat/events/image_bubble.dart @@ -1,13 +1,12 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/file_description.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; + import '../../../widgets/blur_hash.dart'; class ImageBubble extends StatelessWidget { diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 580cdf32..9bcd39a9 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -1,12 +1,6 @@ import 'dart:ui' as ui; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; -import 'package:matrix/matrix.dart'; -import 'package:swipe_to_action/swipe_to_action.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -18,6 +12,11 @@ import 'package:fluffychat/utils/string_color.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; +import 'package:swipe_to_action/swipe_to_action.dart'; + import '../../../config/app_config.dart'; import 'message_content.dart'; import 'message_reactions.dart'; diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index 24041eab..eb5aa649 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -1,11 +1,5 @@ import 'dart:math'; -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/encryption.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/events/poll.dart'; @@ -16,6 +10,11 @@ import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + import '../../../config/app_config.dart'; import '../../../utils/event_checkbox_extension.dart'; import '../../../utils/platform_infos.dart'; diff --git a/lib/pages/chat/events/message_download_content.dart b/lib/pages/chat/events/message_download_content.dart index 501c0243..1d555567 100644 --- a/lib/pages/chat/events/message_download_content.dart +++ b/lib/pages/chat/events/message_download_content.dart @@ -1,13 +1,11 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/file_description.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; import 'package:fluffychat/utils/url_launcher.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; class MessageDownloadContent extends StatelessWidget { final Event event; diff --git a/lib/pages/chat/events/message_reactions.dart b/lib/pages/chat/events/message_reactions.dart index 4bafaa6f..2ea76cdd 100644 --- a/lib/pages/chat/events/message_reactions.dart +++ b/lib/pages/chat/events/message_reactions.dart @@ -1,13 +1,11 @@ -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart' show IterableExtension; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class MessageReactions extends StatelessWidget { final Event event; diff --git a/lib/pages/chat/events/poll.dart b/lib/pages/chat/events/poll.dart index d4506602..db81eb8a 100644 --- a/lib/pages/chat/events/poll.dart +++ b/lib/pages/chat/events/poll.dart @@ -1,15 +1,13 @@ -import 'package:flutter/material.dart'; - import 'package:async/async.dart'; -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:matrix/matrix.dart' hide Result; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart' hide Result; class PollWidget extends StatelessWidget { final Event event; diff --git a/lib/pages/chat/events/reply_content.dart b/lib/pages/chat/events/reply_content.dart index 8211e431..31070a31 100644 --- a/lib/pages/chat/events/reply_content.dart +++ b/lib/pages/chat/events/reply_content.dart @@ -1,10 +1,9 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../../config/app_config.dart'; class ReplyContent extends StatelessWidget { diff --git a/lib/pages/chat/events/state_message.dart b/lib/pages/chat/events/state_message.dart index 9c8ad3da..e0dd359a 100644 --- a/lib/pages/chat/events/state_message.dart +++ b/lib/pages/chat/events/state_message.dart @@ -1,12 +1,11 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../../config/app_config.dart'; class StateMessage extends StatelessWidget { diff --git a/lib/pages/chat/events/video_player.dart b/lib/pages/chat/events/video_player.dart index d0593cb4..4330da28 100644 --- a/lib/pages/chat/events/video_player.dart +++ b/lib/pages/chat/events/video_player.dart @@ -1,10 +1,5 @@ import 'dart:math'; -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/file_description.dart'; @@ -13,6 +8,10 @@ import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/blur_hash.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; + import '../../image_viewer/image_viewer.dart'; class EventVideoPlayer extends StatelessWidget { diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar.dart index 22becb30..a8944107 100644 --- a/lib/pages/chat/input_bar.dart +++ b/lib/pages/chat/input_bar.dart @@ -1,15 +1,14 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; -import 'package:matrix/matrix.dart'; -import 'package:slugify/slugify.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/markdown_context_builder.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; +import 'package:slugify/slugify.dart'; + import '../../widgets/avatar.dart'; import '../../widgets/matrix.dart'; import 'command_hints.dart'; diff --git a/lib/pages/chat/jitsi_popup_button.dart b/lib/pages/chat/jitsi_popup_button.dart index aa25046c..28343fd2 100644 --- a/lib/pages/chat/jitsi_popup_button.dart +++ b/lib/pages/chat/jitsi_popup_button.dart @@ -1,13 +1,11 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/url_launcher.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher.dart'; class JitsiPopupButton extends StatelessWidget { final Room room; diff --git a/lib/pages/chat/pinned_events.dart b/lib/pages/chat/pinned_events.dart index da600a22..53b6ebcf 100644 --- a/lib/pages/chat/pinned_events.dart +++ b/lib/pages/chat/pinned_events.dart @@ -1,15 +1,13 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pages/chat/chat_app_bar_list_tile.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class PinnedEvents extends StatelessWidget { final ChatController controller; diff --git a/lib/pages/chat/recording_input_row.dart b/lib/pages/chat/recording_input_row.dart index b5b66706..66538cbd 100644 --- a/lib/pages/chat/recording_input_row.dart +++ b/lib/pages/chat/recording_input_row.dart @@ -1,9 +1,8 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat_input_row.dart'; import 'package:fluffychat/pages/chat/recording_view_model.dart'; +import 'package:flutter/material.dart'; class RecordingInputRow extends StatelessWidget { final RecordingViewModelState state; diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index 2f401c1c..de587920 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -1,20 +1,19 @@ import 'dart:async'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:device_info_plus/device_info_plus.dart'; import 'package:matrix/matrix.dart'; import 'package:path/path.dart' as path_lib; import 'package:path_provider/path_provider.dart'; import 'package:record/record.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; -import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'events/audio_player.dart'; class RecordingViewModel extends StatefulWidget { diff --git a/lib/pages/chat/reply_display.dart b/lib/pages/chat/reply_display.dart index 2090cecc..1c416e89 100644 --- a/lib/pages/chat/reply_display.dart +++ b/lib/pages/chat/reply_display.dart @@ -1,9 +1,8 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../config/themes.dart'; import 'chat.dart'; import 'events/reply_content.dart'; diff --git a/lib/pages/chat/seen_by_row.dart b/lib/pages/chat/seen_by_row.dart index 65ecf6cd..b791cfb2 100644 --- a/lib/pages/chat/seen_by_row.dart +++ b/lib/pages/chat/seen_by_row.dart @@ -1,10 +1,8 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class SeenByRow extends StatelessWidget { final Event event; diff --git a/lib/pages/chat/send_file_dialog.dart b/lib/pages/chat/send_file_dialog.dart index 4e67b338..ef6b9cb5 100644 --- a/lib/pages/chat/send_file_dialog.dart +++ b/lib/pages/chat/send_file_dialog.dart @@ -1,11 +1,5 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - import 'package:async/async.dart' show Result; import 'package:cross_file/cross_file.dart'; -import 'package:matrix/matrix.dart' hide Result; -import 'package:mime/mime.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; @@ -15,6 +9,11 @@ import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/size_string.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart' hide Result; +import 'package:mime/mime.dart'; + import '../../utils/resize_video.dart'; class SendFileDialog extends StatefulWidget { diff --git a/lib/pages/chat/send_location_dialog.dart b/lib/pages/chat/send_location_dialog.dart index 91460467..5c460eb6 100644 --- a/lib/pages/chat/send_location_dialog.dart +++ b/lib/pages/chat/send_location_dialog.dart @@ -1,15 +1,13 @@ import 'dart:async'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:geolocator/geolocator.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/events/map_bubble.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:matrix/matrix.dart'; class SendLocationDialog extends StatefulWidget { final Room room; diff --git a/lib/pages/chat/start_poll_bottom_sheet.dart b/lib/pages/chat/start_poll_bottom_sheet.dart index 7c5bf176..5612f7fe 100644 --- a/lib/pages/chat/start_poll_bottom_sheet.dart +++ b/lib/pages/chat/start_poll_bottom_sheet.dart @@ -1,9 +1,7 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class StartPollBottomSheet extends StatefulWidget { final Room room; diff --git a/lib/pages/chat/sticker_picker_dialog.dart b/lib/pages/chat/sticker_picker_dialog.dart index e4c21f46..9ccb3175 100644 --- a/lib/pages/chat/sticker_picker_dialog.dart +++ b/lib/pages/chat/sticker_picker_dialog.dart @@ -1,11 +1,10 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/avatar.dart'; class StickerPickerDialog extends StatefulWidget { diff --git a/lib/pages/chat/typing_indicators.dart b/lib/pages/chat/typing_indicators.dart index 236c30e5..5419bdce 100644 --- a/lib/pages/chat/typing_indicators.dart +++ b/lib/pages/chat/typing_indicators.dart @@ -1,12 +1,11 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; class TypingIndicators extends StatelessWidget { final ChatController controller; diff --git a/lib/pages/chat_access_settings/chat_access_settings_controller.dart b/lib/pages/chat_access_settings/chat_access_settings_controller.dart index 93f5cda0..e090e863 100644 --- a/lib/pages/chat_access_settings/chat_access_settings_controller.dart +++ b/lib/pages/chat_access_settings/chat_access_settings_controller.dart @@ -1,8 +1,3 @@ -import 'package:flutter/material.dart' hide Visibility; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; @@ -11,6 +6,9 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog. import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart' hide Visibility; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class ChatAccessSettings extends StatefulWidget { final String roomId; diff --git a/lib/pages/chat_access_settings/chat_access_settings_page.dart b/lib/pages/chat_access_settings/chat_access_settings_page.dart index 5c1c55c6..6f659d89 100644 --- a/lib/pages/chat_access_settings/chat_access_settings_page.dart +++ b/lib/pages/chat_access_settings/chat_access_settings_page.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart' hide Visibility; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart' hide Visibility; +import 'package:matrix/matrix.dart'; class ChatAccessSettingsPageView extends StatelessWidget { final ChatAccessSettingsController controller; diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index b9a02690..d227e24e 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -1,10 +1,5 @@ -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart'; import 'package:file_picker/file_picker.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_details/chat_details_view.dart'; import 'package:fluffychat/pages/settings/settings.dart'; @@ -15,6 +10,9 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:matrix/matrix.dart'; class ChatDetails extends StatefulWidget { final String roomId; diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart index e17e21a8..4260ca5b 100644 --- a/lib/pages/chat_details/chat_details_view.dart +++ b/lib/pages/chat_details/chat_details_view.dart @@ -1,9 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_details/chat_details.dart'; import 'package:fluffychat/pages/chat_details/participant_list_item.dart'; @@ -13,6 +7,11 @@ import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/url_launcher.dart'; import '../../widgets/mxc_image_viewer.dart'; import '../../widgets/qr_code_viewer.dart'; diff --git a/lib/pages/chat_details/participant_list_item.dart b/lib/pages/chat_details/participant_list_item.dart index 54dcf8be..2a6ffa89 100644 --- a/lib/pages/chat_details/participant_list_item.dart +++ b/lib/pages/chat_details/participant_list_item.dart @@ -1,10 +1,9 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/member_actions_popup_menu_button.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/avatar.dart'; class ParticipantListItem extends StatelessWidget { diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart index d8db6f25..efcaf751 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart @@ -1,14 +1,13 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/encryption.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings_view.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + import '../key_verification/key_verification_dialog.dart'; class ChatEncryptionSettings extends StatefulWidget { diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart index 03309d17..5ed1eb3c 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings_view.dart @@ -1,16 +1,14 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart'; import 'package:fluffychat/utils/beautify_string_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; class ChatEncryptionSettingsView extends StatelessWidget { final ChatEncryptionSettingsController controller; diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 2ec58c0f..bb00e694 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -1,17 +1,7 @@ import 'dart:async'; import 'dart:developer'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - import 'package:cross_file/cross_file.dart'; -import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart' as sdk; -import 'package:matrix/matrix.dart'; -import 'package:receive_sharing_intent/receive_sharing_intent.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list_view.dart'; @@ -26,6 +16,15 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart' import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; +import 'package:receive_sharing_intent/receive_sharing_intent.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + import '../../../utils/account_bundles.dart'; import '../../config/setting_keys.dart'; import '../../utils/url_launcher.dart'; diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index ba1fee31..8489128f 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -1,8 +1,3 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; @@ -14,6 +9,10 @@ import 'package:fluffychat/pages/chat_list/status_msg_list.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/public_room_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../config/themes.dart'; import '../../widgets/adaptive_dialogs/user_dialog.dart'; import '../../widgets/matrix.dart'; diff --git a/lib/pages/chat_list/chat_list_header.dart b/lib/pages/chat_list/chat_list_header.dart index fa1b9ff1..adf695a1 100644 --- a/lib/pages/chat_list/chat_list_header.dart +++ b/lib/pages/chat_list/chat_list_header.dart @@ -1,12 +1,11 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/client_chooser_button.dart'; import 'package:fluffychat/utils/sync_status_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/matrix.dart'; class ChatListHeader extends StatelessWidget implements PreferredSizeWidget { diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index abe0cb87..3cc410e8 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -1,7 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_list/unread_bubble.dart'; @@ -10,6 +6,9 @@ import 'package:fluffychat/utils/room_status_extension.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/hover_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../config/themes.dart'; import '../../utils/date_time_extension.dart'; import '../../widgets/avatar.dart'; diff --git a/lib/pages/chat_list/chat_list_view.dart b/lib/pages/chat_list/chat_list_view.dart index 3c332ce4..09d85ef5 100644 --- a/lib/pages/chat_list/chat_list_view.dart +++ b/lib/pages/chat_list/chat_list_view.dart @@ -1,10 +1,10 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/start_chat_fab.dart'; import 'package:fluffychat/widgets/navigation_rail.dart'; +import 'package:flutter/material.dart'; + import 'chat_list_body.dart'; class ChatListView extends StatelessWidget { diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index fdf196d8..64d7d08f 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -1,14 +1,13 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + import '../../utils/fluffy_share.dart'; import 'chat_list.dart'; diff --git a/lib/pages/chat_list/navi_rail_item.dart b/lib/pages/chat_list/navi_rail_item.dart index b0c50a92..b9feba5d 100644 --- a/lib/pages/chat_list/navi_rail_item.dart +++ b/lib/pages/chat_list/navi_rail_item.dart @@ -1,11 +1,10 @@ -import 'package:flutter/material.dart'; - import 'package:badges/badges.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/unread_rooms_badge.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../config/themes.dart'; class NaviRailItem extends StatelessWidget { diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index 72c9446a..b24f1993 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -1,13 +1,7 @@ import 'dart:async'; import 'dart:convert'; -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart' as sdk; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -20,6 +14,10 @@ import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; enum SpaceChildAction { mute, diff --git a/lib/pages/chat_list/start_chat_fab.dart b/lib/pages/chat_list/start_chat_fab.dart index 3f206b2a..a05473a4 100644 --- a/lib/pages/chat_list/start_chat_fab.dart +++ b/lib/pages/chat_list/start_chat_fab.dart @@ -1,8 +1,6 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; - import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; class StartChatFab extends StatelessWidget { const StartChatFab({super.key}); diff --git a/lib/pages/chat_list/status_msg_list.dart b/lib/pages/chat_list/status_msg_list.dart index 7677e031..eccd3008 100644 --- a/lib/pages/chat_list/status_msg_list.dart +++ b/lib/pages/chat_list/status_msg_list.dart @@ -1,13 +1,12 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/adaptive_dialogs/user_dialog.dart'; class StatusMessageList extends StatelessWidget { diff --git a/lib/pages/chat_list/unread_bubble.dart b/lib/pages/chat_list/unread_bubble.dart index 9dfd9249..c7839b07 100644 --- a/lib/pages/chat_list/unread_bubble.dart +++ b/lib/pages/chat_list/unread_bubble.dart @@ -1,8 +1,6 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class UnreadBubble extends StatelessWidget { final Room room; diff --git a/lib/pages/chat_members/chat_members_view.dart b/lib/pages/chat_members/chat_members_view.dart index 81e15ea6..d682743a 100644 --- a/lib/pages/chat_members/chat_members_view.dart +++ b/lib/pages/chat_members/chat_members_view.dart @@ -1,10 +1,9 @@ +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:flutter/material.dart'; - import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; import '../../widgets/layouts/max_width_body.dart'; import '../../widgets/matrix.dart'; import '../chat_details/participant_list_item.dart'; diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart index 9a7899cd..f7d342fe 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -1,13 +1,11 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings_view.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/permission_slider_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class ChatPermissionsSettings extends StatefulWidget { const ChatPermissionsSettings({super.key}); diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart index e904403a..1b7a6f51 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings_view.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart'; import 'package:fluffychat/pages/chat_permissions_settings/permission_list_tile.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class ChatPermissionsSettingsView extends StatelessWidget { final ChatPermissionsSettingsController controller; diff --git a/lib/pages/chat_permissions_settings/permission_list_tile.dart b/lib/pages/chat_permissions_settings/permission_list_tile.dart index 7344ba5b..6769367b 100644 --- a/lib/pages/chat_permissions_settings/permission_list_tile.dart +++ b/lib/pages/chat_permissions_settings/permission_list_tile.dart @@ -1,9 +1,7 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class PermissionsListTile extends StatelessWidget { final String permissionKey; diff --git a/lib/pages/chat_search/chat_search_files_tab.dart b/lib/pages/chat_search/chat_search_files_tab.dart index 4aa95225..77268e19 100644 --- a/lib/pages/chat_search/chat_search_files_tab.dart +++ b/lib/pages/chat_search/chat_search_files_tab.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_search/search_footer.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class ChatSearchFilesTab extends StatelessWidget { final Room room; diff --git a/lib/pages/chat_search/chat_search_images_tab.dart b/lib/pages/chat_search/chat_search_images_tab.dart index 5b018ccc..7ec4a394 100644 --- a/lib/pages/chat_search/chat_search_images_tab.dart +++ b/lib/pages/chat_search/chat_search_images_tab.dart @@ -1,13 +1,11 @@ -import 'package:flutter/material.dart'; - -import 'package:intl/intl.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat/events/video_player.dart'; import 'package:fluffychat/pages/chat_search/search_footer.dart'; import 'package:fluffychat/pages/image_viewer/image_viewer.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:matrix/matrix.dart'; class ChatSearchImagesTab extends StatelessWidget { final Room room; diff --git a/lib/pages/chat_search/chat_search_message_tab.dart b/lib/pages/chat_search/chat_search_message_tab.dart index c58a2de3..c590eb08 100644 --- a/lib/pages/chat_search/chat_search_message_tab.dart +++ b/lib/pages/chat_search/chat_search_message_tab.dart @@ -1,15 +1,13 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_search/search_footer.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class ChatSearchMessageTab extends StatelessWidget { final String searchQuery; diff --git a/lib/pages/chat_search/chat_search_page.dart b/lib/pages/chat_search/chat_search_page.dart index 579a2103..08d2d6a9 100644 --- a/lib/pages/chat_search/chat_search_page.dart +++ b/lib/pages/chat_search/chat_search_page.dart @@ -1,9 +1,7 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/pages/chat_search/chat_search_view.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class ChatSearchPage extends StatefulWidget { final String roomId; diff --git a/lib/pages/chat_search/chat_search_view.dart b/lib/pages/chat_search/chat_search_view.dart index 278478fa..4632feb6 100644 --- a/lib/pages/chat_search/chat_search_view.dart +++ b/lib/pages/chat_search/chat_search_view.dart @@ -1,5 +1,3 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_search/chat_search_files_tab.dart'; @@ -8,6 +6,7 @@ import 'package:fluffychat/pages/chat_search/chat_search_message_tab.dart'; import 'package:fluffychat/pages/chat_search/chat_search_page.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; class ChatSearchView extends StatelessWidget { final ChatSearchController controller; diff --git a/lib/pages/chat_search/search_footer.dart b/lib/pages/chat_search/search_footer.dart index cac19c4e..732ee3c0 100644 --- a/lib/pages/chat_search/search_footer.dart +++ b/lib/pages/chat_search/search_footer.dart @@ -1,7 +1,6 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; +import 'package:flutter/material.dart'; class SearchFooter extends StatelessWidget { final DateTime? searchedUntil; diff --git a/lib/pages/device_settings/device_settings.dart b/lib/pages/device_settings/device_settings.dart index 9c764452..05eb1efb 100644 --- a/lib/pages/device_settings/device_settings.dart +++ b/lib/pages/device_settings/device_settings.dart @@ -1,17 +1,16 @@ -import 'package:flutter/material.dart'; - import 'package:async/async.dart' show Result; import 'package:collection/collection.dart' show IterableExtension; -import 'package:matrix/encryption.dart'; -import 'package:matrix/matrix.dart' hide Result; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/device_settings/device_settings_view.dart'; import 'package:fluffychat/pages/key_verification/key_verification_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart' hide Result; +import 'package:url_launcher/url_launcher_string.dart'; + import '../../widgets/matrix.dart'; class DevicesSettings extends StatefulWidget { diff --git a/lib/pages/device_settings/device_settings_view.dart b/lib/pages/device_settings/device_settings_view.dart index 232ae06c..334cd04e 100644 --- a/lib/pages/device_settings/device_settings_view.dart +++ b/lib/pages/device_settings/device_settings_view.dart @@ -1,9 +1,9 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/device_settings/device_settings.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; + import 'user_device_list_item.dart'; class DevicesSettingsView extends StatelessWidget { diff --git a/lib/pages/device_settings/user_device_list_item.dart b/lib/pages/device_settings/user_device_list_item.dart index 095a4335..e0b645a1 100644 --- a/lib/pages/device_settings/user_device_list_item.dart +++ b/lib/pages/device_settings/user_device_list_item.dart @@ -1,10 +1,9 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/date_time_extension.dart'; import '../../utils/matrix_sdk_extensions/device_extension.dart'; import '../../widgets/matrix.dart'; diff --git a/lib/pages/dialer/dialer.dart b/lib/pages/dialer/dialer.dart index f7af5b54..774700fc 100644 --- a/lib/pages/dialer/dialer.dart +++ b/lib/pages/dialer/dialer.dart @@ -19,21 +19,20 @@ import 'dart:async'; import 'dart:math'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:fluffychat/utils/voip/video_renderer.dart'; +import 'package:fluffychat/widgets/avatar.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' hide VideoRenderer; import 'package:just_audio/just_audio.dart'; import 'package:matrix/matrix.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; -import 'package:fluffychat/utils/voip/video_renderer.dart'; -import 'package:fluffychat/widgets/avatar.dart'; import 'pip/pip_view.dart'; class _StreamView extends StatelessWidget { diff --git a/lib/pages/dialer/pip/pip_view.dart b/lib/pages/dialer/pip/pip_view.dart index 804ee837..d4e78d66 100644 --- a/lib/pages/dialer/pip/pip_view.dart +++ b/lib/pages/dialer/pip/pip_view.dart @@ -1,6 +1,6 @@ +import 'package:fluffychat/config/themes.dart'; import 'package:flutter/material.dart'; -import 'package:fluffychat/config/themes.dart'; import 'dismiss_keyboard.dart'; class PIPView extends StatefulWidget { diff --git a/lib/pages/image_viewer/image_viewer.dart b/lib/pages/image_viewer/image_viewer.dart index fc64d0f4..7555ee70 100644 --- a/lib/pages/image_viewer/image_viewer.dart +++ b/lib/pages/image_viewer/image_viewer.dart @@ -1,13 +1,12 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/image_viewer/image_viewer_view.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/show_scaffold_dialog.dart'; import 'package:fluffychat/widgets/share_scaffold_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/matrix_sdk_extensions/event_extension.dart'; class ImageViewer extends StatefulWidget { diff --git a/lib/pages/image_viewer/image_viewer_view.dart b/lib/pages/image_viewer/image_viewer_view.dart index 7eb52949..dea0daf8 100644 --- a/lib/pages/image_viewer/image_viewer_view.dart +++ b/lib/pages/image_viewer/image_viewer_view.dart @@ -1,12 +1,11 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/image_viewer/video_player.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import 'image_viewer.dart'; class ImageViewerView extends StatelessWidget { diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index 5b0991ea..7c17f80f 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -1,17 +1,16 @@ import 'dart:io'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - import 'package:chewie/chewie.dart'; -import 'package:matrix/matrix.dart'; -import 'package:path_provider/path_provider.dart'; -import 'package:video_player/video_player.dart'; - import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/blur_hash.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:video_player/video_player.dart'; + import '../../../utils/error_reporter.dart'; import '../../widgets/mxc_image.dart'; diff --git a/lib/pages/intro/flows/restore_backup_flow.dart b/lib/pages/intro/flows/restore_backup_flow.dart index c8f18052..2e8e6d00 100644 --- a/lib/pages/intro/flows/restore_backup_flow.dart +++ b/lib/pages/intro/flows/restore_backup_flow.dart @@ -1,8 +1,7 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/utils/file_selector.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; Future restoreBackupFlow(BuildContext context) async { final picked = await selectFiles(context); diff --git a/lib/pages/intro/intro_page.dart b/lib/pages/intro/intro_page.dart index 4d56fc1a..f57878a5 100644 --- a/lib/pages/intro/intro_page.dart +++ b/lib/pages/intro/intro_page.dart @@ -1,15 +1,13 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:go_router/go_router.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/intro/flows/restore_backup_flow.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:url_launcher/url_launcher_string.dart'; class IntroPage extends StatelessWidget { final bool isLoading, hasPresetHomeserver; diff --git a/lib/pages/intro/intro_page_presenter.dart b/lib/pages/intro/intro_page_presenter.dart index 9188a4db..27cb86bb 100644 --- a/lib/pages/intro/intro_page_presenter.dart +++ b/lib/pages/intro/intro_page_presenter.dart @@ -1,14 +1,5 @@ import 'dart:convert'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix_api_lite/utils/logs.dart'; -import 'package:matrix/msc_extensions/msc_2964_oidc_login_flow/msc_2964_oidc_login_flow.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:universal_html/universal_html.dart' as web; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/pages/intro/intro_page.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; @@ -16,6 +7,13 @@ import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart'; import 'package:fluffychat/utils/sign_in_flows/check_homeserver.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix_api_lite/utils/logs.dart'; +import 'package:matrix/msc_extensions/msc_2964_oidc_login_flow/msc_2964_oidc_login_flow.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/universal_html.dart' as web; class IntroPagePresenter extends StatefulWidget { const IntroPagePresenter({super.key}); diff --git a/lib/pages/invitation_selection/invitation_selection.dart b/lib/pages/invitation_selection/invitation_selection.dart index b662829e..ff769106 100644 --- a/lib/pages/invitation_selection/invitation_selection.dart +++ b/lib/pages/invitation_selection/invitation_selection.dart @@ -1,13 +1,12 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection_view.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/localized_exception_extension.dart'; class InvitationSelection extends StatefulWidget { diff --git a/lib/pages/invitation_selection/invitation_selection_view.dart b/lib/pages/invitation_selection/invitation_selection_view.dart index 562713d8..514ec2a6 100644 --- a/lib/pages/invitation_selection/invitation_selection_view.dart +++ b/lib/pages/invitation_selection/invitation_selection_view.dart @@ -1,12 +1,11 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/adaptive_dialogs/user_dialog.dart'; class InvitationSelectionView extends StatelessWidget { diff --git a/lib/pages/key_verification/key_verification_dialog.dart b/lib/pages/key_verification/key_verification_dialog.dart index 1b04b8dd..d1329992 100644 --- a/lib/pages/key_verification/key_verification_dialog.dart +++ b/lib/pages/key_verification/key_verification_dialog.dart @@ -1,17 +1,15 @@ import 'dart:convert'; import 'dart:ui'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:matrix/encryption.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; class KeyVerificationDialog extends StatefulWidget { Future show(BuildContext context) => showAdaptiveDialog( diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index b1eecd0b..8fb9ec73 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -1,16 +1,15 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/platform_infos.dart'; import 'login_view.dart'; diff --git a/lib/pages/login/login_view.dart b/lib/pages/login/login_view.dart index f0352640..738d8b08 100644 --- a/lib/pages/login/login_view.dart +++ b/lib/pages/login/login_view.dart @@ -1,7 +1,7 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; +import 'package:flutter/material.dart'; + import 'login.dart'; class LoginView extends StatelessWidget { diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index f1945e47..538edab7 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -1,16 +1,14 @@ import 'dart:typed_data'; -import 'package:flutter/material.dart'; - import 'package:file_picker/file_picker.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart' as sdk; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/new_group/new_group_view.dart'; import 'package:fluffychat/utils/file_selector.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart' as sdk; +import 'package:matrix/matrix.dart'; class NewGroup extends StatefulWidget { final CreateGroupType createGroupType; diff --git a/lib/pages/new_group/new_group_view.dart b/lib/pages/new_group/new_group_view.dart index 61f86736..d92dfad4 100644 --- a/lib/pages/new_group/new_group_view.dart +++ b/lib/pages/new_group/new_group_view.dart @@ -1,11 +1,10 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/new_group/new_group.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; class NewGroupView extends StatelessWidget { final NewGroupController controller; diff --git a/lib/pages/new_private_chat/new_private_chat.dart b/lib/pages/new_private_chat/new_private_chat.dart index e5d8e202..faf30114 100644 --- a/lib/pages/new_private_chat/new_private_chat.dart +++ b/lib/pages/new_private_chat/new_private_chat.dart @@ -1,11 +1,6 @@ import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - import 'package:device_info_plus/device_info_plus.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/new_private_chat/new_private_chat_view.dart'; import 'package:fluffychat/pages/new_private_chat/qr_scanner_modal.dart'; @@ -14,6 +9,10 @@ import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/adaptive_dialogs/user_dialog.dart'; class NewPrivateChat extends StatefulWidget { diff --git a/lib/pages/new_private_chat/new_private_chat_view.dart b/lib/pages/new_private_chat/new_private_chat_view.dart index d72ba4c2..905ca0ec 100644 --- a/lib/pages/new_private_chat/new_private_chat_view.dart +++ b/lib/pages/new_private_chat/new_private_chat_view.dart @@ -1,9 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; -import 'package:pretty_qr_code/pretty_qr_code.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -14,6 +8,11 @@ import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:pretty_qr_code/pretty_qr_code.dart'; + import '../../widgets/qr_code_viewer.dart'; class NewPrivateChatView extends StatelessWidget { diff --git a/lib/pages/new_private_chat/qr_scanner_modal.dart b/lib/pages/new_private_chat/qr_scanner_modal.dart index b47dc566..53a822b0 100644 --- a/lib/pages/new_private_chat/qr_scanner_modal.dart +++ b/lib/pages/new_private_chat/qr_scanner_modal.dart @@ -1,11 +1,9 @@ import 'dart:async'; import 'dart:io'; -import 'package:flutter/material.dart'; - -import 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart'; - import 'package:fluffychat/l10n/l10n.dart'; +import 'package:flutter/material.dart'; +import 'package:qr_code_scanner_plus/qr_code_scanner_plus.dart'; class QrScannerModal extends StatefulWidget { final void Function(String) onScan; diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 4f5be9a8..2b988d08 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -1,14 +1,7 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart'; import 'package:file_picker/file_picker.dart'; -import 'package:go_router/go_router.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:matrix/encryption.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/file_selector.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -16,6 +9,12 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/matrix.dart'; import 'settings_view.dart'; diff --git a/lib/pages/settings/settings_view.dart b/lib/pages/settings/settings_view.dart index e8ad37df..00b3d64f 100644 --- a/lib/pages/settings/settings_view.dart +++ b/lib/pages/settings/settings_view.dart @@ -1,16 +1,15 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + import '../../widgets/mxc_image_viewer.dart'; import 'settings.dart'; diff --git a/lib/pages/settings_3pid/settings_3pid.dart b/lib/pages/settings_3pid/settings_3pid.dart index 765399ec..18f89be7 100644 --- a/lib/pages/settings_3pid/settings_3pid.dart +++ b/lib/pages/settings_3pid/settings_3pid.dart @@ -1,12 +1,11 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import 'settings_3pid_view.dart'; class Settings3Pid extends StatefulWidget { diff --git a/lib/pages/settings_3pid/settings_3pid_view.dart b/lib/pages/settings_3pid/settings_3pid_view.dart index d01fdc6b..324b1813 100644 --- a/lib/pages/settings_3pid/settings_3pid_view.dart +++ b/lib/pages/settings_3pid/settings_3pid_view.dart @@ -1,11 +1,9 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/settings_3pid/settings_3pid.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class Settings3PidView extends StatelessWidget { final Settings3PidController controller; diff --git a/lib/pages/settings_chat/settings_chat_view.dart b/lib/pages/settings_chat/settings_chat_view.dart index b125cf73..7e8aa9f7 100644 --- a/lib/pages/settings_chat/settings_chat_view.dart +++ b/lib/pages/settings_chat/settings_chat_view.dart @@ -1,7 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -9,6 +5,9 @@ import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + import 'settings_chat.dart'; class SettingsChatView extends StatelessWidget { diff --git a/lib/pages/settings_emotes/import_archive_dialog.dart b/lib/pages/settings_emotes/import_archive_dialog.dart index 46bca4d3..20b1ffde 100644 --- a/lib/pages/settings_emotes/import_archive_dialog.dart +++ b/lib/pages/settings_emotes/import_archive_dialog.dart @@ -1,17 +1,15 @@ import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - import 'package:archive/archive.dart'; import 'package:collection/collection.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/settings_emotes/settings_emotes.dart'; import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; class ImportEmoteArchiveDialog extends StatefulWidget { final EmotesSettingsController controller; diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart index 8b8cb2f5..9825daa9 100644 --- a/lib/pages/settings_emotes/settings_emotes.dart +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -1,12 +1,8 @@ import 'dart:async'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - +import 'package:archive/archive.dart' + if (dart.library.io) 'package:archive/archive_io.dart'; import 'package:file_picker/file_picker.dart'; -import 'package:http/http.dart' hide Client; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/utils/file_selector.dart'; @@ -14,13 +10,15 @@ import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dar import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart' hide Client; +import 'package:matrix/matrix.dart'; + import '../../widgets/matrix.dart'; import 'import_archive_dialog.dart'; import 'settings_emotes_view.dart'; -import 'package:archive/archive.dart' - if (dart.library.io) 'package:archive/archive_io.dart'; - class EmotesSettings extends StatefulWidget { final String? roomId; const EmotesSettings({required this.roomId, super.key}); diff --git a/lib/pages/settings_emotes/settings_emotes_view.dart b/lib/pages/settings_emotes/settings_emotes_view.dart index a5baf397..d4e6411a 100644 --- a/lib/pages/settings_emotes/settings_emotes_view.dart +++ b/lib/pages/settings_emotes/settings_emotes_view.dart @@ -1,14 +1,13 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; import 'package:fluffychat/widgets/mxc_image_viewer.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/matrix.dart'; import 'settings_emotes.dart'; diff --git a/lib/pages/settings_homeserver/settings_homeserver_view.dart b/lib/pages/settings_homeserver/settings_homeserver_view.dart index 195c1701..d2027b25 100644 --- a/lib/pages/settings_homeserver/settings_homeserver_view.dart +++ b/lib/pages/settings_homeserver/settings_homeserver_view.dart @@ -1,16 +1,15 @@ import 'dart:convert'; -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + import '../../widgets/matrix.dart'; import 'settings_homeserver.dart'; diff --git a/lib/pages/settings_ignore_list/settings_ignore_list.dart b/lib/pages/settings_ignore_list/settings_ignore_list.dart index 3bcea3df..940e0677 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list.dart @@ -1,9 +1,8 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/matrix.dart'; import 'settings_ignore_list_view.dart'; diff --git a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart index 7dee64d1..c2cb7e3f 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart @@ -1,8 +1,8 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; + import '../../widgets/matrix.dart'; import 'settings_ignore_list.dart'; diff --git a/lib/pages/settings_notifications/push_rule_extensions.dart b/lib/pages/settings_notifications/push_rule_extensions.dart index 103fbc10..8885de2d 100644 --- a/lib/pages/settings_notifications/push_rule_extensions.dart +++ b/lib/pages/settings_notifications/push_rule_extensions.dart @@ -1,6 +1,5 @@ -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; extension PushRuleExtension on PushRule { String getPushRuleName(L10n l10n) { diff --git a/lib/pages/settings_notifications/settings_notifications.dart b/lib/pages/settings_notifications/settings_notifications.dart index 05c9e3e5..1f61c33b 100644 --- a/lib/pages/settings_notifications/settings_notifications.dart +++ b/lib/pages/settings_notifications/settings_notifications.dart @@ -1,9 +1,5 @@ import 'dart:convert'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/settings_notifications/push_rule_extensions.dart'; @@ -12,6 +8,9 @@ import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart' import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../widgets/matrix.dart'; import 'settings_notifications_view.dart'; diff --git a/lib/pages/settings_notifications/settings_notifications_view.dart b/lib/pages/settings_notifications/settings_notifications_view.dart index 8259cfe2..5464b724 100644 --- a/lib/pages/settings_notifications/settings_notifications_view.dart +++ b/lib/pages/settings_notifications/settings_notifications_view.dart @@ -1,11 +1,10 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/settings_notifications/push_rule_extensions.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/localized_exception_extension.dart'; import '../../widgets/matrix.dart'; import 'settings_notifications.dart'; diff --git a/lib/pages/settings_password/settings_password.dart b/lib/pages/settings_password/settings_password.dart index d2fe2621..acceda75 100644 --- a/lib/pages/settings_password/settings_password.dart +++ b/lib/pages/settings_password/settings_password.dart @@ -1,11 +1,9 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/settings_password/settings_password_view.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; class SettingsPassword extends StatefulWidget { const SettingsPassword({super.key}); diff --git a/lib/pages/settings_password/settings_password_view.dart b/lib/pages/settings_password/settings_password_view.dart index fc0904a9..593712e2 100644 --- a/lib/pages/settings_password/settings_password_view.dart +++ b/lib/pages/settings_password/settings_password_view.dart @@ -1,10 +1,8 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/settings_password/settings_password.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; class SettingsPasswordView extends StatelessWidget { final SettingsPasswordController controller; diff --git a/lib/pages/settings_security/settings_security.dart b/lib/pages/settings_security/settings_security.dart index 25c17db2..57ea44f3 100644 --- a/lib/pages/settings_security/settings_security.dart +++ b/lib/pages/settings_security/settings_security.dart @@ -1,7 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; @@ -9,6 +5,9 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart' import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import 'settings_security_view.dart'; class SettingsSecurity extends StatefulWidget { diff --git a/lib/pages/settings_security/settings_security_view.dart b/lib/pages/settings_security/settings_security_view.dart index 2d38a5c4..05d4599d 100644 --- a/lib/pages/settings_security/settings_security_view.dart +++ b/lib/pages/settings_security/settings_security_view.dart @@ -1,8 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; @@ -12,6 +7,10 @@ import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/settings_switch_list_tile.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + import 'settings_security.dart'; class SettingsSecurityView extends StatelessWidget { diff --git a/lib/pages/settings_style/settings_style.dart b/lib/pages/settings_style/settings_style.dart index 273d2684..0feff1c4 100644 --- a/lib/pages/settings_style/settings_style.dart +++ b/lib/pages/settings_style/settings_style.dart @@ -1,12 +1,11 @@ -import 'package:flutter/material.dart'; - import 'package:file_picker/file_picker.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/file_selector.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/theme_builder.dart'; +import 'package:flutter/material.dart'; + import '../../widgets/matrix.dart'; import 'settings_style_view.dart'; diff --git a/lib/pages/settings_style/settings_style_view.dart b/lib/pages/settings_style/settings_style_view.dart index e2945077..5cb9d4d1 100644 --- a/lib/pages/settings_style/settings_style_view.dart +++ b/lib/pages/settings_style/settings_style_view.dart @@ -1,10 +1,6 @@ import 'dart:ui'; -import 'package:flutter/material.dart'; - import 'package:dynamic_color/dynamic_color.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -15,6 +11,9 @@ import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import '../../config/app_config.dart'; import '../../widgets/settings_switch_list_tile.dart'; import 'settings_style.dart'; diff --git a/lib/pages/sign_in/sign_in_page.dart b/lib/pages/sign_in/sign_in_page.dart index 276cd264..c5ee696b 100644 --- a/lib/pages/sign_in/sign_in_page.dart +++ b/lib/pages/sign_in/sign_in_page.dart @@ -1,7 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -12,6 +8,8 @@ import 'package:fluffychat/utils/sign_in_flows/check_homeserver.dart'; import 'package:fluffychat/widgets/layouts/login_scaffold.dart'; import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/view_model_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher_string.dart'; class SignInPage extends StatelessWidget { final bool signUp; diff --git a/lib/pages/sign_in/view_model/sign_in_state.dart b/lib/pages/sign_in/view_model/sign_in_state.dart index 84213152..d72c715a 100644 --- a/lib/pages/sign_in/view_model/sign_in_state.dart +++ b/lib/pages/sign_in/view_model/sign_in_state.dart @@ -1,6 +1,5 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; +import 'package:flutter/material.dart'; class SignInState { final PublicHomeserverData? selectedHomeserver; diff --git a/lib/pages/sign_in/view_model/sign_in_view_model.dart b/lib/pages/sign_in/view_model/sign_in_view_model.dart index 3f5fbfa5..3d453219 100644 --- a/lib/pages/sign_in/view_model/sign_in_view_model.dart +++ b/lib/pages/sign_in/view_model/sign_in_view_model.dart @@ -1,15 +1,13 @@ import 'dart:convert'; -import 'package:flutter/widgets.dart'; - import 'package:collection/collection.dart'; -import 'package:matrix/matrix_api_lite/utils/logs.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; import 'package:fluffychat/pages/sign_in/view_model/sign_in_state.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/widgets.dart'; +import 'package:matrix/matrix_api_lite/utils/logs.dart'; class SignInViewModel extends ValueNotifier { final MatrixState matrixService; diff --git a/lib/utils/adaptive_bottom_sheet.dart b/lib/utils/adaptive_bottom_sheet.dart index a0e187d3..f3563c59 100644 --- a/lib/utils/adaptive_bottom_sheet.dart +++ b/lib/utils/adaptive_bottom_sheet.dart @@ -1,9 +1,8 @@ import 'dart:math'; -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:flutter/material.dart'; Future showAdaptiveBottomSheet({ required BuildContext context, diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 2713073b..c5e87b95 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -23,9 +23,13 @@ import 'dart:io'; import 'dart:isolate'; import 'dart:ui'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/main.dart'; +import 'package:fluffychat/utils/notification_background_handler.dart'; +import 'package:fluffychat/utils/push_helper.dart'; +import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_new_badger/flutter_new_badger.dart'; import 'package:http/http.dart' as http; @@ -33,11 +37,6 @@ import 'package:matrix/matrix.dart'; import 'package:unifiedpush/unifiedpush.dart'; import 'package:unifiedpush_ui/unifiedpush_ui.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/main.dart'; -import 'package:fluffychat/utils/notification_background_handler.dart'; -import 'package:fluffychat/utils/push_helper.dart'; -import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import '../config/app_config.dart'; import '../config/setting_keys.dart'; import '../widgets/matrix.dart'; diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index bdb33f95..9792523b 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -1,9 +1,14 @@ import 'dart:io'; -import 'package:flutter/foundation.dart'; - import 'package:collection/collection.dart'; import 'package:desktop_notifications/desktop_notifications.dart'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/custom_http_client.dart'; +import 'package:fluffychat/utils/custom_image_resizer.dart'; +import 'package:fluffychat/utils/init_with_restore.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; import 'package:matrix/encryption/utils/key_verification.dart'; @@ -11,12 +16,6 @@ import 'package:matrix/matrix.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:universal_html/html.dart' as html; -import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/utils/custom_http_client.dart'; -import 'package:fluffychat/utils/custom_image_resizer.dart'; -import 'package:fluffychat/utils/init_with_restore.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; import 'matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart'; abstract class ClientManager { diff --git a/lib/utils/custom_http_client.dart b/lib/utils/custom_http_client.dart index 66b1dcad..0bd9961d 100644 --- a/lib/utils/custom_http_client.dart +++ b/lib/utils/custom_http_client.dart @@ -1,13 +1,12 @@ import 'dart:convert'; import 'dart:io'; +import 'package:fluffychat/config/isrg_x1.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:http/http.dart' as http; import 'package:http/io_client.dart'; import 'package:http/retry.dart' as retry; -import 'package:fluffychat/config/isrg_x1.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; - /// Custom Client to add an additional certificate. This is for the isrg X1 /// certificate which is needed for LetsEncrypt certificates. It is shipped /// on Android since OS version 7.1. As long as we support older versions we diff --git a/lib/utils/date_time_extension.dart b/lib/utils/date_time_extension.dart index 508f13e2..7efed644 100644 --- a/lib/utils/date_time_extension.dart +++ b/lib/utils/date_time_extension.dart @@ -1,9 +1,7 @@ -import 'package:flutter/material.dart'; - -import 'package:intl/intl.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; /// Provides extra functionality for formatting the time. extension DateTimeExtension on DateTime { diff --git a/lib/utils/error_reporter.dart b/lib/utils/error_reporter.dart index 670d2f8a..66e5540b 100644 --- a/lib/utils/error_reporter.dart +++ b/lib/utils/error_reporter.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/url_launcher.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher.dart'; class ErrorReporter { final BuildContext? context; diff --git a/lib/utils/file_selector.dart b/lib/utils/file_selector.dart index 97e229c2..a4aacc1d 100644 --- a/lib/utils/file_selector.dart +++ b/lib/utils/file_selector.dart @@ -1,10 +1,8 @@ -import 'package:flutter/widgets.dart'; - import 'package:file_picker/file_picker.dart'; import 'package:file_selector/file_selector.dart'; - import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/widgets.dart'; Future> selectFiles( BuildContext context, { diff --git a/lib/utils/fluffy_share.dart b/lib/utils/fluffy_share.dart index 0c72d284..45699616 100644 --- a/lib/utils/fluffy_share.dart +++ b/lib/utils/fluffy_share.dart @@ -1,10 +1,9 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:share_plus/share_plus.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:share_plus/share_plus.dart'; + import '../widgets/matrix.dart'; abstract class FluffyShare { diff --git a/lib/utils/init_with_restore.dart b/lib/utils/init_with_restore.dart index 71cc7f8b..5bfa5e1e 100644 --- a/lib/utils/init_with_restore.dart +++ b/lib/utils/init_with_restore.dart @@ -1,14 +1,13 @@ import 'dart:convert'; import 'dart:ui'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; class SessionBackup { final String? olmAccount; diff --git a/lib/utils/localized_exception_extension.dart b/lib/utils/localized_exception_extension.dart index 0d8ff659..208d9424 100644 --- a/lib/utils/localized_exception_extension.dart +++ b/lib/utils/localized_exception_extension.dart @@ -1,15 +1,14 @@ import 'dart:io'; import 'dart:math'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/other_party_can_receive.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - import 'package:http/http.dart'; import 'package:matrix/encryption.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/utils/other_party_can_receive.dart'; import 'uia_request_manager.dart'; extension LocalizedExceptionExtension on Object { diff --git a/lib/utils/markdown_context_builder.dart b/lib/utils/markdown_context_builder.dart index 57d44d4c..b893045a 100644 --- a/lib/utils/markdown_context_builder.dart +++ b/lib/utils/markdown_context_builder.dart @@ -1,7 +1,6 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:flutter/material.dart'; class MarkdownContextBuilder extends StatelessWidget { final EditableTextState editableTextState; diff --git a/lib/utils/matrix_sdk_extensions/event_extension.dart b/lib/utils/matrix_sdk_extensions/event_extension.dart index 66537ec2..84b9f2d8 100644 --- a/lib/utils/matrix_sdk_extensions/event_extension.dart +++ b/lib/utils/matrix_sdk_extensions/event_extension.dart @@ -1,11 +1,10 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - import 'package:async/async.dart' as async; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/utils/size_string.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import 'matrix_file_extension.dart'; extension LocalizedBody on Event { diff --git a/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart index 0e9724a3..d0cd5b36 100644 --- a/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart +++ b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart @@ -1,6 +1,5 @@ -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; +import 'package:matrix/matrix.dart'; extension VisibleInGuiExtension on List { List filterByVisibleInGui({ diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart index dfcc9d61..9ec10dd8 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart @@ -1,18 +1,16 @@ import 'dart:io'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:flutter/foundation.dart'; - import 'package:matrix/matrix.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:sqflite_common_ffi/sqflite_ffi.dart'; import 'package:universal_html/html.dart' as html; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/utils/client_manager.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; import 'cipher.dart'; - import 'sqlcipher_stub.dart' if (dart.library.io) 'package:sqlcipher_flutter_libs/sqlcipher_flutter_libs.dart'; diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart index 3862346f..f469e571 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/cipher.dart @@ -1,15 +1,13 @@ import 'dart:convert'; import 'dart:math'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; - -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/client_manager.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:matrix/matrix.dart'; const _passwordStorageKey = 'database_password'; diff --git a/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart index 857c8095..4590cace 100644 --- a/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart +++ b/lib/utils/matrix_sdk_extensions/matrix_file_extension.dart @@ -1,11 +1,9 @@ -import 'package:flutter/material.dart'; - import 'package:file_picker/file_picker.dart'; -import 'package:matrix/matrix.dart'; -import 'package:share_plus/share_plus.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/size_string.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; +import 'package:share_plus/share_plus.dart'; extension MatrixFileExtension on MatrixFile { Future save(BuildContext context) async { diff --git a/lib/utils/matrix_sdk_extensions/matrix_locals.dart b/lib/utils/matrix_sdk_extensions/matrix_locals.dart index 9a12d25f..157f46c7 100644 --- a/lib/utils/matrix_sdk_extensions/matrix_locals.dart +++ b/lib/utils/matrix_sdk_extensions/matrix_locals.dart @@ -1,6 +1,5 @@ -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; +import 'package:matrix/matrix.dart'; /// This is a temporary helper class until there is a proper solution to this with the new system class MatrixLocals extends MatrixLocalizations { diff --git a/lib/utils/notification_background_handler.dart b/lib/utils/notification_background_handler.dart index 4c85800f..76cde5a9 100644 --- a/lib/utils/notification_background_handler.dart +++ b/lib/utils/notification_background_handler.dart @@ -3,14 +3,14 @@ import 'dart:isolate'; import 'dart:ui'; import 'package:collection/collection.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/utils/client_manager.dart'; +import 'package:fluffychat/utils/push_helper.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/utils/client_manager.dart'; -import 'package:fluffychat/utils/push_helper.dart'; import '../config/app_config.dart'; import '../config/setting_keys.dart'; diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index 1c1b2623..57ca6cc1 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -1,14 +1,13 @@ import 'dart:io'; +import 'package:fluffychat/config/setting_keys.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - import 'package:go_router/go_router.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:url_launcher/url_launcher_string.dart'; -import 'package:fluffychat/config/setting_keys.dart'; -import 'package:fluffychat/l10n/l10n.dart'; import '../config/app_config.dart'; abstract class PlatformInfos { diff --git a/lib/utils/push_helper.dart b/lib/utils/push_helper.dart index 05d40b57..591549e9 100644 --- a/lib/utils/push_helper.dart +++ b/lib/utils/push_helper.dart @@ -1,14 +1,7 @@ import 'dart:convert'; import 'dart:ui'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -17,6 +10,11 @@ import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/notification_background_handler.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart'; +import 'package:matrix/matrix.dart'; const notificationAvatarDimension = 128; diff --git a/lib/utils/resize_video.dart b/lib/utils/resize_video.dart index ae249818..a58e4642 100644 --- a/lib/utils/resize_video.dart +++ b/lib/utils/resize_video.dart @@ -1,9 +1,8 @@ import 'package:cross_file/cross_file.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:matrix/matrix.dart'; import 'package:video_compress/video_compress.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; - extension ResizeImage on XFile { static const int max = 1200; static const int quality = 40; diff --git a/lib/utils/room_status_extension.dart b/lib/utils/room_status_extension.dart index 3021a314..a907bff4 100644 --- a/lib/utils/room_status_extension.dart +++ b/lib/utils/room_status_extension.dart @@ -1,8 +1,7 @@ +import 'package:fluffychat/l10n/l10n.dart'; import 'package:flutter/widgets.dart'; - import 'package:matrix/matrix.dart'; -import 'package:fluffychat/l10n/l10n.dart'; import '../config/app_config.dart'; extension RoomStatusExtension on Room { diff --git a/lib/utils/show_scaffold_dialog.dart b/lib/utils/show_scaffold_dialog.dart index 7e552f90..7e796ad0 100644 --- a/lib/utils/show_scaffold_dialog.dart +++ b/lib/utils/show_scaffold_dialog.dart @@ -1,7 +1,6 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:flutter/material.dart'; Future showScaffoldDialog({ required BuildContext context, diff --git a/lib/utils/show_update_snackbar.dart b/lib/utils/show_update_snackbar.dart index 7d47f1bf..8735a941 100644 --- a/lib/utils/show_update_snackbar.dart +++ b/lib/utils/show_update_snackbar.dart @@ -1,11 +1,9 @@ -import 'package:flutter/material.dart'; - -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:url_launcher/url_launcher_string.dart'; abstract class UpdateNotifier { static const String versionStoreKey = 'last_known_version'; diff --git a/lib/utils/sign_in_flows/calc_redirect_url.dart b/lib/utils/sign_in_flows/calc_redirect_url.dart index ef0f800d..2a5d1cce 100644 --- a/lib/utils/sign_in_flows/calc_redirect_url.dart +++ b/lib/utils/sign_in_flows/calc_redirect_url.dart @@ -1,9 +1,7 @@ -import 'package:flutter/foundation.dart'; - -import 'package:universal_html/html.dart' as html; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/foundation.dart'; +import 'package:universal_html/html.dart' as html; (Uri redirectUrl, String urlScheme) calcRedirectUrl({ bool withAuthHtmlPath = false, diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index ed3e61c9..213ad909 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -1,10 +1,3 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart'; @@ -14,6 +7,11 @@ import 'package:fluffychat/utils/sign_in_flows/oidc_login.dart'; import 'package:fluffychat/utils/sign_in_flows/sso_login.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher_string.dart'; Future connectToHomeserverFlow( PublicHomeserverData homeserverData, diff --git a/lib/utils/sign_in_flows/oidc_login.dart b/lib/utils/sign_in_flows/oidc_login.dart index 0fb9f2c7..4093eb14 100644 --- a/lib/utils/sign_in_flows/oidc_login.dart +++ b/lib/utils/sign_in_flows/oidc_login.dart @@ -1,16 +1,14 @@ import 'dart:convert'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; -import 'package:matrix/matrix.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; Future oidcLoginFlow( Client client, diff --git a/lib/utils/sign_in_flows/sso_login.dart b/lib/utils/sign_in_flows/sso_login.dart index 7f7a924d..e5b135e1 100644 --- a/lib/utils/sign_in_flows/sso_login.dart +++ b/lib/utils/sign_in_flows/sso_login.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:matrix/matrix.dart'; Future ssoLoginFlow( Client client, diff --git a/lib/utils/sync_status_localization.dart b/lib/utils/sync_status_localization.dart index c48e7125..da699f2b 100644 --- a/lib/utils/sync_status_localization.dart +++ b/lib/utils/sync_status_localization.dart @@ -1,9 +1,7 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; extension SyncStatusLocalization on SyncStatusUpdate { String calcLocalizedString(BuildContext context) { diff --git a/lib/utils/uia_request_manager.dart b/lib/utils/uia_request_manager.dart index e422f966..11fa0421 100644 --- a/lib/utils/uia_request_manager.dart +++ b/lib/utils/uia_request_manager.dart @@ -1,15 +1,13 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; -import 'package:url_launcher/url_launcher.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; +import 'package:url_launcher/url_launcher.dart'; extension UiaRequestManager on MatrixState { Future uiaRequestHandler(UiaRequest uiaRequest) async { diff --git a/lib/utils/url_launcher.dart b/lib/utils/url_launcher.dart index d3644e49..fcc64113 100644 --- a/lib/utils/url_launcher.dart +++ b/lib/utils/url_launcher.dart @@ -1,17 +1,16 @@ -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart' show IterableExtension; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; -import 'package:punycode/punycode.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:punycode/punycode.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + import '../widgets/adaptive_dialogs/public_room_dialog.dart'; import 'platform_infos.dart'; diff --git a/lib/utils/voip_plugin.dart b/lib/utils/voip_plugin.dart index fb5c5714..6a91df3a 100644 --- a/lib/utils/voip_plugin.dart +++ b/lib/utils/voip_plugin.dart @@ -1,16 +1,15 @@ import 'dart:core'; +import 'package:fluffychat/pages/chat_list/chat_list.dart'; +import 'package:fluffychat/pages/dialer/dialer.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as webrtc_impl; import 'package:matrix/matrix.dart'; import 'package:webrtc_interface/webrtc_interface.dart' hide Navigator; -import 'package:fluffychat/pages/chat_list/chat_list.dart'; -import 'package:fluffychat/pages/dialer/dialer.dart'; -import 'package:fluffychat/utils/platform_infos.dart'; import '../../utils/voip/user_media_manager.dart'; import '../widgets/matrix.dart'; diff --git a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart index 6fbc9a0c..fe892538 100644 --- a/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart +++ b/lib/widgets/adaptive_dialogs/adaptive_dialog_action.dart @@ -1,8 +1,7 @@ +import 'package:fluffychat/config/app_config.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:fluffychat/config/app_config.dart'; - class AdaptiveDialogAction extends StatelessWidget { final VoidCallback? onPressed; final bool autofocus; diff --git a/lib/widgets/adaptive_dialogs/public_room_dialog.dart b/lib/widgets/adaptive_dialogs/public_room_dialog.dart index bafa5864..adb0865d 100644 --- a/lib/widgets/adaptive_dialogs/public_room_dialog.dart +++ b/lib/widgets/adaptive_dialogs/public_room_dialog.dart @@ -1,14 +1,13 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + import '../../config/themes.dart'; import '../../utils/url_launcher.dart'; import '../avatar.dart'; diff --git a/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart index d295a9ca..fbff4203 100644 --- a/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart +++ b/lib/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart @@ -1,10 +1,8 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; enum OkCancelResult { ok, cancel } diff --git a/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart b/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart index 38331eaf..d128f0cb 100644 --- a/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart +++ b/lib/widgets/adaptive_dialogs/show_text_input_dialog.dart @@ -1,11 +1,9 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; Future showTextInputDialog({ required BuildContext context, diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index 674bd9c1..764a6ed8 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -1,10 +1,3 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; @@ -13,6 +6,12 @@ import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart' import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/presence_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_linkify/flutter_linkify.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + import '../../utils/url_launcher.dart'; import '../future_loading_dialog.dart'; import '../hover_builder.dart'; diff --git a/lib/widgets/app_lock.dart b/lib/widgets/app_lock.dart index 70f0a9ef..feebaf05 100644 --- a/lib/widgets/app_lock.dart +++ b/lib/widgets/app_lock.dart @@ -1,11 +1,9 @@ +import 'package:fluffychat/widgets/lock_screen.dart'; import 'package:flutter/material.dart'; - import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:matrix/matrix.dart'; import 'package:provider/provider.dart'; -import 'package:fluffychat/widgets/lock_screen.dart'; - class AppLockWidget extends StatefulWidget { const AppLockWidget({ required this.child, diff --git a/lib/widgets/avatar.dart b/lib/widgets/avatar.dart index d78a2fcd..259c0b42 100644 --- a/lib/widgets/avatar.dart +++ b/lib/widgets/avatar.dart @@ -1,10 +1,8 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/utils/string_color.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; import 'package:fluffychat/widgets/presence_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class Avatar extends StatelessWidget { final Uri? mxContent; diff --git a/lib/widgets/blur_hash.dart b/lib/widgets/blur_hash.dart index a7fc4fac..6cd2f4f8 100644 --- a/lib/widgets/blur_hash.dart +++ b/lib/widgets/blur_hash.dart @@ -1,7 +1,6 @@ +import 'package:blurhash_dart/blurhash_dart.dart' as b; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:blurhash_dart/blurhash_dart.dart' as b; import 'package:image/image.dart' as image; class BlurHash extends StatefulWidget { diff --git a/lib/widgets/chat_settings_popup_menu.dart b/lib/widgets/chat_settings_popup_menu.dart index 6e90a6a2..8ba7952c 100644 --- a/lib/widgets/chat_settings_popup_menu.dart +++ b/lib/widgets/chat_settings_popup_menu.dart @@ -1,13 +1,12 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; + import 'matrix.dart'; enum ChatPopupMenuActions { details, mute, unmute, emote, leave, search } diff --git a/lib/widgets/config_viewer.dart b/lib/widgets/config_viewer.dart index e357e34a..df715c33 100644 --- a/lib/widgets/config_viewer.dart +++ b/lib/widgets/config_viewer.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class ConfigViewer extends StatefulWidget { const ConfigViewer({super.key}); diff --git a/lib/widgets/fluffy_chat_app.dart b/lib/widgets/fluffy_chat_app.dart index 3b0b1e4f..79047cc9 100644 --- a/lib/widgets/fluffy_chat_app.dart +++ b/lib/widgets/fluffy_chat_app.dart @@ -1,9 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/routes.dart'; import 'package:fluffychat/config/setting_keys.dart'; @@ -11,6 +5,11 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/app_lock.dart'; import 'package:fluffychat/widgets/theme_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + import '../utils/custom_scroll_behaviour.dart'; import 'matrix.dart'; diff --git a/lib/widgets/future_loading_dialog.dart b/lib/widgets/future_loading_dialog.dart index b883cda9..4cf2ee6d 100644 --- a/lib/widgets/future_loading_dialog.dart +++ b/lib/widgets/future_loading_dialog.dart @@ -1,12 +1,10 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - import 'package:async/async.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; +import 'package:flutter/material.dart'; /// Displays a loading dialog which reacts to the given [future]. The dialog /// will be dismissed and the value will be returned when the future completes. diff --git a/lib/widgets/layouts/login_scaffold.dart b/lib/widgets/layouts/login_scaffold.dart index 49b36861..5953df36 100644 --- a/lib/widgets/layouts/login_scaffold.dart +++ b/lib/widgets/layouts/login_scaffold.dart @@ -1,13 +1,11 @@ -import 'package:flutter/material.dart'; - -import 'package:particles_network/particles_network.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/material.dart'; +import 'package:particles_network/particles_network.dart'; +import 'package:url_launcher/url_launcher_string.dart'; class LoginScaffold extends StatelessWidget { final Widget body; diff --git a/lib/widgets/layouts/max_width_body.dart b/lib/widgets/layouts/max_width_body.dart index c0afc707..2ba70065 100644 --- a/lib/widgets/layouts/max_width_body.dart +++ b/lib/widgets/layouts/max_width_body.dart @@ -1,7 +1,6 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:flutter/material.dart'; class MaxWidthBody extends StatelessWidget { final Widget child; diff --git a/lib/widgets/layouts/two_column_layout.dart b/lib/widgets/layouts/two_column_layout.dart index 9bcbd515..2b2a3f86 100644 --- a/lib/widgets/layouts/two_column_layout.dart +++ b/lib/widgets/layouts/two_column_layout.dart @@ -1,6 +1,5 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/themes.dart'; +import 'package:flutter/material.dart'; class TwoColumnLayout extends StatelessWidget { final Widget mainView; diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index 618219dd..47597286 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -1,14 +1,7 @@ import 'dart:io'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart'; import 'package:desktop_notifications/desktop_notifications.dart'; -import 'package:image/image.dart'; -import 'package:matrix/matrix.dart'; -import 'package:universal_html/html.dart' as html; - import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/client_download_content_extension.dart'; @@ -16,6 +9,11 @@ import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/push_helper.dart'; import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:image/image.dart'; +import 'package:matrix/matrix.dart'; +import 'package:universal_html/html.dart' as html; extension LocalNotificationsExtension on MatrixState { Future showLocalNotification(Event event) async { diff --git a/lib/widgets/lock_screen.dart b/lib/widgets/lock_screen.dart index 66a90951..7ecb1d22 100644 --- a/lib/widgets/lock_screen.dart +++ b/lib/widgets/lock_screen.dart @@ -1,11 +1,10 @@ import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/app_lock.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; class LockScreen extends StatefulWidget { const LockScreen({super.key}); diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index f5cd50a2..2f7a3291 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -1,21 +1,8 @@ import 'dart:async'; import 'dart:convert'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart'; import 'package:desktop_notifications/desktop_notifications.dart'; -import 'package:image_picker/image_picker.dart'; -import 'package:intl/intl.dart'; -import 'package:just_audio/just_audio.dart'; -import 'package:matrix/encryption.dart'; -import 'package:matrix/matrix.dart'; -import 'package:provider/provider.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:universal_html/html.dart' as html; -import 'package:url_launcher/url_launcher_string.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/client_manager.dart'; import 'package:fluffychat/utils/init_with_restore.dart'; @@ -26,6 +13,18 @@ import 'package:fluffychat/utils/voip_plugin.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:intl/intl.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:matrix/encryption.dart'; +import 'package:matrix/matrix.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:universal_html/html.dart' as html; +import 'package:url_launcher/url_launcher_string.dart'; + import '../config/setting_keys.dart'; import '../pages/key_verification/key_verification_dialog.dart'; import '../utils/account_bundles.dart'; diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart index 26a1bb20..46ec8e96 100644 --- a/lib/widgets/member_actions_popup_menu_button.dart +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -1,9 +1,8 @@ -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/permission_slider_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; + import 'adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'adaptive_dialogs/show_text_input_dialog.dart'; import 'adaptive_dialogs/user_dialog.dart'; diff --git a/lib/widgets/mxc_image.dart b/lib/widgets/mxc_image.dart index a92338aa..b0f86815 100644 --- a/lib/widgets/mxc_image.dart +++ b/lib/widgets/mxc_image.dart @@ -2,14 +2,12 @@ import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/utils/client_download_content_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class MxcImage extends StatefulWidget { final Uri? uri; diff --git a/lib/widgets/mxc_image_viewer.dart b/lib/widgets/mxc_image_viewer.dart index be075d79..b4b70d00 100644 --- a/lib/widgets/mxc_image_viewer.dart +++ b/lib/widgets/mxc_image_viewer.dart @@ -1,6 +1,6 @@ +import 'package:fluffychat/l10n/l10n.dart'; import 'package:flutter/material.dart'; -import 'package:fluffychat/l10n/l10n.dart'; import 'mxc_image.dart'; class MxcImageViewer extends StatelessWidget { diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index e9201bff..3b0eea3e 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -1,8 +1,3 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -12,6 +7,9 @@ import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class SpacesNavigationRail extends StatelessWidget { final String? activeSpaceId; diff --git a/lib/widgets/permission_slider_dialog.dart b/lib/widgets/permission_slider_dialog.dart index 63cd0897..5b04216a 100644 --- a/lib/widgets/permission_slider_dialog.dart +++ b/lib/widgets/permission_slider_dialog.dart @@ -1,8 +1,7 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/dialog_text_field.dart'; +import 'package:flutter/material.dart'; Future showPermissionChooser( BuildContext context, { diff --git a/lib/widgets/presence_builder.dart b/lib/widgets/presence_builder.dart index 33f5b054..05b0c6ae 100644 --- a/lib/widgets/presence_builder.dart +++ b/lib/widgets/presence_builder.dart @@ -1,10 +1,8 @@ import 'dart:async'; -import 'package:flutter/material.dart'; - -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:matrix/matrix.dart'; class PresenceBuilder extends StatefulWidget { final Widget Function(BuildContext context, CachedPresence? presence) builder; diff --git a/lib/widgets/qr_code_viewer.dart b/lib/widgets/qr_code_viewer.dart index 83c44e74..aee6d7e5 100644 --- a/lib/widgets/qr_code_viewer.dart +++ b/lib/widgets/qr_code_viewer.dart @@ -1,16 +1,15 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -import 'package:image/image.dart'; -import 'package:matrix/matrix.dart'; -import 'package:pretty_qr_code/pretty_qr_code.dart'; -import 'package:qr_image/qr_image.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:image/image.dart'; +import 'package:matrix/matrix.dart'; +import 'package:pretty_qr_code/pretty_qr_code.dart'; +import 'package:qr_image/qr_image.dart'; + import '../config/themes.dart'; Future showQrCodeViewer(BuildContext context, String content) => diff --git a/lib/widgets/settings_switch_list_tile.dart b/lib/widgets/settings_switch_list_tile.dart index f625f9e6..90bc3aec 100644 --- a/lib/widgets/settings_switch_list_tile.dart +++ b/lib/widgets/settings_switch_list_tile.dart @@ -1,6 +1,5 @@ -import 'package:flutter/material.dart'; - import 'package:fluffychat/config/setting_keys.dart'; +import 'package:flutter/material.dart'; class SettingsSwitchListTile extends StatefulWidget { final AppSettings setting; diff --git a/lib/widgets/share_scaffold_dialog.dart b/lib/widgets/share_scaffold_dialog.dart index 2a23e050..2a219d67 100644 --- a/lib/widgets/share_scaffold_dialog.dart +++ b/lib/widgets/share_scaffold_dialog.dart @@ -1,15 +1,13 @@ -import 'package:flutter/material.dart'; - import 'package:cross_file/cross_file.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; abstract class ShareItem {} diff --git a/lib/widgets/theme_builder.dart b/lib/widgets/theme_builder.dart index 77bda417..de1c5bad 100644 --- a/lib/widgets/theme_builder.dart +++ b/lib/widgets/theme_builder.dart @@ -1,12 +1,10 @@ -import 'package:flutter/material.dart'; - import 'package:collection/collection.dart'; import 'package:dynamic_color/dynamic_color.dart'; +import 'package:fluffychat/utils/color_value.dart'; +import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:fluffychat/utils/color_value.dart'; - class ThemeBuilder extends StatefulWidget { final Widget Function( BuildContext context, diff --git a/lib/widgets/unread_rooms_badge.dart b/lib/widgets/unread_rooms_badge.dart index 986316bd..9e3f9932 100644 --- a/lib/widgets/unread_rooms_badge.dart +++ b/lib/widgets/unread_rooms_badge.dart @@ -1,6 +1,5 @@ -import 'package:flutter/material.dart'; - import 'package:badges/badges.dart' as b; +import 'package:flutter/material.dart'; import 'package:matrix/matrix.dart'; import 'matrix.dart'; diff --git a/pubspec.lock b/pubspec.lock index 0158ec42..b415dd2b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -903,14 +903,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.2" - import_sorter: - dependency: "direct dev" - description: - name: import_sorter - sha256: eb15738ccead84e62c31e0208ea4e3104415efcd4972b86906ca64a1187d0836 - url: "https://pub.dev" - source: hosted - version: "4.6.0" integration_test: dependency: "direct dev" description: flutter @@ -1809,14 +1801,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.11.0" - tint: - dependency: transitive - description: - name: tint - sha256: "9652d9a589f4536d5e392cf790263d120474f15da3cf1bee7f1fdb31b4de5f46" - url: "https://pub.dev" - source: hosted - version: "2.0.1" translations_cleaner: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index d83c3eb3..400dd469 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -86,16 +86,11 @@ dev_dependencies: flutter_native_splash: ^2.4.7 flutter_test: sdk: flutter - import_sorter: ^4.6.0 integration_test: sdk: flutter license_checker: ^1.6.2 translations_cleaner: ^0.1.1 -import_sorter: - ignored_files: # Optional, defaults to [] - - \/lib\/l10n - flutter_native_splash: color: "#ffffff" color_dark: "#000000" From 74602ecb91effe8d70c655deac74e481277e0f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sat, 21 Mar 2026 13:10:56 +0100 Subject: [PATCH 310/333] build: Update flutter --- .tool_versions.yaml | 2 +- lib/utils/background_push.dart | 3 +-- snap/snapcraft.yaml | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.tool_versions.yaml b/.tool_versions.yaml index 65c36746..a06ba450 100644 --- a/.tool_versions.yaml +++ b/.tool_versions.yaml @@ -1,2 +1,2 @@ environment: - flutter: 3.41.4 \ No newline at end of file + flutter: 3.41.5 # Keep in sync with snap/snapcraft.yaml \ No newline at end of file diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index c5e87b95..98f81eeb 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -23,6 +23,7 @@ import 'dart:io'; import 'dart:isolate'; import 'dart:ui'; +//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/main.dart'; import 'package:fluffychat/utils/notification_background_handler.dart'; @@ -42,8 +43,6 @@ import '../config/setting_keys.dart'; import '../widgets/matrix.dart'; import 'platform_infos.dart'; -//import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; - class BackgroundPush { static BackgroundPush? _instance; final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 8f58da35..e03a3b3c 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -53,7 +53,7 @@ platforms: parts: flutter-git: source: https://github.com/flutter/flutter.git - source-tag: 3.41.2 + source-tag: 3.41.5 source-depth: 1 plugin: nil override-build: | From 2eb3d81dd1f654bd755d15e56968b545a94e50d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Mar 2026 12:45:51 +0100 Subject: [PATCH 311/333] fix: Always calc correct file extension for voice messages --- lib/pages/chat/chat.dart | 13 +++++++++++-- lib/pages/chat/recording_input_row.dart | 2 +- lib/pages/chat/recording_view_model.dart | 6 +++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 255f1c81..2dfc70d5 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -34,6 +34,7 @@ import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; import 'package:matrix/matrix.dart'; +import 'package:mime/mime.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; import '../../utils/account_bundles.dart'; @@ -700,7 +701,7 @@ class ChatController extends State String path, int duration, List waveform, - String? fileName, + String fileName, ) async { final scaffoldMessenger = ScaffoldMessenger.of(context); final audioFile = XFile(path); @@ -712,9 +713,17 @@ class ChatController extends State final bytes = bytesResult.result; if (bytes == null) return; + final mimeType = lookupMimeType(fileName, headerBytes: bytes); + final extension = mimeType == null ? null : extensionFromMime(mimeType); + if (extension != null) { + fileName = + 'voice_message_${DateTime.now().millisecondsSinceEpoch}.$extension'; + } + final file = MatrixAudioFile( bytes: bytes, - name: fileName ?? audioFile.path, + name: fileName, + mimeType: mimeType, ); room diff --git a/lib/pages/chat/recording_input_row.dart b/lib/pages/chat/recording_input_row.dart index 66538cbd..ff295e88 100644 --- a/lib/pages/chat/recording_input_row.dart +++ b/lib/pages/chat/recording_input_row.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; class RecordingInputRow extends StatelessWidget { final RecordingViewModelState state; - final Future Function(String, int, List, String?) onSend; + final Future Function(String, int, List, String) onSend; const RecordingInputRow({ required this.state, required this.onSend, diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index de587920..d66ccbe4 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -67,7 +67,7 @@ class RecordingViewModelState extends State { ? AudioEncoder.opus : AudioEncoder.aacLc; fileName = - 'recording${DateTime.now().microsecondsSinceEpoch}.${codec.fileExtension}'; + 'voice_message_${DateTime.now().millisecondsSinceEpoch}.${codec.fileExtension}'; String? path; if (!kIsWeb) { final tempDir = await getTemporaryDirectory(); @@ -168,7 +168,7 @@ class RecordingViewModelState extends State { String path, int duration, List waveform, - String? fileName, + String fileName, ) onSend, ) async { @@ -189,7 +189,7 @@ class RecordingViewModelState extends State { isSending = true; }); try { - await onSend(path, duration.inMilliseconds, waveform, fileName); + await onSend(path, duration.inMilliseconds, waveform, fileName!); } catch (e, s) { Logs().e('Unable to send voice message', e, s); setState(() { From 5ebe891c7b20126f71f500decac99c2686c9329b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Mar 2026 13:30:51 +0100 Subject: [PATCH 312/333] chore: Disable broken opus recording on web --- lib/pages/chat/recording_view_model.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index d66ccbe4..7319201a 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -61,8 +61,8 @@ class RecordingViewModelState extends State { try { final codec = - !PlatformInfos - .isIOS && // Blocked by https://github.com/llfbandit/record/issues/560 + PlatformInfos + .isAndroid && // Blocked by https://github.com/llfbandit/record/issues/560 await audioRecorder.isEncoderSupported(AudioEncoder.opus) ? AudioEncoder.opus : AudioEncoder.aacLc; From 2a0405df084f4bfe84326e8b5c6b36f45144d573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 22 Mar 2026 15:07:52 +0100 Subject: [PATCH 313/333] chore: Disable web voice message again --- lib/pages/chat/recording_view_model.dart | 4 ++-- lib/utils/platform_infos.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index 7319201a..d66ccbe4 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -61,8 +61,8 @@ class RecordingViewModelState extends State { try { final codec = - PlatformInfos - .isAndroid && // Blocked by https://github.com/llfbandit/record/issues/560 + !PlatformInfos + .isIOS && // Blocked by https://github.com/llfbandit/record/issues/560 await audioRecorder.isEncoderSupported(AudioEncoder.opus) ? AudioEncoder.opus : AudioEncoder.aacLc; diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index 57ca6cc1..f5addae6 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -35,8 +35,8 @@ abstract class PlatformInfos { static bool get supportsCustomImageResizer => PlatformInfos.isWeb || PlatformInfos.isMobile; - /// Web could also record in theory but currently only wav which is too large - static bool get platformCanRecord => (isMobile || isMacOS || isWeb); + /// Web could also record in theory but currently creates broken opus + static bool get platformCanRecord => (isMobile || isMacOS); static String get clientName => '${AppSettings.applicationName.value} ${isWeb ? 'web' : Platform.operatingSystem}${kReleaseMode ? '' : 'Debug'}'; From ebca535f0ba71d66f91917296e5df5296d2e97e8 Mon Sep 17 00:00:00 2001 From: "Arvin(Amirhossein) Safarzadeh" Date: Sun, 22 Mar 2026 15:16:34 +0100 Subject: [PATCH 314/333] chore(translations): Translated using Weblate (Persian) Currently translated at 100.0% (755 of 755 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/fa/ --- lib/l10n/intl_fa.arb | 305 +++++++++++++++++++++++++++++++------------ 1 file changed, 222 insertions(+), 83 deletions(-) diff --git a/lib/l10n/intl_fa.arb b/lib/l10n/intl_fa.arb index 11ab1f12..6639f37c 100644 --- a/lib/l10n/intl_fa.arb +++ b/lib/l10n/intl_fa.arb @@ -36,7 +36,7 @@ "type": "String", "placeholders": {} }, - "allChats": "همه گپ‌ها", + "allChats": "همه چت ها", "@allChats": { "type": "String", "placeholders": {} @@ -121,7 +121,7 @@ "type": "String", "placeholders": {} }, - "banFromChat": "محروم کردن از گپ", + "banFromChat": "بن کردن از چت", "@banFromChat": { "type": "String", "placeholders": {} @@ -135,7 +135,7 @@ } } }, - "areGuestsAllowedToJoin": "آیا مهمانان اجازه پیوستن دارند", + "areGuestsAllowedToJoin": "آیا مهمانان اجازه پیوستن دارند؟", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -151,7 +151,7 @@ "type": "String", "placeholders": {} }, - "changedTheChatDescriptionTo": "{username} توضیح گپ را به '{description}' تغییر داد", + "changedTheChatDescriptionTo": "{username} توضیح چت را به '{description}' تغییر داد", "@changedTheChatDescriptionTo": { "type": "String", "placeholders": { @@ -163,7 +163,7 @@ } } }, - "changedTheChatPermissions": "{username} دسترسی‌های گپ را تغییر داد", + "changedTheChatPermissions": "{username} دسترسی‌های چت را تغییر داد", "@changedTheChatPermissions": { "type": "String", "placeholders": { @@ -172,7 +172,7 @@ } } }, - "changedTheChatNameTo": "{username} نام گپ را به '{chatname}' تغییر داد", + "changedTheChatNameTo": "{username} نام چت را به '{chatname}' تغییر داد", "@changedTheChatNameTo": { "type": "String", "placeholders": { @@ -232,7 +232,7 @@ } } }, - "changedTheChatAvatar": "{username} نماد گپ را تغییر داد", + "changedTheChatAvatar": "{username} نماد چت را تغییر داد", "@changedTheChatAvatar": { "type": "String", "placeholders": { @@ -259,7 +259,7 @@ } } }, - "chats": "گپ‌ها", + "chats": "چت ها", "@chats": { "type": "String", "placeholders": {} @@ -362,7 +362,7 @@ "type": "String", "placeholders": {} }, - "yourChatBackupHasBeenSetUp": "پشتیبان گپ شما تنظیم شد.", + "yourChatBackupHasBeenSetUp": "پشتیبان چت شما تنظیم شد.", "changeTheme": "تغییر پوسته", "@changeTheme": { "type": "String", @@ -384,12 +384,12 @@ "placeholders": {} }, "clearArchive": "پاک کردن بایگانی", - "commandHint_create": "ساختن یک گپ گروهی خالی\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", + "commandHint_create": "ساختن یک چت گروهی خالی\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", "@commandHint_create": { "type": "String", "description": "Usage hint for the command /create" }, - "commandHint_dm": "شروع یک گپ مستقیم\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", + "commandHint_dm": "شروع یک چت مستقیم\nاز «--no-encryption» برای غیرفعال کردن رمزنگاری استفاده کنید", "@commandHint_dm": { "type": "String", "description": "Usage hint for the command /dm" @@ -409,7 +409,7 @@ } } }, - "chatDetails": "جزئیات گپ", + "chatDetails": "جزئیات چت", "@chatDetails": { "type": "String", "placeholders": {} @@ -490,12 +490,12 @@ "type": "String", "placeholders": {} }, - "chat": "گپ", + "chat": "چت", "@chat": { "type": "String", "placeholders": {} }, - "chatBackup": "پشتیبان گپ", + "chatBackup": "پشتیبان چت", "@chatBackup": { "type": "String", "placeholders": {} @@ -765,7 +765,7 @@ "type": "String", "placeholders": {} }, - "emptyChat": "گپ خالی", + "emptyChat": "چت خالی", "@emptyChat": { "type": "String", "placeholders": {} @@ -775,7 +775,7 @@ "type": "String", "placeholders": {} }, - "createdTheChat": "💬 {username} گپ را ساخت", + "createdTheChat": "💬 {username} چت را ساخت", "@createdTheChat": { "type": "String", "placeholders": { @@ -789,7 +789,7 @@ "type": "String", "placeholders": {} }, - "directChats": "گپ‌های مستقیم", + "directChats": "چت های مستقیم", "@directChats": { "type": "String", "placeholders": {} @@ -848,7 +848,7 @@ "type": "String", "placeholders": {} }, - "configureChat": "پیکربندی گپ", + "configureChat": "تنظیمات چت", "@configureChat": { "type": "String", "placeholders": {} @@ -1091,12 +1091,12 @@ "type": "String", "placeholders": {} }, - "muteChat": "بی‌صدا کردن گپ", + "muteChat": "بی‌صدا کردن چت", "@muteChat": { "type": "String", "placeholders": {} }, - "newChat": "گپ جدید", + "newChat": "چت جدید", "@newChat": { "type": "String", "placeholders": {} @@ -1258,12 +1258,12 @@ } } }, - "kickFromChat": "بیرون کردن از گپ", + "kickFromChat": "بیرون کردن از چت", "@kickFromChat": { "type": "String", "placeholders": {} }, - "leftTheChat": "گپ را ترک کرد", + "leftTheChat": "چت را ترک کرد", "@leftTheChat": { "type": "String", "placeholders": {} @@ -1380,7 +1380,7 @@ } } }, - "joinedTheChat": "👋 {username} به گپ پیوست", + "joinedTheChat": "👋 {username} به چت پیوست", "@joinedTheChat": { "type": "String", "placeholders": { @@ -1551,7 +1551,7 @@ } } }, - "unbanFromChat": "لغو محرومیت از گپ", + "unbanFromChat": "لغو محرومیت از چت", "@unbanFromChat": { "type": "String", "placeholders": {} @@ -1665,7 +1665,7 @@ } } }, - "wasDirectChatDisplayName": "گپ خالی (پیش‌تر {oldDisplayName} بود)", + "wasDirectChatDisplayName": "چت خالی (قبلا {oldDisplayName} بود)", "@wasDirectChatDisplayName": { "type": "String", "placeholders": { @@ -1674,15 +1674,15 @@ } } }, - "newSpaceDescription": "فضاها امکان یکپارچه‌سازی گپ‌ها و ساخت جوامع خصوصی یا عمومی را فراهم می‌کنند.", - "encryptThisChat": "رمزنگاری این گپ", + "newSpaceDescription": "فضاها امکان یکپارچه‌سازی چت ها و ساخت جوامع خصوصی یا عمومی را فراهم می‌کنند.", + "encryptThisChat": "رمزنگاری این چت", "sorryThatsNotPossible": "متأسفیم... این ممکن نیست", "deviceKeys": "کلیدهای دستگاه:", "fileIsTooBigForServer": "نمیتوان فرستاد! سرور تنها از پیوست های تا {max} پشتیبانی میکند.", "jumpToLastReadMessage": "پرش به آخرین پیام خوانده‌شده", "doNotShowAgain": "دوباره نمایش نده", "readUpToHere": "خوانده‌شده تا اینجا", - "noBackupWarning": "هشدار! بدون فعال کردن پشتیبان گپ، دسترسی به پیام‌های رمزنگاری‌شده خود را از دست خواهید داد. پیشنهاد می‌شود پیش از خروج، پشتیبان گپ را فعال کنید.", + "noBackupWarning": "هشدار! بدون فعال کردن پشتیبان چت، دسترسی به پیام‌های رمزنگاری‌شده خود را از دست خواهید داد. پیشنهاد می‌شود پیش از خروج، پشتیبان چت را فعال کنید.", "noOtherDevicesFound": "دستگاه دیگری پیدا نشد", "countFiles": "{count} پرونده", "@countFiles": { @@ -1692,8 +1692,8 @@ } } }, - "noKeyForThisMessage": "اگر پیام پیش از ورود به حساب در این دستگاه فرستاده شده باشد، این مشکل ممکن است رخ دهد.\n\nهمچنین ممکن است فرستنده دستگاه شما را مسدود کرده باشد یا مشکلی در اتصال اینترنت وجود داشته باشد.\n\nآیا می‌توانید پیام را در نشست دیگری بخوانید؟ در این صورت، می‌توانید آن را منتقل کنید! به تنظیمات > دستگاه‌ها بروید و مطمئن شوید دستگاه‌هایتان یکدیگر را بازبینی کرده‌اند. هنگام باز کردن دوباره اتاق و فعال بودن هر دو نشست، کلیدها به‌صورت خودکار منتقل می‌شوند.\n\nآیا نمی‌خواهید هنگام خروج یا تغییر دستگاه کلیدها را گم کنید؟ مطمئن شوید پشتیبان گپ را در تنظیمات فعال کرده‌اید.", - "disableEncryptionWarning": "به دلایل امنیتی نمی‌توانید رمزنگاری را در گپی که فعال شده غیرفعال کنید.", + "noKeyForThisMessage": "اگر پیام پیش از ورود به حساب در این دستگاه فرستاده شده باشد، این مشکل ممکن است رخ دهد.\n\nهمچنین ممکن است فرستنده دستگاه شما را مسدود کرده باشد یا مشکلی در اتصال اینترنت وجود داشته باشد.\n\nآیا می‌توانید پیام را در نشست دیگری بخوانید؟ در این صورت، می‌توانید آن را منتقل کنید! به تنظیمات > دستگاه‌ها بروید و مطمئن شوید دستگاه‌هایتان یکدیگر را بازبینی کرده‌اند. هنگام باز کردن دوباره اتاق و فعال بودن هر دو نشست، کلیدها به‌صورت خودکار منتقل می‌شوند.\n\nآیا نمی‌خواهید هنگام خروج یا تغییر دستگاه کلیدها را گم کنید؟ مطمئن شوید پشتیبان چت را در تنظیمات فعال کرده‌اید.", + "disableEncryptionWarning": "به دلایل امنیتی نمی‌توانید رمزنگاری را در چتی که فعال شده غیرفعال کنید.", "newGroup": "گروه جدید", "foregroundServiceRunning": "این آگاه‌ساز زمانی ظاهر می‌شود که خدمت پیش‌زمینه فعال است.", "storeSecurlyOnThisDevice": "ذخیره امن در این دستگاه", @@ -1706,8 +1706,8 @@ "custom": "سفارشی", "screenSharingTitle": "هم‌رسانی صفحه‌نمایش", "whyIsThisMessageEncrypted": "چرا این پیام خوانا نیست؟", - "reopenChat": "باز کردن دوباره گپ", - "unmuteChat": "فعال کردن صدای گپ", + "reopenChat": "باز کردن دوباره چت", + "unmuteChat": "فعال کردن صدای چت", "@unmuteChat": { "type": "String", "placeholders": {} @@ -1768,7 +1768,7 @@ "type": "String", "placeholders": {} }, - "youHaveBeenBannedFromThisChat": "شما از این گپ محروم شده‌اید", + "youHaveBeenBannedFromThisChat": "شما از این چت محروم شده‌اید", "@youHaveBeenBannedFromThisChat": { "type": "String", "placeholders": {} @@ -1873,7 +1873,7 @@ "type": "String", "placeholders": {} }, - "youAreNoLongerParticipatingInThisChat": "شما دیگر در این گپ شرکت نمی‌کنید", + "youAreNoLongerParticipatingInThisChat": "شما دیگر در این چت شرکت نمی‌کنید", "@youAreNoLongerParticipatingInThisChat": { "type": "String", "placeholders": {} @@ -1925,7 +1925,7 @@ "type": "String", "placeholders": {} }, - "openChat": "باز کردن گپ", + "openChat": "باز کردن چت", "dismiss": "رد کردن", "unsupportedAndroidVersion": "نسخه اندروید پشتیبانی‌نشده", "youUnbannedUser": "شما محرومیت {user} را برداشتید", @@ -1987,7 +1987,7 @@ } } }, - "userLeftTheChat": "👋 {username} گپ را ترک کرد", + "userLeftTheChat": "👋 {username} چت را ترک کرد", "@userLeftTheChat": { "type": "String", "placeholders": { @@ -2001,7 +2001,7 @@ "type": "String", "placeholders": {} }, - "visibilityOfTheChatHistory": "قابلیت دیدن تاریخچه گپ", + "visibilityOfTheChatHistory": "قابلیت دیدن تاریخچه چت", "@visibilityOfTheChatHistory": { "type": "String", "placeholders": {} @@ -2016,7 +2016,7 @@ "type": "String", "placeholders": {} }, - "wipeChatBackup": "برای ایجاد کلید بازیابی جدید، پشتیبان گپ خود را پاک می‌کنید؟", + "wipeChatBackup": "برای ایجاد کلید بازیابی جدید، پشتیبان چت خود را پاک می‌کنید؟", "@wipeChatBackup": { "type": "String", "placeholders": {} @@ -2083,7 +2083,7 @@ "pinMessage": "سنجاق کردن به اتاق", "emojis": "شکلک‌ها", "voiceCall": "تماس صوتی", - "youJoinedTheChat": "شما به گپ پیوستید", + "youJoinedTheChat": "شما به چت پیوستید", "youBannedUser": "شما {user} را محروم کردید", "@youBannedUser": { "placeholders": { @@ -2146,8 +2146,8 @@ "appLockDescription": "قفل کردن برنامه با رمز کوتاه هنگام عدم استفاده", "sendTypingNotifications": "فرستادن آگاه‌سازهای نوشتن", "swipeRightToLeftToReply": "کشیدن از راست به چپ برای پاسخ", - "noMoreChatsFound": "گپ دیگری پیدا نشد...", - "noChatsFoundHere": "اینجا هنوز گپی پیدا نشد. با استفاده از دکمه زیر گپ جدیدی با کسی شروع کنید. ⤵️", + "noMoreChatsFound": "چت دیگری پیدا نشد...", + "noChatsFoundHere": "اینجا هنوز چتی پیدا نشد. با استفاده از دکمه زیر چت جدیدی با کسی شروع کنید. ⤵️", "unread": "خوانده‌نشده", "space": "فضا", "spaces": "فضاها", @@ -2162,28 +2162,28 @@ } }, "createGroup": "ساختن گروه", - "chatPermissions": "دسترسی‌های گپ", + "chatPermissions": "دسترسی‌های چت", "emoteKeyboardNoRecents": "شکلک‌هایی که به تازگی استفاده‌شده اینجا نمایش داده میشوند...", "@emoteKeyboardNoRecents": { "type": "String", "placeholders": {} }, - "globalChatId": "شناسه گپ سراسری", + "globalChatId": "شناسه سراسری چت", "accessAndVisibility": "دسترسی و قابلیت دید", - "accessAndVisibilityDescription": "چه کسی اجازه پیوستن به این گپ را دارد و گپ چگونه قابل کشف است.", + "accessAndVisibilityDescription": "چه کسی اجازه پیوستن به این چت را دارد و چت چگونه قابل پیدا شدن است.", "calls": "تماس‌ها", "customEmojisAndStickers": "شکلک‌ها و برچسب‌های سفارشی", - "customEmojisAndStickersBody": "افزودن یا هم‌رسانی شکلک‌ها یا برچسب‌های سفارشی که در هر گپ قابل استفاده‌اند.", - "chatDescription": "توضیح گپ", - "chatDescriptionHasBeenChanged": "توضیح گپ تغییر کرد", + "customEmojisAndStickersBody": "افزودن یا اشتراک گذاری ایموجی ها یا استیکر های سفارشی که در هر چت قابل استفاده‌اند.", + "chatDescription": "توضیحات چت", + "chatDescriptionHasBeenChanged": "توضیحات چت تغییر کرد", "hideRedactedMessages": "پنهان کردن پیام‌های ویرایش‌شده", - "hideRedactedMessagesBody": "اگر کسی پیامی را ویرایش کند، دیگر نمیتوان آن پیام را در گپ دید.", + "hideRedactedMessagesBody": "اگر کسی پیامی را ویرایش کند، دیگر نمیتوان آن پیام را در چت دید.", "hideInvalidOrUnknownMessageFormats": "پنهان کردن قالب‌های پیام نامعتبر یا ناشناخته", "block": "مسدود کردن", "blockedUsers": "کاربران مسدود‌شده", "blockListDescription": "میتوانید کاربرانی که مزاحم شما هستند را مسدود کنید. از کاربران موجود در فهرست مسدود شخصی، پیام یا دعوت به اتاق دریافت نخواهید کرد.", "blockUsername": "چشم‌پوشی از نام کاربری", - "noChatDescriptionYet": "هنوز توضیح گپی ساخته نشده است.", + "noChatDescriptionYet": "هنوز توضیحات چتی نوشته نشده است.", "tryAgain": "تلاش دوباره", "invalidServerName": "نام سرور نامعتبر", "redactMessageDescription": "پیام برای همه شرکت‌کنندگان در این گفتگو ویرایش خواهد شد. این کار برگشت‌ناپذیر است.", @@ -2201,7 +2201,7 @@ } } }, - "directChat": "گپ مستقیم", + "directChat": "چت مستقیم", "redactedByBecause": "ویرایش‌شده به‌دست {username} زیرا: «{reason}»", "@redactedByBecause": { "type": "String", @@ -2223,7 +2223,7 @@ } } }, - "setChatDescription": "تنظیم توضیح گپ", + "setChatDescription": "تنظیم توضیحات چت", "presencesToggle": "نمایش پیام‌های وضعیت از دیگر کاربران", "@presencesToggle": { "type": "String", @@ -2260,7 +2260,7 @@ "hidePresences": "پنهان کردن فهرست وضعیت؟", "setColorTheme": "تنظیم پوسته رنگی:", "invite": "دعوت", - "inviteGroupChat": "📨 دعوت به گپ گروهی", + "inviteGroupChat": "📨 دعوت به چت گروهی", "invalidInput": "ورودی نامعتبر!", "wrongPinEntered": "رمز کوتاه نادرست وارد شد! {seconds} ثانیه دیگر دوباره تلاش کنید...", "@wrongPinEntered": { @@ -2272,12 +2272,12 @@ } }, "pleaseEnterANumber": "لطفاً عددی بزرگ‌تر از ۰ وارد کنید", - "archiveRoomDescription": "گپ به بایگانی خواهد رفت. کاربران دیگر میتوانند ببینند که شما گپ را ترک کرده‌اید.", - "roomUpgradeDescription": "گپ با نگارش جدید اتاق بازسازی خواهد شد. به همه شرکت‌کنندگان آگاهی‌رسانی میشود که باید به گپ جدید بروند. داده‌های بیشتر درباره نگارش‌های اتاق در https://spec.matrix.org/latest/rooms/", + "archiveRoomDescription": "چت به بایگانی خواهد رفت. کاربران دیگر میتوانند ببینند که شما چت را ترک کرده‌اید.", + "roomUpgradeDescription": "چت با نگارش جدید اتاق بازسازی خواهد شد. به همه شرکت‌کنندگان آگاهی‌رسانی میشود که باید به چت جدید بروند. داده‌های بیشتر درباره نگارش‌های اتاق در https://spec.matrix.org/latest/rooms/", "removeDevicesDescription": "از این دستگاه خارج خواهید شد و دیگر نمیتوانید پیام دریافت کنید.", - "banUserDescription": "کاربر از گپ محروم خواهد شد و تا زمانی که محرومیت برداشته نشود، نمیتواند دوباره وارد گپ شود.", - "unbanUserDescription": "کاربر در صورت تلاش دوباره میتواند وارد گپ شود.", - "kickUserDescription": "کاربر از گپ بیرون میشود اما محروم نمیشود. در گپ‌های عمومی، کاربر میتواند هر زمان دوباره بپیوندد.", + "banUserDescription": "کاربر از چت محروم خواهد شد و تا زمانی که محرومیت برداشته نشود، نمیتواند دوباره وارد چت شود.", + "unbanUserDescription": "کاربر در صورت تلاش دوباره میتواند وارد چت شود.", + "kickUserDescription": "کاربر از چت بیرون میشود اما محروم نمیشود. در چت های عمومی، کاربر میتواند هر زمان دوباره بپیوندد.", "makeAdminDescription": "پس از مدیر کردن این کاربر، ممکن است نتوانید این کار را لغو کنید، زیرا آن‌ها همان دسترسی‌های شما را خواهند داشت.", "pushNotificationsNotAvailable": "آگاه‌سازهای فشاری در دسترس نیستند", "learnMore": "بیشتر بدانید", @@ -2292,7 +2292,7 @@ } }, "knocking": "در زدن", - "chatCanBeDiscoveredViaSearchOnServer": "گپ با جستجو در {server} قابل کشف است", + "chatCanBeDiscoveredViaSearchOnServer": "چت با جستجو در {server} قابل کشف است", "@chatCanBeDiscoveredViaSearchOnServer": { "type": "String", "placeholders": { @@ -2301,13 +2301,13 @@ } } }, - "searchChatsRooms": "جستجو برای #گپ‌ها، @کاربران...", + "searchChatsRooms": "جستجو برای #چت ها، @کاربران...", "nothingFound": "چیزی پیدا نشد...", "groupName": "نام گروه", "createGroupAndInviteUsers": "ساختن گروه و دعوت کاربران", "groupCanBeFoundViaSearch": "گروه با جستجو قابل یافتن است", "wrongRecoveryKey": "متأسفیم... به نظر میرسد این کلید بازیابی درست نباشد.", - "commandHint_sendraw": "فرستادن JSON خام", + "commandHint_sendraw": "فرستادن json خام", "databaseMigrationTitle": "پایگاه داده بهینه‌سازی شد", "databaseMigrationBody": "لطفاً صبر کنید. این ممکن است لحظه‌ای طول بکشد.", "leaveEmptyToClearStatus": "برای پاک کردن وضعیت، خالی بگذارید.", @@ -2318,13 +2318,13 @@ "pleaseChooseAStrongPassword": "لطفاً یک گذرواژه قوی انتخاب کنید", "passwordsDoNotMatch": "گذرواژه‌ها هم‌خوانی ندارند", "passwordIsWrong": "گذرواژه واردشده نادرست است", - "publicChatAddresses": "نشانی‌های گپ عمومی", + "publicChatAddresses": "آدرس های چت عمومی", "createNewAddress": "ساختن نشانی جدید", "joinSpace": "پیوستن به فضا", "publicSpaces": "فضاهای عمومی", - "addChatOrSubSpace": "افزودن گپ یا زیرفضا", + "addChatOrSubSpace": "افزودن چت یا زیرفضا", "thisDevice": "این دستگاه:", - "searchIn": "جستجو در گپ «{chat}»...", + "searchIn": "جستجو در چت «{chat}»...", "@searchIn": { "type": "String", "placeholders": { @@ -2361,8 +2361,8 @@ } }, "sendReadReceipts": "فرستادن رسیدهای خواندن", - "sendTypingNotificationsDescription": "دیگر شرکت‌کنندگان در گپ میتوانند ببینند که شما در حال تایپ پیام جدید هستید.", - "sendReadReceiptsDescription": "دیگر شرکت‌کنندگان در گپ میتوانند ببینند که شما پیام را خوانده‌اید.", + "sendTypingNotificationsDescription": "دیگر شرکت‌کنندگان در چت میتوانند ببینند که شما در حال تایپ پیام جدید هستید.", + "sendReadReceiptsDescription": "دیگر شرکت‌کنندگان در چت میتوانند ببینند که شما پیام را خوانده‌اید.", "formattedMessages": "پیام‌های قالب‌بندی‌شده", "formattedMessagesDescription": "نمایش محتوای پیام غنی مانند متن پررنگ با استفاده از مارک‌داون.", "verifyOtherUser": "🔐 بازبینی کاربر دیگر", @@ -2429,7 +2429,7 @@ "discover": "کشف", "commandHint_ignore": "چشم‌پوشی از شناسه ماتریکس داده‌شده", "commandHint_unignore": "لغو چشم‌پوشی از شناسه ماتریکس داده‌شده", - "unreadChatsInApp": "{appname}: {unread} گپ خوانده‌نشده", + "unreadChatsInApp": "{appname}: {unread} چت خوانده‌نشده", "@unreadChatsInApp": { "type": "String", "placeholders": { @@ -2482,14 +2482,14 @@ } } }, - "changeGeneralChatSettings": "تغییر تنظیمات عمومی گپ", - "inviteOtherUsers": "دعوت کاربران دیگر به این گپ", - "changeTheChatPermissions": "تغییر دسترسی‌های گپ", - "changeTheVisibilityOfChatHistory": "تغییر قابلیت دید تاریخچه گپ", - "changeTheCanonicalRoomAlias": "تغییر نشانی اصلی گپ عمومی", + "changeGeneralChatSettings": "تغییر تنظیمات عمومی چت", + "inviteOtherUsers": "دعوت کاربران دیگر به این چت", + "changeTheChatPermissions": "تغییر دسترسی‌های چت", + "changeTheVisibilityOfChatHistory": "تغییر قابلیت دید تاریخچه چت", + "changeTheCanonicalRoomAlias": "تغییر نشانی اصلی چت عمومی", "sendRoomNotifications": "فرستادن آگاه‌سازهای @room", - "changeTheDescriptionOfTheGroup": "تغییر توضیح گپ", - "chatPermissionsDescription": "مشخص کنید کدام سطح دسترسی برای اقدامات خاصی در این گپ لازم است. سطح‌های دسترسی ۰، ۵۰ و ۱۰۰ معمولاً نشان‌دهنده کاربران، ناظران و مدیران هستند، اما هر درجه‌بندی ممکن است.", + "changeTheDescriptionOfTheGroup": "تغییر توضیح چت", + "chatPermissionsDescription": "مشخص کنید کدام سطح دسترسی برای اقدامات خاصی در این چت لازم است. سطح‌های دسترسی ۰، ۵۰ و ۱۰۰ معمولاً نشان‌دهنده کاربران، ناظران و مدیران هستند، اما هر درجه‌بندی ممکن است.", "updateInstalled": "🎉 به‌روزرسانی {version} نصب شد!", "@updateInstalled": { "type": "String", @@ -2530,9 +2530,9 @@ } }, "oneOfYourDevicesIsNotVerified": "یکی از دستگاه‌های شما بازبینی نشده است", - "noticeChatBackupDeviceVerification": "توجه: وقتی همه دستگاه‌های خود را به پشتیبان گپ متصل کنید، به‌صورت خودکار بازبینی میشوند.", + "noticeChatBackupDeviceVerification": "توجه: وقتی همه دستگاه‌های خود را به پشتیبان چت متصل کنید، به‌صورت خودکار بازبینی میشوند.", "continueText": "ادامه", - "welcomeText": "درود درود 👋 این فلافی‌چت است. میتوانید به هر سرور خانگی سازگار با https://matrix.org وارد شوید و با هر کسی گپ بزنید. این یک شبکه پیام‌رسانی غیرمتمرکز بزرگ است!", + "welcomeText": "درود درود 👋 این فلافی‌چت است. میتوانید به هر سرور خانگی سازگار با https://matrix.org وارد شوید و با هر کسی چت کنید. این یک شبکه پیام‌رسانی غیرمتمرکز بزرگ است!", "blur": "محو کردن:", "opacity": "شفافیت:", "setWallpaper": "تنظیم کاغذدیواری", @@ -2552,7 +2552,7 @@ "pleaseFillOut": "لطفاً پر کنید", "invalidUrl": "نشانی نامعتبر", "addLink": "افزودن پیوند", - "unableToJoinChat": "ناتوانی در پیوستن به گپ. شاید طرف مقابل گفتگو را بسته است.", + "unableToJoinChat": "ناتوانی در پیوستن به چت. شاید طرف مقابل گفتگو را بسته است.", "previous": "پیشین", "otherPartyNotLoggedIn": "طرف مقابل اکنون وارد نشده است و بنابراین نمیتواند پیام دریافت کند!", "appWantsToUseForLogin": "برای ورود از '{server}' استفاده کنید", @@ -2567,7 +2567,7 @@ "appWantsToUseForLoginDescription": "شما بدین‌وسیله به برنامه و وبگاه اجازه میدهید اطلاعات شما را هم‌رسانی کنند.", "open": "باز کردن", "waitingForServer": "در انتظار سرور...", - "newChatRequest": "📩 درخواست گپ جدید", + "newChatRequest": "📩 درخواست چت جدید", "contentNotificationSettings": "تنظیمات آگاه‌ساز محتوا", "generalNotificationSettings": "تنظیمات آگاه‌ساز عمومی", "roomNotificationSettings": "تنظیمات آگاه‌ساز اتاق", @@ -2637,7 +2637,7 @@ "deletePushRuleCanNotBeUndone": "اگر این تنظیم آگاه‌ساز را پاک کنید، این کار برگشت‌ناپذیر است.", "more": "بیشتر", "shareKeysWith": "هم‌رسانی کلیدها با...", - "shareKeysWithDescription": "کدام دستگاه‌ها باید مورد اعتماد باشند تا بتوانند پیام‌های شما را در گپ‌های رمزنگاری‌شده بخوانند؟", + "shareKeysWithDescription": "کدام دستگاه‌ها باید مورد اعتماد باشند تا بتوانند پیام‌های شما را در چت های رمزنگاری‌شده بخوانند؟", "allDevices": "همه دستگاه‌ها", "crossVerifiedDevicesIfEnabled": "دستگاه‌های بازبینی‌شده متقابل اگر فعال باشد", "crossVerifiedDevices": "دستگاه‌های بازبینی‌شده متقابل", @@ -2646,7 +2646,7 @@ "recordAVideo": "ضبط ویدئو", "optionalMessage": "(اختیاری) پیام...", "notSupportedOnThisDevice": "در این دستگاه پشتیبانی نمیشود", - "enterNewChat": "ورود به گپ جدید", + "enterNewChat": "ورود به چت جدید", "approve": "پذیرفتن", "youHaveKnocked": "شما در زده‌اید", "pleaseWaitUntilInvited": "لطفاً اکنون صبر کنید تا کسی از اتاق شما را دعوت کند.", @@ -2656,9 +2656,148 @@ "customReaction": "واکنش سفارشی", "moreEvents": "رویدادهای بیشتر", "initAppError": "خطایی هنگام آغاز برنامه رخ داد", - "changedTheChatDescription": "‮‭‭‮‭‬‫{username} توضیحات گپ را تغییر داد", - "changedTheChatName": "{username} نام گپ را تغییر داد", + "changedTheChatDescription": "‮‭‭‮‭‬‫{username} توضیحات چت را تغییر داد", + "changedTheChatName": "{username} نام چت را تغییر داد", "declineInvitation": "رد کردن دعوت", "noMessagesYet": "پیامی وجود ندارد", - "longPressToRecordVoiceMessage": "برای ضبط پیام صوتی، انگشت خود را نگه دارید." -} \ No newline at end of file + "longPressToRecordVoiceMessage": "برای ضبط پیام صوتی، انگشت خود را نگه دارید.", + "pause": "توقف", + "resume": "ادامه", + "removeFromSpaceDescription": "این چت از این فضا حذف خواهد شد اما همچنان در لیست چت های شما نمایش داده میشود.", + "countChats": "{chats} چت", + "@countChats": { + "type": "String", + "placeholders": { + "chats": { + "type": "int" + } + } + }, + "spaceMemberOf": "عضو فضای {spaces}", + "@spaceMemberOf": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "spaceMemberOfCanKnock": "عضو فضای {spaces} میتواند در بزند", + "@spaceMemberOfCanKnock": { + "type": "String", + "placeholders": { + "spaces": { + "type": "String" + } + } + }, + "startedAPoll": "{username} یک نظرسنجی را آغاز کرد.", + "@startedAPoll": { + "type": "String", + "placeholders": { + "username": { + "type": "String" + } + } + }, + "poll": "نظرسنجی", + "startPoll": "آغاز نظرسنجی", + "endPoll": "پایان نظرسنجی", + "answersVisible": "پاسخ ها قابل رویت", + "pollQuestion": "سوال نظرسنجی", + "answerOption": "گزینه جواب", + "addAnswerOption": "اضافه کردن گزینه جواب", + "allowMultipleAnswers": "اجازه دادن چند جواب", + "pollHasBeenEnded": "این نظرسنجی پایان یافته است", + "answersWillBeVisibleWhenPollHasEnded": "پاسخ ها وقتی نظرسنجی به پایان برسد نمایش داده خواهند شد", + "replyInThread": "پاسخ در رشته", + "countReplies": "{count} پاسخ دیگر", + "@countReplies": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "thread": "رشته", + "backToMainChat": "بازگشت به چت اصلی", + "saveChanges": "ذخیره تغییرات", + "createSticker": "ساخت استیکر یا ایموجی", + "useAsSticker": "استفاده به عنوان استیکر", + "useAsEmoji": "استفاده به عنوان ایموجی", + "stickerPackNameAlreadyExists": "نام استیکرپک تکراری است", + "newStickerPack": "استیکر پک جدید", + "stickerPackName": "نام استیکر پک", + "attribution": "نسبت دادن", + "skipChatBackup": "صرف نظر از پشتیبان گیری چت", + "skipChatBackupWarning": "آیا مطمئنید؟ بدون فعال کردن پشتیبان گیری چت ممکن است در صورت تغییر دستگاه دسترسی خود به پیام هایتان را از دست بدهید.", + "loadingMessages": "در حال بارگذاری پیام ها", + "setupChatBackup": "فعالسازی پشتیبان گیری چت", + "noMoreResultsFound": "نتایج دیگری یافت نشد", + "chatSearchedUntil": "چت تا {time} جستجو شد", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "پایه آدرس فدریشن", + "clientWellKnownInformation": "اطلاعات Client-Well-Known:", + "baseUrl": "پایه آدرس", + "identityServer": "سرور احراز هویت:", + "versionWithNumber": "ورژن: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "لاگ ها", + "advancedConfigs": "تنظیمات پیشرفته", + "advancedConfigurations": "تنظیمات پیشرفته", + "signIn": "ورود", + "createNewAccount": "ساخت حساب جدید", + "signUpGreeting": "فلافی چت غیرمتمرکز است! یک سرور که میخواهید در آن حسابتان را بسازید را انتخاب کنید و شروع کنید!", + "signInGreeting": "از قبل در ماتریکس حساب کاربری دارید؟ خوش برگشتید! سرور خانه خود را انتخاب و لاگین کنید.", + "appIntro": "فلافی چت یک پیامرسان امن غیرمتمرکز ماتریکس است که با آن میتوانید با دوستانتان چت کنید! برای اطلاعات بیشتر میتوانید به https://matrix.org مراجعه کنید یا اینکه صرفا ثبت نام کنید.", + "theProcessWasCanceled": "فرآیند لغو شد.", + "join": "عضویت", + "searchOrEnterHomeserverAddress": "جستجو یا وارد کردن آدرس سرور خانه", + "matrixId": "شناسه ماتریکس", + "setPowerLevel": "انتخاب سطح قدرت", + "makeModerator": "انتخاب به عنوان ناظر", + "makeAdmin": "انتخاب به عنوان مدیر", + "removeModeratorRights": "حذف دسترسی های نظارتی", + "removeAdminRights": "حذف دسترسی های مدیریتی", + "powerLevel": "سطح قدرت", + "setPowerLevelDescription": "سطح قدرت مشخص میکند که یک کاربر قادر به انجام چه کارهایی در این اتاق است. معمولا یک عدد بین ۰ تا ۱۰۰ می باشد.", + "owner": "صاحب", + "mute": "ساکت", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "ساخت چت جدید", + "reset": "ریست کردن", + "supportFluffyChat": "حمایت از فلافی چت", + "support": "پشتیبانی", + "fluffyChatSupportBannerMessage": "فلافی چت به کمک شما نیاز دارد!\n❤️❤️❤️\nفلافی چت همواره رایگان خواهد بود، اما توسعه و نگهداری از آن هزینه بر است.\nآینده این پروژه در گرو حمایت افرادی مثل شماست.", + "skipSupportingFluffyChat": "رد کردن حمایت از فلافی چت", + "iDoNotWantToSupport": "نمیخواهم حمایت کنم", + "iAlreadySupportFluffyChat": "از قبل از فلافی چت حمایت میکنم", + "setLowPriority": "تنظیم اولویت پایین", + "unsetLowPriority": "لغو تنظیم اولویت پایین", + "countVotes": "{count} رای دیگر", + "@countVotes": { + "type": "int", + "placeholders": { + "count": { + "type": "int" + } + } + } +} From 5cf162f6c780c01e8ae5e76e45a13fb3c9330dfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Mon, 23 Mar 2026 16:52:09 +0100 Subject: [PATCH 315/333] chore: Follow up android deep links --- android/app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 12d88e56..15a09759 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -106,7 +106,7 @@ - + From 3642539642d5a736dedf34ed7ed961bc02317d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 23 Mar 2026 17:21:03 +0100 Subject: [PATCH 316/333] chore(translations): Translated using Weblate (Estonian) Currently translated at 100.0% (763 of 763 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/et/ --- lib/l10n/intl_et.arb | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/l10n/intl_et.arb b/lib/l10n/intl_et.arb index de030272..33c9f309 100644 --- a/lib/l10n/intl_et.arb +++ b/lib/l10n/intl_et.arb @@ -2395,7 +2395,7 @@ "gallery": "Galerii", "files": "Failid", "swipeRightToLeftToReply": "Vastamiseks viipa paremalt vasakule", - "alwaysUse24HourFormat": "false", + "alwaysUse24HourFormat": "väär", "@alwaysUse24HourFormat": { "description": "Set to true to always display time of day in 24 hour format." }, @@ -2800,5 +2800,13 @@ "skipSupportingFluffyChat": "Jäta FluffyChati toetamine vahele", "iDoNotWantToSupport": "Ma ei soovi toetada", "setLowPriority": "Märgi vähetähtsaks", - "unsetLowPriority": "Eemalda märkimine vähetähtsaks" -} \ No newline at end of file + "unsetLowPriority": "Eemalda märkimine vähetähtsaks", + "removeCallFromChat": "Eemalda kõne vestlusest", + "removeCallFromChatDescription": "Kas sa soovid antud kõne selle vestluse kõikidelt kasutajatelt eemaldada?", + "removeCallForEveryone": "Eemalda kõne kõigilt", + "startVoiceCall": "Algata häälkõne", + "startVideoCall": "Algata videokõne", + "joinVoiceCall": "Liitu häälkõnega", + "joinVideoCall": "Liitu videokõnega", + "live": "Reaalajas" +} From c8f867d3616be75f6251c0f457a6e0b962be463a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m=2E?= Date: Mon, 23 Mar 2026 06:51:41 +0100 Subject: [PATCH 317/333] chore(translations): Translated using Weblate (Galician) Currently translated at 100.0% (763 of 763 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/gl/ --- lib/l10n/intl_gl.arb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index 1a817bfe..e6bf530b 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -2800,5 +2800,13 @@ "iDoNotWantToSupport": "Non quero axudar", "iAlreadySupportFluffyChat": "Xa apoiei a FluffyChat", "setLowPriority": "Establecer prioridade baixa", - "unsetLowPriority": "Non establecer prioridade baixa" -} \ No newline at end of file + "unsetLowPriority": "Non establecer prioridade baixa", + "removeCallFromChat": "Eliminar a chamada da conversa", + "removeCallFromChatDescription": "Queres eliminar a chamada da conversa para todos os membros?", + "removeCallForEveryone": "Eliminar para todos a chamada", + "startVoiceCall": "Iniciar chamada de voz", + "startVideoCall": "Iniciar chamada de vídeo", + "joinVoiceCall": "Unirse á chamada de voz", + "joinVideoCall": "Unirse á chamada de vídeo", + "live": "En directo" +} From 64be9741ecb2a2de88bdfc43eab6f5238d13a775 Mon Sep 17 00:00:00 2001 From: Frank Paul Silye Date: Mon, 23 Mar 2026 09:21:44 +0100 Subject: [PATCH 318/333] =?UTF-8?q?chore(translations):=20Translated=20usi?= =?UTF-8?q?ng=20Weblate=20(Norwegian=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (763 of 763 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nb_NO/ --- lib/l10n/intl_nb.arb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_nb.arb b/lib/l10n/intl_nb.arb index 2741ed22..92e65d4e 100644 --- a/lib/l10n/intl_nb.arb +++ b/lib/l10n/intl_nb.arb @@ -2807,5 +2807,13 @@ "iDoNotWantToSupport": "Jeg ønsker ikke å støtte", "iAlreadySupportFluffyChat": "Jeg støtter allerede FluffyChat", "setLowPriority": "Sett lav prioritet", - "unsetLowPriority": "Fjern lav prioritet" -} \ No newline at end of file + "unsetLowPriority": "Fjern lav prioritet", + "removeCallFromChat": "Fjern anrop fra chat", + "removeCallFromChatDescription": "Vil du fjerne anropet fra chatten for alle medlemmer?", + "removeCallForEveryone": "Fjern anrop fra alle", + "startVoiceCall": "Start lydsamtale", + "startVideoCall": "Start videosamtale", + "joinVoiceCall": "Bli med i lydsamtale", + "joinVideoCall": "Bli med i videosamtale", + "live": "Direkte" +} From 145ebd81b7e3c494a2cc4bf38af82fd3258f5fc9 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Mon, 23 Mar 2026 11:07:06 +0100 Subject: [PATCH 319/333] chore(translations): Translated using Weblate (Kabyle) Currently translated at 76.2% (582 of 763 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/kab/ --- lib/l10n/intl_kab.arb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_kab.arb b/lib/l10n/intl_kab.arb index f0464eef..a6de66d7 100644 --- a/lib/l10n/intl_kab.arb +++ b/lib/l10n/intl_kab.arb @@ -2177,5 +2177,15 @@ "notificationRuleSuppressEditsDescription": "Kkes ilɣa i yeznan yettwaẓergen.", "notificationRuleCallDescription": "Azen alɣu i useqdac ɣef isawalen.", "notificationRuleEncryptedRoomOneToOne": "Taxxamt yettwawgelhen s wudem n yiwen ɣer yiwen", - "notificationRuleRoomOneToOne": "Taxxamt s wudem n yiwen ɣer yiwen" -} \ No newline at end of file + "notificationRuleRoomOneToOne": "Taxxamt s wudem n yiwen ɣer yiwen", + "userLevel": "{level} - Aseqdac", + "@userLevel": { + "type": "String", + "placeholders": { + "level": { + "type": "int" + } + } + }, + "startVideoCall": "Bdu asiwel n uvidyu" +} From efabf250e8924c5acc9ae7cff1c7cc3263acc3fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=8E=8B=E5=8F=AB=E6=88=91=E6=9D=A5=E5=B7=A1?= =?UTF-8?q?=E5=B1=B1?= Date: Mon, 23 Mar 2026 01:38:00 +0100 Subject: [PATCH 320/333] chore(translations): Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (763 of 763 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/zh_Hans/ --- lib/l10n/intl_zh.arb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 504efa89..0a678588 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -2800,5 +2800,13 @@ "iDoNotWantToSupport": "我不想支持", "iAlreadySupportFluffyChat": "我已支持 FluffyChat", "setLowPriority": "设置低优先级", - "unsetLowPriority": "取消设置低优先级" -} \ No newline at end of file + "unsetLowPriority": "取消设置低优先级", + "removeCallFromChat": "从聊天中删除通话", + "removeCallFromChatDescription": "要为所有成员从聊天中删除通话吗?", + "removeCallForEveryone": "为所有人删除通话", + "startVoiceCall": "开始语音通话", + "startVideoCall": "开始视频通话", + "joinVoiceCall": "加入语音通话", + "joinVideoCall": "加入视频通话", + "live": "实时" +} From 0c00ee64754d25387984ce557f0de1c80a323eb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Mar 2026 07:36:03 +0100 Subject: [PATCH 321/333] chore: Follow up android deep link --- android/app/src/main/AndroidManifest.xml | 2 +- lib/config/app_config.dart | 1 + lib/utils/sign_in_flows/calc_redirect_url.dart | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 15a09759..81733047 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -106,7 +106,7 @@ - + diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart index 8eae9406..ad595036 100644 --- a/lib/config/app_config.dart +++ b/lib/config/app_config.dart @@ -31,6 +31,7 @@ abstract class AppConfig { 'https://fluffychat.im/faq/#how_do_i_get_stickers'; static const String appId = 'im.fluffychat.FluffyChat'; static const String appOpenUrlScheme = 'im.fluffychat'; + static const String appSsoUrlScheme = 'im.fluffychat.auth'; static const String sourceCodeUrl = 'https://github.com/krille-chan/fluffychat'; diff --git a/lib/utils/sign_in_flows/calc_redirect_url.dart b/lib/utils/sign_in_flows/calc_redirect_url.dart index 2a5d1cce..34aadea7 100644 --- a/lib/utils/sign_in_flows/calc_redirect_url.dart +++ b/lib/utils/sign_in_flows/calc_redirect_url.dart @@ -9,7 +9,7 @@ import 'package:universal_html/html.dart' as html; var redirectUrl = kIsWeb ? Uri.parse(html.window.location.href.split('#').first.split('?').first) : (PlatformInfos.isMobile || PlatformInfos.isMacOS) - ? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login') + ? Uri.parse('${AppConfig.appSsoUrlScheme.toLowerCase()}:/login') : Uri.parse('http://localhost:3001/login'); if (kIsWeb && withAuthHtmlPath) { From 6cc415deadcf5b5717ab590a5f9fd6834c0ded03 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 24 Mar 2026 07:37:01 +0100 Subject: [PATCH 322/333] chore(translations): Translated using Weblate (German) Currently translated at 98.6% (753 of 763 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/de/ --- lib/l10n/intl_de.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 90e43b87..1b7af928 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -1551,7 +1551,7 @@ "type": "String", "placeholders": {} }, - "skip": "Überspringe", + "skip": "Überspringen", "@skip": { "type": "String", "placeholders": {} @@ -2807,4 +2807,4 @@ "skipSupportingFluffyChat": "FluffyChat unterstützen überspringen", "iDoNotWantToSupport": "Ich möchte nicht unterstützen", "iAlreadySupportFluffyChat": "I unterstütze FluffyChat bereits" -} \ No newline at end of file +} From f8f13bbc630d07ee71f71b90b449761b8b0a7c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Tue, 24 Mar 2026 08:51:29 +0100 Subject: [PATCH 323/333] chore: Revert remove libssl --- .github/workflows/integrate.yaml | 2 +- .github/workflows/release.yaml | 2 +- snap/snapcraft.yaml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 12ce32de..81669419 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -105,7 +105,7 @@ jobs: steps: - uses: actions/checkout@v6 - name: Install dependencies - run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y + run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV - name: Install Flutter run: | diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 56c3800c..5c94ada7 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -114,7 +114,7 @@ jobs: steps: - uses: actions/checkout@v6 - name: Install dependencies - run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y + run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev libwebkit2gtk-4.1-dev -y - run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV - name: Install Flutter run: | diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index e03a3b3c..ebc618ce 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -90,6 +90,7 @@ parts: build-packages: - libsecret-1-dev - libjsoncpp-dev + - libssl-dev - curl - libpciaccess-dev build-snaps: From 2076671a7a1ac5b97016744186e7d3ea986d3fcd Mon Sep 17 00:00:00 2001 From: Jelv Date: Wed, 25 Mar 2026 14:55:03 +0100 Subject: [PATCH 324/333] chore(translations): Translated using Weblate (Dutch) Currently translated at 100.0% (763 of 763 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/nl/ --- lib/l10n/intl_nl.arb | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index 2b33e66b..18ed4ccd 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -1953,7 +1953,7 @@ "unsupportedAndroidVersion": "Niet-ondersteunde Android-versie", "unsupportedAndroidVersionLong": "Voor deze functie is een nieuwe Android-versie verplicht. Controleer je updates of Lineage OS-ondersteuning.", "videoCallsBetaWarning": "Houd er rekening mee dat videogesprekken momenteel in bèta zijn. Ze werken misschien niet zoals je verwacht of werken niet op alle platformen.", - "voiceCall": "Spraakoproep", + "voiceCall": "Spraakgesprek", "confirmEventUnpin": "Weet je zeker dat je de gebeurtenis definitief wilt losmaken?", "experimentalVideoCalls": "Videogesprekken (experimenteel)", "youAcceptedTheInvitation": "👍 Je hebt de uitnodiging geaccepteerd", @@ -2799,5 +2799,13 @@ "supportFluffyChat": "FluffyChat steunen", "support": "Steunen", "setLowPriority": "Lage prioriteit instellen", - "unsetLowPriority": "Lage prioriteit uitschakelen" -} \ No newline at end of file + "unsetLowPriority": "Lage prioriteit uitschakelen", + "removeCallFromChat": "Verwijder oproep van chat", + "removeCallFromChatDescription": "Wil je de oproep voor iedereen in de chat verwijderen?", + "removeCallForEveryone": "Verwijder oproep voor iedereen", + "live": "Live", + "startVoiceCall": "Start audio-gesprek", + "startVideoCall": "Start video-gesprek", + "joinVoiceCall": "Audio-gesprek opnemen", + "joinVideoCall": "Deelnemen aan video-gesprek" +} From 86a09824b14320c823d8fd93f29265da481fd37e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Tue, 24 Mar 2026 14:31:56 +0100 Subject: [PATCH 325/333] chore(translations): Translated using Weblate (Irish) Currently translated at 100.0% (763 of 763 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/ga/ --- lib/l10n/intl_ga.arb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/l10n/intl_ga.arb b/lib/l10n/intl_ga.arb index 246b11f4..018e2283 100644 --- a/lib/l10n/intl_ga.arb +++ b/lib/l10n/intl_ga.arb @@ -2806,5 +2806,13 @@ "iDoNotWantToSupport": "Nílim ag iarraidh tacú leis", "iAlreadySupportFluffyChat": "Tacaím le FluffyChat cheana féin", "setLowPriority": "Socraigh tosaíocht íseal", - "unsetLowPriority": "Díshuiteáil tosaíocht íseal" -} \ No newline at end of file + "unsetLowPriority": "Díshuiteáil tosaíocht íseal", + "removeCallFromChat": "Bain glao den chomhrá", + "removeCallFromChatDescription": "Ar mhaith leat an glao a bhaint den chomhrá do gach ball?", + "removeCallForEveryone": "Bain glao do gach duine", + "startVoiceCall": "Tosaigh glao gutha", + "startVideoCall": "Tosaigh glao físe", + "joinVoiceCall": "Glac páirt i nglao gutha", + "joinVideoCall": "Glac páirt i nglao físe", + "live": "Beo" +} From 16fb244bc4f66e80c8464f8a5bf23a7e75b11051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Mar 2026 17:59:30 +0100 Subject: [PATCH 326/333] chore: Add missing base href --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 5c94ada7..4ed6a3ef 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -29,7 +29,7 @@ jobs: run: ./scripts/prepare-web.sh - run: rm ./assets/vodozemac/.gitignore - name: Build Release Web - run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps + run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps --base-href "/web/" - name: Create archive run: tar -czf fluffychat-web.tar.gz build/web/ - name: Upload Web Build From af90170d180920de9e6dd0c2f3cbd674910e5a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Mar 2026 07:53:18 +0100 Subject: [PATCH 327/333] chore: Correctly pass md to website --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 4ed6a3ef..8c7dfe92 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -49,8 +49,8 @@ jobs: - name: Clone fluffychat website run: | git clone https://github.com/krille-chan/fluffychat-website.git - cp CHANGELOG.md fluffychat-website/ - cp PRIVACY.md fluffychat-website/ + cp CHANGELOG.md fluffychat-website/src/ + cp PRIVACY.md fluffychat-website/src/ - name: Build website working-directory: fluffychat-website run: | From 2ad2b1e52c0a7067223395e1b1d2f41f19a0f783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 15 Mar 2026 07:43:47 +0100 Subject: [PATCH 328/333] build: Update fcm shared isolate --- .github/workflows/integrate.yaml | 5 +---- ios/Runner/AppDelegate.swift | 4 +++- lib/utils/background_push.dart | 5 ++++- scripts/add-firebase-messaging.sh | 2 +- scripts/release-ios-testflight.sh | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index 81669419..cf57ba7a 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -128,10 +128,7 @@ jobs: run: sudo xcode-select --switch /Applications/Xcode_16.4.app - run: brew install sqlcipher - uses: moonrepo/setup-rust@v1 - - name: Add Firebase Messaging - run: | - flutter pub add fcm_shared_isolate:0.1.0 - sed -i '' 's,//,,g' lib/utils/background_push.dart + - run: ./scripts/add-firebase-messaging.sh - run: flutter pub get - run: flutter build ios --no-codesign diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 6bea1100..6fc5538a 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -12,5 +12,7 @@ import Flutter func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) - } + + // From https://pub.dev/packages/flutter_local_notifications#-ios-setup + UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate } } diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index 98f81eeb..a4265231 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -122,7 +122,7 @@ class BackgroundPush { //firebase.setListeners( // onMessage: (message) => pushHelper( // PushNotification.fromJson( - // Map.from(message['data'] ?? message), + // message.tryGetMap('data') ?? message, // ), // client: client, // l10n: l10n, @@ -351,6 +351,9 @@ class BackgroundPush { Future setupFirebase() async { Logs().v('Setup firebase'); if (_fcmToken?.isEmpty ?? true) { + if (PlatformInfos.isIOS) { + //await firebase.requestPermission(); + } try { //_fcmToken = await firebase.getToken(); if (_fcmToken == null) throw ('PushToken is null'); diff --git a/scripts/add-firebase-messaging.sh b/scripts/add-firebase-messaging.sh index fb845d71..af7ce025 100755 --- a/scripts/add-firebase-messaging.sh +++ b/scripts/add-firebase-messaging.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -flutter pub add fcm_shared_isolate:0.2.0 +flutter pub add fcm_shared_isolate flutter pub get if [[ "$OSTYPE" == "darwin"* ]]; then diff --git a/scripts/release-ios-testflight.sh b/scripts/release-ios-testflight.sh index 5eef1662..075324c6 100755 --- a/scripts/release-ios-testflight.sh +++ b/scripts/release-ios-testflight.sh @@ -1,5 +1,5 @@ #!/bin/sh -ve -flutter pub add fcm_shared_isolate:0.2.0 +flutter pub add fcm_shared_isolate sed -i '' 's,//,,g' lib/utils/background_push.dart flutter clean flutter pub get From 24906a0def64ae283fb6c04161e9b28d6aaacda9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Mar 2026 08:17:51 +0100 Subject: [PATCH 329/333] build: Add changelog for 2.5.1 --- CHANGELOG.md | 3 +++ pubspec.yaml | 2 +- snap/snapcraft.yaml | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c71b8ca..3a4177da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## v2.5.1 +Update to latest version of fcm_shared_isolate to fix push on iOS. + ## v2.5.0 FluffyChat 2.5.0 introduces a new homeserver picker for onboarding, better image compression performance and several smaller new features, design adjustments and bug fixes. diff --git a/pubspec.yaml b/pubspec.yaml index 400dd469..6eabbbc0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none # On version bump please also increase: # 1. The build number (for F-Droid) # 2. The version in /snap/snapcraft.yaml -version: 2.5.0+3550 +version: 2.5.1+3551 environment: sdk: ">=3.11.1 <4.0.0" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index ebc618ce..71245163 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,7 +1,7 @@ name: fluffychat title: FluffyChat base: core24 -version: 2.5.0 +version: 2.5.1 license: AGPL-3.0 summary: The cutest messenger in the Matrix network description: | From cf4f5a24ab311ae5d3c55947f6f14dd63d67e67d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Mar 2026 10:50:04 +0100 Subject: [PATCH 330/333] chore: Follow up fix build website --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8c7dfe92..85eafd63 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -49,8 +49,8 @@ jobs: - name: Clone fluffychat website run: | git clone https://github.com/krille-chan/fluffychat-website.git - cp CHANGELOG.md fluffychat-website/src/ - cp PRIVACY.md fluffychat-website/src/ + cat CHANGELOG.md >> fluffychat-website/src/privacy.md + cat PRIVACY.md >> fluffychat-website/src/changelog.md - name: Build website working-directory: fluffychat-website run: | From a3fc1bff01796e90de8a84db2607e29e9b6b4991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 27 Mar 2026 11:47:43 +0100 Subject: [PATCH 331/333] chore: Follow up build website --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 85eafd63..133f099c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -49,8 +49,8 @@ jobs: - name: Clone fluffychat website run: | git clone https://github.com/krille-chan/fluffychat-website.git - cat CHANGELOG.md >> fluffychat-website/src/privacy.md - cat PRIVACY.md >> fluffychat-website/src/changelog.md + cat CHANGELOG.md >> fluffychat-website/src/changelog.md + cat PRIVACY.md >> fluffychat-website/src/privacy.md - name: Build website working-directory: fluffychat-website run: | From 3296c0d92d92d82e7e6d7649ee9d9e8187f253fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Wed, 25 Mar 2026 10:42:17 +0100 Subject: [PATCH 332/333] refactor: Enable lint use_build_context_synchronously --- analysis_options.yaml | 1 - lib/pages/archive/archive.dart | 1 + lib/pages/bootstrap/bootstrap_dialog.dart | 5 +- lib/pages/chat/chat.dart | 108 ++++++++++-------- lib/pages/chat/events/audio_player.dart | 2 + lib/pages/chat/events/cute_events.dart | 1 + lib/pages/chat/events/message_content.dart | 2 + lib/pages/chat/pinned_events.dart | 8 +- lib/pages/chat/recording_view_model.dart | 4 + lib/pages/chat/send_file_dialog.dart | 1 + lib/pages/chat/send_location_dialog.dart | 1 + lib/pages/chat/start_poll_bottom_sheet.dart | 1 + .../chat_access_settings_controller.dart | 42 ++++--- lib/pages/chat_details/chat_details.dart | 46 +++++--- .../chat_encryption_settings.dart | 33 +++--- lib/pages/chat_list/chat_list.dart | 54 +++++---- .../chat_list/client_chooser_button.dart | 1 + lib/pages/chat_list/space_view.dart | 3 + .../chat_permissions_settings.dart | 1 + .../device_settings/device_settings.dart | 44 ++++--- lib/pages/image_viewer/video_player.dart | 2 + .../intro/flows/restore_backup_flow.dart | 5 +- lib/pages/intro/intro_page.dart | 1 + lib/pages/intro/intro_page_presenter.dart | 3 +- .../invitation_selection.dart | 10 +- .../key_verification_dialog.dart | 8 +- lib/pages/login/login.dart | 50 +++++--- .../new_private_chat/new_private_chat.dart | 19 +-- .../new_private_chat/qr_scanner_modal.dart | 1 + lib/pages/settings/settings.dart | 44 ++++--- lib/pages/settings_3pid/settings_3pid.dart | 47 +++++--- .../import_archive_dialog.dart | 4 +- .../settings_emotes/settings_emotes.dart | 15 ++- .../settings_notifications.dart | 1 + .../settings_password/settings_password.dart | 6 +- .../settings_security/settings_security.dart | 47 ++++---- lib/pages/settings_style/settings_style.dart | 1 + lib/utils/fluffy_share.dart | 13 ++- .../event_extension.dart | 2 + lib/utils/platform_infos.dart | 10 +- lib/utils/show_update_snackbar.dart | 5 +- lib/utils/sign_in_flows/check_homeserver.dart | 4 + lib/utils/url_launcher.dart | 23 ++-- .../adaptive_dialogs/public_room_dialog.dart | 10 +- lib/widgets/adaptive_dialogs/user_dialog.dart | 1 + lib/widgets/chat_settings_popup_menu.dart | 10 +- lib/widgets/future_loading_dialog.dart | 10 ++ .../local_notifications_extension.dart | 5 +- lib/widgets/matrix.dart | 24 ++-- .../member_actions_popup_menu_button.dart | 43 ++++--- 50 files changed, 490 insertions(+), 293 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 05852ec2..a2bf618f 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -36,7 +36,6 @@ analyzer: - dart_code_linter errors: todo: ignore - use_build_context_synchronously: ignore exclude: - lib/l10n/*.dart diff --git a/lib/pages/archive/archive.dart b/lib/pages/archive/archive.dart index 5f8c1e23..7e22c861 100644 --- a/lib/pages/archive/archive.dart +++ b/lib/pages/archive/archive.dart @@ -48,6 +48,7 @@ class ArchiveController extends State { OkCancelResult.ok) { return; } + if (!mounted) return; await showFutureLoadingDialog( context: context, futureWithProgress: (onProgress) async { diff --git a/lib/pages/bootstrap/bootstrap_dialog.dart b/lib/pages/bootstrap/bootstrap_dialog.dart index 4ade9f98..2e3af6a8 100644 --- a/lib/pages/bootstrap/bootstrap_dialog.dart +++ b/lib/pages/bootstrap/bootstrap_dialog.dart @@ -382,6 +382,7 @@ class BootstrapDialogState extends State { ).wrongRecoveryKey, ); } catch (e, s) { + if (!context.mounted) return; ErrorReporter( context, 'Unable to open SSSS with recovery key', @@ -425,6 +426,7 @@ class BootstrapDialogState extends State { cancelLabel: L10n.of(context).cancel, ); if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; final req = await showFutureLoadingDialog( context: context, delay: false, @@ -435,11 +437,12 @@ class BootstrapDialogState extends State { }, ); if (req.error != null) return; + if (!context.mounted) return; final success = await KeyVerificationDialog( request: req.result!, ).show(context); if (success != true) return; - if (!mounted) return; + if (!context.mounted) return; final result = await showFutureLoadingDialog( context: context, diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 2dfc70d5..7572566a 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -211,6 +211,7 @@ class ChatController extends State context: context, future: room.leave, ); + if (!mounted) return; if (success.error != null) return; context.go('/rooms'); } @@ -475,8 +476,9 @@ class ChatController extends State Future? loadTimelineFuture; Future _getTimeline({String? eventContextId}) async { - await Matrix.of(context).client.roomsLoading; - await Matrix.of(context).client.accountDataLoading; + final matrix = Matrix.of(context); + await matrix.client.roomsLoading; + await matrix.client.accountDataLoading; if (eventContextId != null && (!eventContextId.isValidMatrixId || eventContextId.sigil != '\$')) { eventContextId = null; @@ -632,6 +634,7 @@ class ChatController extends State Future sendFileAction({FileType type = FileType.any}) async { final files = await selectFiles(context, allowMultiple: true, type: type); if (files.isEmpty) return; + if (!mounted) return; await showAdaptiveDialog( context: context, builder: (c) => SendFileDialog( @@ -663,6 +666,7 @@ class ChatController extends State FocusScope.of(context).requestFocus(FocusNode()); final file = await ImagePicker().pickImage(source: ImageSource.camera); if (file == null) return; + if (!mounted) return; await showAdaptiveDialog( context: context, @@ -684,6 +688,7 @@ class ChatController extends State maxDuration: const Duration(minutes: 1), ); if (file == null) return; + if (!mounted) return; await showAdaptiveDialog( context: context, @@ -726,26 +731,27 @@ class ChatController extends State mimeType: mimeType, ); - room - .sendFileEvent( - file, - inReplyTo: replyEvent, - threadRootEventId: activeThreadId, - extraContent: { - 'info': {...file.info, 'duration': duration}, - 'org.matrix.msc3245.voice': {}, - 'org.matrix.msc1767.audio': { - 'duration': duration, - 'waveform': waveform, - }, + try { + await room.sendFileEvent( + file, + inReplyTo: replyEvent, + threadRootEventId: activeThreadId, + extraContent: { + 'info': {...file.info, 'duration': duration}, + 'org.matrix.msc3245.voice': {}, + 'org.matrix.msc1767.audio': { + 'duration': duration, + 'waveform': waveform, }, - ) - .catchError((e) { - scaffoldMessenger.showSnackBar( - SnackBar(content: Text((e as Object).toLocalizedString(context))), - ); - return null; - }); + }, + ); + } catch (e) { + if (!mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(e.toLocalizedString(context))), + ); + return; + } setState(() { replyEvent = null; }); @@ -807,29 +813,30 @@ class ChatController extends State Future reportEventAction() async { final event = selectedEvents.single; + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final score = await showModalActionPopup( context: context, - title: L10n.of(context).reportMessage, - message: L10n.of(context).howOffensiveIsThisContent, - cancelLabel: L10n.of(context).cancel, + title: l10n.reportMessage, + message: l10n.howOffensiveIsThisContent, + cancelLabel: l10n.cancel, actions: [ - AdaptiveModalAction( - value: -100, - label: L10n.of(context).extremeOffensive, - ), - AdaptiveModalAction(value: -50, label: L10n.of(context).offensive), - AdaptiveModalAction(value: 0, label: L10n.of(context).inoffensive), + AdaptiveModalAction(value: -100, label: l10n.extremeOffensive), + AdaptiveModalAction(value: -50, label: l10n.offensive), + AdaptiveModalAction(value: 0, label: l10n.inoffensive), ], ); if (score == null) return; + if (!mounted) return; final reason = await showTextInputDialog( context: context, - title: L10n.of(context).whyDoYouWantToReportThis, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, - hintText: L10n.of(context).reason, + title: l10n.whyDoYouWantToReportThis, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: l10n.reason, ); if (reason == null || reason.isEmpty) return; + if (!mounted) return; final result = await showFutureLoadingDialog( context: context, future: () => Matrix.of(context).client.reportEvent( @@ -840,12 +847,13 @@ class ChatController extends State ), ); if (result.error != null) return; + if (!mounted) return; setState(() { showEmojiPicker = false; selectedEvents.clear(); }); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).contentHasBeenReported)), + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.contentHasBeenReported)), ); } @@ -861,6 +869,7 @@ class ChatController extends State } setState(selectedEvents.clear); } catch (e, s) { + if (!mounted) return; ErrorReporter( context, 'Error while delete error events action', @@ -885,6 +894,7 @@ class ChatController extends State : null; if (reasonInput == null) return; final reason = reasonInput.isEmpty ? null : reasonInput; + if (!mounted) return; await showFutureLoadingDialog( context: context, futureWithProgress: (onProgress) async { @@ -1239,6 +1249,7 @@ class ChatController extends State okLabel: L10n.of(context).unpin, cancelLabel: L10n.of(context).cancel, ); + if (!mounted) return; if (response == OkCancelResult.ok) { final events = room.pinnedEventIds ..removeWhere((oldEvent) => oldEvent == eventId); @@ -1328,17 +1339,18 @@ class ChatController extends State Future onPhoneButtonTap() async { // VoIP required Android SDK 21 if (PlatformInfos.isAndroid) { - DeviceInfoPlugin().androidInfo.then((value) { - if (value.version.sdkInt < 21) { - Navigator.pop(context); - showOkAlertDialog( - context: context, - title: L10n.of(context).unsupportedAndroidVersion, - message: L10n.of(context).unsupportedAndroidVersionLong, - okLabel: L10n.of(context).close, - ); - } - }); + final androidInfo = await DeviceInfoPlugin().androidInfo; + if (!mounted) return; + if (androidInfo.version.sdkInt < 21) { + Navigator.pop(context); + await showOkAlertDialog( + context: context, + title: L10n.of(context).unsupportedAndroidVersion, + message: L10n.of(context).unsupportedAndroidVersionLong, + okLabel: L10n.of(context).close, + ); + return; + } } final callType = await showModalActionPopup( context: context, @@ -1359,11 +1371,13 @@ class ChatController extends State ], ); if (callType == null) return; + if (!mounted) return; final voipPlugin = Matrix.of(context).voipPlugin; try { await voipPlugin!.voip.inviteToCall(room, callType); } catch (e) { + if (!mounted) return; ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); diff --git a/lib/pages/chat/events/audio_player.dart b/lib/pages/chat/events/audio_player.dart index 9fc2dbf1..413aef01 100644 --- a/lib/pages/chat/events/audio_player.dart +++ b/lib/pages/chat/events/audio_player.dart @@ -189,6 +189,7 @@ class AudioPlayerState extends State { }); } catch (e, s) { Logs().v('Could not download audio file', e, s); + if (!mounted) rethrow; ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); @@ -208,6 +209,7 @@ class AudioPlayerState extends State { ), ); } + if (!mounted) return; audioPlayer.play().onError( ErrorReporter(context, 'Unable to play audio message').onErrorCallback, diff --git a/lib/pages/chat/events/cute_events.dart b/lib/pages/chat/events/cute_events.dart index 01d53c6d..1c84f59f 100644 --- a/lib/pages/chat/events/cute_events.dart +++ b/lib/pages/chat/events/cute_events.dart @@ -50,6 +50,7 @@ class _CuteContentState extends State { Future addOverlay() async { _isOverlayShown = true; await Future.delayed(const Duration(milliseconds: 50)); + if (!mounted) return; OverlayEntry? overlay; overlay = OverlayEntry( diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart index eb5aa649..1ec5f5f0 100644 --- a/lib/pages/chat/events/message_content.dart +++ b/lib/pages/chat/events/message_content.dart @@ -61,9 +61,11 @@ class MessageContent extends StatelessWidget { final client = Matrix.of(context).client; final state = await client.getCryptoIdentityState(); if (!state.connected) { + if (!context.mounted) return; final success = await context.push('/backup'); if (success != true) return; } + if (!context.mounted) return; event.requestKey(); final sender = event.senderFromMemoryOrFallback; await showAdaptiveBottomSheet( diff --git a/lib/pages/chat/pinned_events.dart b/lib/pages/chat/pinned_events.dart index 53b6ebcf..e183e918 100644 --- a/lib/pages/chat/pinned_events.dart +++ b/lib/pages/chat/pinned_events.dart @@ -15,6 +15,7 @@ class PinnedEvents extends StatelessWidget { const PinnedEvents(this.controller, {super.key}); Future _displayPinnedEventsDialog(BuildContext context) async { + final l10n = L10n.of(context); final eventsResult = await showFutureLoadingDialog( context: context, future: () => Future.wait( @@ -25,13 +26,14 @@ class PinnedEvents extends StatelessWidget { ); final events = eventsResult.result; if (events == null) return; + if (!context.mounted) return; final eventId = events.length == 1 ? events.single?.eventId : await showModalActionPopup( context: context, - title: L10n.of(context).pin, - cancelLabel: L10n.of(context).cancel, + title: l10n.pin, + cancelLabel: l10n.cancel, actions: events .map( (event) => AdaptiveModalAction( @@ -39,7 +41,7 @@ class PinnedEvents extends StatelessWidget { icon: const Icon(Icons.push_pin_outlined), label: event?.calcLocalizedBodyFallback( - MatrixLocals(L10n.of(context)), + MatrixLocals(l10n), withSenderNamePrefix: true, hideReply: true, ) ?? diff --git a/lib/pages/chat/recording_view_model.dart b/lib/pages/chat/recording_view_model.dart index d66ccbe4..e7d85e0d 100644 --- a/lib/pages/chat/recording_view_model.dart +++ b/lib/pages/chat/recording_view_model.dart @@ -44,6 +44,7 @@ class RecordingViewModelState extends State { room.client.getConfig(); // Preload server file configuration. if (PlatformInfos.isAndroid) { final info = await DeviceInfoPlugin().androidInfo; + if (!mounted) return; if (info.version.sdkInt < 19) { showOkAlertDialog( context: context, @@ -76,6 +77,7 @@ class RecordingViewModelState extends State { final result = await audioRecorder.hasPermission(); if (result != true) { + if (!mounted) return; showOkAlertDialog( context: context, title: L10n.of(context).oopsSomethingWentWrong, @@ -97,10 +99,12 @@ class RecordingViewModelState extends State { ), path: path ?? '', ); + if (!mounted) return; setState(() => duration = Duration.zero); _subscribe(); } catch (e, s) { Logs().w('Unable to start voice message recording', e, s); + if (!mounted) return; showOkAlertDialog( context: context, title: L10n.of(context).oopsSomethingWentWrong, diff --git a/lib/pages/chat/send_file_dialog.dart b/lib/pages/chat/send_file_dialog.dart index ef6b9cb5..0b6d14f3 100644 --- a/lib/pages/chat/send_file_dialog.dart +++ b/lib/pages/chat/send_file_dialog.dart @@ -146,6 +146,7 @@ class SendFileDialogState extends State { scaffoldMessenger.clearSnackBars(); } catch (e) { scaffoldMessenger.clearSnackBars(); + if (!mounted || !widget.outerContext.mounted) rethrow; final theme = Theme.of(context); scaffoldMessenger.showSnackBar( SnackBar( diff --git a/lib/pages/chat/send_location_dialog.dart b/lib/pages/chat/send_location_dialog.dart index 5c460eb6..b5cde79e 100644 --- a/lib/pages/chat/send_location_dialog.dart +++ b/lib/pages/chat/send_location_dialog.dart @@ -81,6 +81,7 @@ class SendLocationDialogState extends State { context: context, future: () => widget.room.sendLocation(body, uri), ); + if (!mounted) return; Navigator.of(context, rootNavigator: false).pop(); } diff --git a/lib/pages/chat/start_poll_bottom_sheet.dart b/lib/pages/chat/start_poll_bottom_sheet.dart index 5612f7fe..eb054dd7 100644 --- a/lib/pages/chat/start_poll_bottom_sheet.dart +++ b/lib/pages/chat/start_poll_bottom_sheet.dart @@ -44,6 +44,7 @@ class _StartPollBottomSheetState extends State { maxSelections: _allowMultipleAnswers ? _answers.length : 1, txid: _txid, ); + if (!mounted) return; Navigator.of(context).pop(); } catch (e, s) { Logs().w('Unable to create poll', e, s); diff --git a/lib/pages/chat_access_settings/chat_access_settings_controller.dart b/lib/pages/chat_access_settings/chat_access_settings_controller.dart index e090e863..1c55f889 100644 --- a/lib/pages/chat_access_settings/chat_access_settings_controller.dart +++ b/lib/pages/chat_access_settings/chat_access_settings_controller.dart @@ -160,6 +160,7 @@ class ChatAccessSettingsController extends State { } Future updateRoomAction() async { + final l10n = L10n.of(context); final roomVersion = room .getState(EventTypes.RoomCreate)! .content @@ -170,10 +171,11 @@ class ChatAccessSettingsController extends State { ); final capabilities = capabilitiesResult.result; if (capabilities == null) return; + if (!mounted) return; final newVersion = await showModalActionPopup( context: context, - title: L10n.of(context).replaceRoomWithNewerVersion, - cancelLabel: L10n.of(context).cancel, + title: l10n.replaceRoomWithNewerVersion, + cancelLabel: l10n.cancel, actions: capabilities.mRoomVersions!.available.entries .where((r) => r.key != roomVersion) .map( @@ -185,18 +187,20 @@ class ChatAccessSettingsController extends State { ) .toList(), ); - if (newVersion == null || - OkCancelResult.cancel == - await showOkCancelAlertDialog( - context: context, - okLabel: L10n.of(context).yes, - cancelLabel: L10n.of(context).cancel, - title: L10n.of(context).areYouSure, - message: L10n.of(context).roomUpgradeDescription, - isDestructive: true, - )) { + if (newVersion == null) return; + if (!mounted) return; + final confirmUpgrade = await showOkCancelAlertDialog( + context: context, + okLabel: l10n.yes, + cancelLabel: l10n.cancel, + title: l10n.areYouSure, + message: l10n.roomUpgradeDescription, + isDestructive: true, + ); + if (confirmUpgrade == OkCancelResult.cancel) { return; } + if (!mounted) return; final result = await showFutureLoadingDialog( context: context, futureWithProgress: (onProgress) async { @@ -243,6 +247,7 @@ class ChatAccessSettingsController extends State { } Future addAlias() async { + final l10n = L10n.of(context); final domain = room.client.userID?.domain; if (domain == null) { throw Exception('userID or domain is null! This should never happen.'); @@ -250,11 +255,12 @@ class ChatAccessSettingsController extends State { final input = await showTextInputDialog( context: context, - title: L10n.of(context).editRoomAliases, + title: l10n.editRoomAliases, prefixText: '#', suffixText: domain, - hintText: L10n.of(context).alias, + hintText: l10n.alias, ); + if (!mounted) return; final aliasLocalpart = input?.trim(); if (aliasLocalpart == null || aliasLocalpart.isEmpty) return; final alias = '#$aliasLocalpart:$domain'; @@ -264,17 +270,19 @@ class ChatAccessSettingsController extends State { future: () => room.client.setRoomAlias(alias, room.id), ); if (result.error != null) return; + if (!mounted) return; setState(() {}); if (!room.canChangeStateEvent(EventTypes.RoomCanonicalAlias)) return; final canonicalAliasConsent = await showOkCancelAlertDialog( context: context, - title: L10n.of(context).setAsCanonicalAlias, + title: l10n.setAsCanonicalAlias, message: alias, - okLabel: L10n.of(context).yes, - cancelLabel: L10n.of(context).no, + okLabel: l10n.yes, + cancelLabel: l10n.no, ); + if (!mounted) return; final altAliases = room diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index d227e24e..03bb8e61 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -37,69 +37,78 @@ class ChatDetailsController extends State { String? get roomId => widget.roomId; Future setDisplaynameAction() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final room = Matrix.of(context).client.getRoomById(roomId!)!; final input = await showTextInputDialog( context: context, - title: L10n.of(context).changeTheNameOfTheGroup, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, - initialText: room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), + title: l10n.changeTheNameOfTheGroup, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + initialText: room.getLocalizedDisplayname(MatrixLocals(l10n)), ); if (input == null) return; + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, future: () => room.setName(input), ); + if (!mounted) return; if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).displaynameHasBeenChanged)), + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.displaynameHasBeenChanged)), ); } } Future setTopicAction() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final room = Matrix.of(context).client.getRoomById(roomId!)!; final input = await showTextInputDialog( context: context, - title: L10n.of(context).setChatDescription, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, - hintText: L10n.of(context).noChatDescriptionYet, + title: l10n.setChatDescription, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: l10n.noChatDescriptionYet, initialText: room.topic, minLines: 4, maxLines: 8, ); if (input == null) return; + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, future: () => room.setDescription(input), ); + if (!mounted) return; if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).chatDescriptionHasBeenChanged)), + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.chatDescriptionHasBeenChanged)), ); } } Future setAvatarAction() async { + final l10n = L10n.of(context); final room = Matrix.of(context).client.getRoomById(roomId!); final actions = [ if (PlatformInfos.isMobile) AdaptiveModalAction( value: AvatarAction.camera, - label: L10n.of(context).openCamera, + label: l10n.openCamera, isDefaultAction: true, icon: const Icon(Icons.camera_alt_outlined), ), AdaptiveModalAction( value: AvatarAction.file, - label: L10n.of(context).openGallery, + label: l10n.openGallery, icon: const Icon(Icons.photo_outlined), ), if (room?.avatar != null) AdaptiveModalAction( value: AvatarAction.remove, - label: L10n.of(context).delete, + label: l10n.delete, isDestructive: true, icon: const Icon(Icons.delete_outlined), ), @@ -108,11 +117,12 @@ class ChatDetailsController extends State { ? actions.single.value : await showModalActionPopup( context: context, - title: L10n.of(context).editRoomAvatar, - cancelLabel: L10n.of(context).cancel, + title: l10n.editRoomAvatar, + cancelLabel: l10n.cancel, actions: actions, ); if (action == null) return; + if (!mounted) return; if (action == AvatarAction.remove) { await showFutureLoadingDialog( context: context, @@ -131,6 +141,7 @@ class ChatDetailsController extends State { if (result == null) return; file = MatrixFile(bytes: await result.readAsBytes(), name: result.path); } else { + if (!mounted) return; final picked = await selectFiles( context, allowMultiple: false, @@ -143,6 +154,7 @@ class ChatDetailsController extends State { name: pickedFile.name, ); } + if (!mounted) return; await showFutureLoadingDialog( context: context, future: () => room!.setAvatar(file), diff --git a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart index efcaf751..6e17d92f 100644 --- a/lib/pages/chat_encryption_settings/chat_encryption_settings.dart +++ b/lib/pages/chat_encryption_settings/chat_encryption_settings.dart @@ -30,38 +30,40 @@ class ChatEncryptionSettingsController extends State { } Future enableEncryption(_) async { + final l10n = L10n.of(context); if (room.encrypted) { showOkAlertDialog( context: context, - title: L10n.of(context).sorryThatsNotPossible, - message: L10n.of(context).disableEncryptionWarning, + title: l10n.sorryThatsNotPossible, + message: l10n.disableEncryptionWarning, ); return; } if (room.joinRules == JoinRules.public) { showOkAlertDialog( context: context, - title: L10n.of(context).sorryThatsNotPossible, - message: L10n.of(context).noEncryptionForPublicRooms, + title: l10n.sorryThatsNotPossible, + message: l10n.noEncryptionForPublicRooms, ); return; } if (!room.canChangeStateEvent(EventTypes.Encryption)) { showOkAlertDialog( context: context, - title: L10n.of(context).sorryThatsNotPossible, - message: L10n.of(context).noPermission, + title: l10n.sorryThatsNotPossible, + message: l10n.noPermission, ); return; } final consent = await showOkCancelAlertDialog( context: context, - title: L10n.of(context).areYouSure, - message: L10n.of(context).enableEncryptionWarning, - okLabel: L10n.of(context).yes, - cancelLabel: L10n.of(context).cancel, + title: l10n.areYouSure, + message: l10n.enableEncryptionWarning, + okLabel: l10n.yes, + cancelLabel: l10n.cancel, ); if (consent != OkCancelResult.ok) return; + if (!mounted) return; await showFutureLoadingDialog( context: context, future: () => room.enableEncryption(), @@ -69,14 +71,16 @@ class ChatEncryptionSettingsController extends State { } Future startVerification() async { + final l10n = L10n.of(context); final consent = await showOkCancelAlertDialog( context: context, - title: L10n.of(context).verifyOtherUser, - message: L10n.of(context).verifyOtherUserDescription, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, + title: l10n.verifyOtherUser, + message: l10n.verifyOtherUserDescription, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, ); if (consent != OkCancelResult.ok) return; + if (!mounted) return; final req = await room.client.userDeviceKeys[room.directChatMatrixID]! .startVerification(); req.onUpdate = () { @@ -84,6 +88,7 @@ class ChatEncryptionSettingsController extends State { setState(() {}); } }; + if (!mounted) return; await KeyVerificationDialog(request: req).show(context); } diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index bb00e694..9ac99e30 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -90,6 +90,8 @@ class ChatListController extends State }); Future onChatTap(Room room) async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); if (room.membership == Membership.invite) { final joinResult = await showFutureLoadingDialog( context: context, @@ -105,10 +107,11 @@ class ChatListController extends State ); if (joinResult.error != null) return; } + if (!mounted) return; if (room.membership == Membership.ban) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).youHaveBeenBannedFromThisChat)), + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.youHaveBeenBannedFromThisChat)), ); return; } @@ -156,23 +159,25 @@ class ChatListController extends State static const String _serverStoreNamespace = 'im.fluffychat.search.server'; Future setServer() async { + final matrix = Matrix.of(context); + final l10n = L10n.of(context); final newServer = await showTextInputDialog( useRootNavigator: false, - title: L10n.of(context).changeTheHomeserver, + title: l10n.changeTheHomeserver, context: context, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, prefixText: 'https://', - hintText: Matrix.of(context).client.homeserver?.host, + hintText: matrix.client.homeserver?.host, initialText: searchServer, keyboardType: TextInputType.url, autocorrect: false, - validator: (server) => server.contains('.') == true - ? null - : L10n.of(context).invalidServerName, + validator: (server) => + server.contains('.') == true ? null : l10n.invalidServerName, ); if (newServer == null) return; - Matrix.of(context).store.setString(_serverStoreNamespace, newServer); + if (!mounted) return; + matrix.store.setString(_serverStoreNamespace, newServer); setState(() { searchServer = newServer; }); @@ -185,6 +190,7 @@ class ChatListController extends State Future _search() async { final client = Matrix.of(context).client; + final scaffoldMessenger = ScaffoldMessenger.of(context); if (!isSearching) { setState(() { isSearching = true; @@ -227,9 +233,10 @@ class ChatListController extends State ); } catch (e, s) { Logs().w('Searching has crashed', e, s); - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); + if (!mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(e.toLocalizedString(context))), + ); } if (!isSearchMode) return; setState(() { @@ -293,9 +300,8 @@ class ChatListController extends State Future editSpace(BuildContext context, String spaceId) async { await Matrix.of(context).client.getRoomById(spaceId)!.postLoad(); - if (mounted) { - context.push('/rooms/$spaceId/details'); - } + if (!context.mounted) return; + context.push('/rooms/$spaceId/details'); } // Needs to match GroupsSpacesEntry for 'separate group' checking. @@ -742,6 +748,7 @@ class ChatListController extends State .toList(), ); if (space == null) return; + if (!mounted) return; await showFutureLoadingDialog( context: context, future: () => space.setSpaceChild(room.id), @@ -767,16 +774,18 @@ class ChatListController extends State } Future setStatus() async { + final l10n = L10n.of(context); final client = Matrix.of(context).client; final currentPresence = await client.fetchCurrentPresence(client.userID!); + if (!mounted) return; final input = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context).setStatus, - message: L10n.of(context).leaveEmptyToClearStatus, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, - hintText: L10n.of(context).statusExampleMessage, + title: l10n.setStatus, + message: l10n.leaveEmptyToClearStatus, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: l10n.statusExampleMessage, maxLines: 6, minLines: 1, maxLength: 255, @@ -904,18 +913,21 @@ class ChatListController extends State if (action == null) return; switch (action) { case EditBundleAction.addToBundle: + if (!mounted) return; final bundle = await showTextInputDialog( context: context, title: l10n.bundleName, hintText: l10n.bundleName, ); if (bundle == null || bundle.isEmpty || bundle.isEmpty) return; + if (!mounted) return; await showFutureLoadingDialog( context: context, future: () => client.setAccountBundle(bundle), ); break; case EditBundleAction.removeFromBundle: + if (!mounted) return; await showFutureLoadingDialog( context: context, future: () => client.removeFromAccountBundle(activeBundle!), diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index 64d7d08f..3e6a4110 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -209,6 +209,7 @@ class ClientChooserButton extends StatelessWidget { cancelLabel: L10n.of(context).cancel, ); if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; context.go('/rooms/settings/addaccount'); break; case SettingsAction.newGroup: diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index b24f1993..bc4804ac 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -170,14 +170,17 @@ class _SpaceViewState extends State { switch (action) { case SpaceActions.settings: await space?.postLoad(); + if (!mounted) return; context.push('/rooms/${widget.spaceId}/details'); break; case SpaceActions.invite: await space?.postLoad(); + if (!mounted) return; context.push('/rooms/${widget.spaceId}/invite'); break; case SpaceActions.members: await space?.postLoad(); + if (!mounted) return; context.push('/rooms/${widget.spaceId}/details/members'); break; case SpaceActions.leave: diff --git a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart index f7d342fe..c83064b5 100644 --- a/lib/pages/chat_permissions_settings/chat_permissions_settings.dart +++ b/lib/pages/chat_permissions_settings/chat_permissions_settings.dart @@ -36,6 +36,7 @@ class ChatPermissionsSettingsController extends State { currentLevel: currentLevel, ); if (newLevel == null) return; + if (!context.mounted) return; final content = Map.from( room.getState(EventTypes.RoomPowerLevels)!.content, ); diff --git a/lib/pages/device_settings/device_settings.dart b/lib/pages/device_settings/device_settings.dart index 05eb1efb..2e6f565e 100644 --- a/lib/pages/device_settings/device_settings.dart +++ b/lib/pages/device_settings/device_settings.dart @@ -41,12 +41,15 @@ class DevicesSettingsController extends State { Future _checkChatBackup() async { final client = Matrix.of(context).client; final state = await client.getCryptoIdentityState(); + if (!mounted) return; setState(() { chatBackupEnabled = state.initialized && !state.connected; }); } Future removeDevicesAction(List devices) async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); final client = Matrix.of(context).client; final wellKnown = await Result.capture(client.getWellknown()); @@ -57,18 +60,19 @@ class DevicesSettingsController extends State { launchUrlString(accountManageUrl, mode: LaunchMode.inAppBrowserView); return; } + if (!mounted) return; if (await showOkCancelAlertDialog( context: context, - title: L10n.of(context).areYouSure, - okLabel: L10n.of(context).remove, - cancelLabel: L10n.of(context).cancel, - message: L10n.of(context).removeDevicesDescription, + title: l10n.areYouSure, + okLabel: l10n.remove, + cancelLabel: l10n.cancel, + message: l10n.removeDevicesDescription, isDestructive: true, ) == OkCancelResult.cancel) { return; } - final matrix = Matrix.of(context); + if (!mounted) return; final deviceIds = []; for (final userDevice in devices) { deviceIds.add(userDevice.deviceId); @@ -85,19 +89,21 @@ class DevicesSettingsController extends State { } Future renameDeviceAction(Device device) async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); final displayName = await showTextInputDialog( context: context, - title: L10n.of(context).changeDeviceName, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, + title: l10n.changeDeviceName, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, hintText: device.displayName, ); if (displayName == null) return; + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, - future: () => Matrix.of( - context, - ).client.updateDevice(device.deviceId, displayName: displayName), + future: () => + matrix.client.updateDevice(device.deviceId, displayName: displayName), ); if (success.error == null) { reload(); @@ -105,17 +111,20 @@ class DevicesSettingsController extends State { } Future verifyDeviceAction(Device device) async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); final consent = await showOkCancelAlertDialog( context: context, - title: L10n.of(context).verifyOtherDevice, - message: L10n.of(context).verifyOtherDeviceDescription, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, + title: l10n.verifyOtherDevice, + message: l10n.verifyOtherDeviceDescription, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, ); if (consent != OkCancelResult.ok) return; - final req = await Matrix.of(context) + if (!mounted) return; + final req = await matrix .client - .userDeviceKeys[Matrix.of(context).client.userID!]! + .userDeviceKeys[matrix.client.userID!]! .deviceKeys[device.deviceId]! .startVerification(); req.onUpdate = () { @@ -126,6 +135,7 @@ class DevicesSettingsController extends State { setState(() {}); } }; + if (!mounted) return; await KeyVerificationDialog(request: req).show(context); } diff --git a/lib/pages/image_viewer/video_player.dart b/lib/pages/image_viewer/video_player.dart index 7c17f80f..f97b3320 100644 --- a/lib/pages/image_viewer/video_player.dart +++ b/lib/pages/image_viewer/video_player.dart @@ -92,10 +92,12 @@ class EventVideoPlayerState extends State { ); }); } on IOException catch (e) { + if (!mounted) return; ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text(e.toLocalizedString(context)))); } catch (e, s) { + if (!mounted) return; ErrorReporter(context, 'Unable to play video').onErrorCallback(e, s); } } diff --git a/lib/pages/intro/flows/restore_backup_flow.dart b/lib/pages/intro/flows/restore_backup_flow.dart index 2e8e6d00..1db7a9d4 100644 --- a/lib/pages/intro/flows/restore_backup_flow.dart +++ b/lib/pages/intro/flows/restore_backup_flow.dart @@ -4,6 +4,7 @@ import 'package:fluffychat/widgets/matrix.dart'; import 'package:flutter/material.dart'; Future restoreBackupFlow(BuildContext context) async { + final matrix = Matrix.of(context); final picked = await selectFiles(context); final file = picked.firstOrNull; if (file == null) return; @@ -12,9 +13,9 @@ Future restoreBackupFlow(BuildContext context) async { await showFutureLoadingDialog( context: context, future: () async { - final client = await Matrix.of(context).getLoginClient(); + final client = await matrix.getLoginClient(); await client.importDump(String.fromCharCodes(await file.readAsBytes())); - Matrix.of(context).initMatrix(); + matrix.initMatrix(); }, ); } diff --git a/lib/pages/intro/intro_page.dart b/lib/pages/intro/intro_page.dart index f57878a5..49fa0b70 100644 --- a/lib/pages/intro/intro_page.dart +++ b/lib/pages/intro/intro_page.dart @@ -166,6 +166,7 @@ class IntroPage extends StatelessWidget { final client = await Matrix.of( context, ).getLoginClient(); + if (!context.mounted) return; context.go( '${GoRouterState.of(context).uri.path}/login', extra: client, diff --git a/lib/pages/intro/intro_page_presenter.dart b/lib/pages/intro/intro_page_presenter.dart index 27cb86bb..34bddfc7 100644 --- a/lib/pages/intro/intro_page_presenter.dart +++ b/lib/pages/intro/intro_page_presenter.dart @@ -75,7 +75,8 @@ class _IntroPagePresenterState extends State { final client = await Matrix.of(context).getLoginClient(); await client.checkHomeserver(homeserverUrl); await client.oidcLogin(session: session, code: code, state: state); - if (context.mounted) context.go('/backup'); + if (!mounted) return; + context.go('/backup'); } catch (e, s) { Logs().w('Unable to login via OIDC', e, s); if (mounted) { diff --git a/lib/pages/invitation_selection/invitation_selection.dart b/lib/pages/invitation_selection/invitation_selection.dart index ff769106..e0941233 100644 --- a/lib/pages/invitation_selection/invitation_selection.dart +++ b/lib/pages/invitation_selection/invitation_selection.dart @@ -54,6 +54,8 @@ class InvitationSelectionController extends State { String id, String displayname, ) async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final room = Matrix.of(context).client.getRoomById(roomId!)!; final success = await showFutureLoadingDialog( @@ -61,10 +63,9 @@ class InvitationSelectionController extends State { future: () => room.invite(id), ); if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context).contactHasBeenInvitedToTheGroup), - ), + if (!context.mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.contactHasBeenInvitedToTheGroup)), ); } } @@ -91,6 +92,7 @@ class InvitationSelectionController extends State { try { response = await matrix.client.searchUserDirectory(text, limit: 10); } catch (e) { + if (!context.mounted) return; ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text((e).toLocalizedString(context)))); diff --git a/lib/pages/key_verification/key_verification_dialog.dart b/lib/pages/key_verification/key_verification_dialog.dart index d1329992..52c8868a 100644 --- a/lib/pages/key_verification/key_verification_dialog.dart +++ b/lib/pages/key_verification/key_verification_dialog.dart @@ -82,6 +82,7 @@ class KeyVerificationPageState extends State { }, ); if (valid.error != null) { + if (!mounted) return; await showOkAlertDialog( useRootNavigator: false, context: context, @@ -178,9 +179,10 @@ class KeyVerificationPageState extends State { ); buttons.add( AdaptiveDialogAction( - onPressed: () => widget.request.rejectVerification().then( - (_) => Navigator.of(context, rootNavigator: false).pop(false), - ), + onPressed: () => widget.request.rejectVerification().then((_) { + if (!context.mounted) return; + Navigator.of(context, rootNavigator: false).pop(false); + }), child: Text( L10n.of(context).reject, style: TextStyle(color: theme.colorScheme.error), diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 8fb9ec73..4ebd3278 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -130,15 +130,19 @@ class LoginController extends State { Logs().v( '$newDomain is not running a homeserver, asking to use $oldHomeserver', ); + if (!mounted) return; + final l10n = L10n.of(context); final dialogResult = await showOkCancelAlertDialog( context: context, useRootNavigator: false, - title: L10n.of( - context, - ).noMatrixServer(newDomain.toString(), oldHomeserver.toString()), - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, + title: l10n.noMatrixServer( + newDomain.toString(), + oldHomeserver.toString(), + ), + okLabel: l10n.ok, + cancelLabel: l10n.cancel, ); + if (!mounted) return; if (dialogResult == OkCancelResult.ok) { if (mounted) setState(() => usernameError = null); } else { @@ -156,26 +160,30 @@ class LoginController extends State { } } catch (e) { widget.client.homeserver = oldHomeserver; + if (!mounted) return; usernameError = e.toLocalizedString(context); if (mounted) setState(() {}); } } Future passwordForgotten() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final input = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context).passwordForgotten, - message: L10n.of(context).enterAnEmailAddress, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, + title: l10n.passwordForgotten, + message: l10n.enterAnEmailAddress, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, initialText: usernameController.text.isEmail ? usernameController.text : '', - hintText: L10n.of(context).enterAnEmailAddress, + hintText: l10n.enterAnEmailAddress, keyboardType: TextInputType.emailAddress, ); if (input == null) return; + if (!mounted) return; final clientSecret = DateTime.now().millisecondsSinceEpoch.toString(); final response = await showFutureLoadingDialog( context: context, @@ -186,27 +194,30 @@ class LoginController extends State { ), ); if (response.error != null) return; + if (!mounted) return; final password = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context).passwordForgotten, - message: L10n.of(context).chooseAStrongPassword, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, + title: l10n.passwordForgotten, + message: l10n.chooseAStrongPassword, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, hintText: '******', obscureText: true, minLines: 1, maxLines: 1, ); if (password == null) return; + if (!mounted) return; final ok = await showOkAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context).weSentYouAnEmail, - message: L10n.of(context).pleaseClickOnLink, - okLabel: L10n.of(context).iHaveClickedOnLink, + title: l10n.weSentYouAnEmail, + message: l10n.pleaseClickOnLink, + okLabel: l10n.iHaveClickedOnLink, ); if (ok != OkCancelResult.ok) return; + if (!mounted) return; final data = { 'new_password': password, 'logout_devices': false, @@ -226,9 +237,10 @@ class LoginController extends State { data: data, ), ); + if (!mounted) return; if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).passwordHasBeenChanged)), + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.passwordHasBeenChanged)), ); usernameController.text = input; passwordController.text = password; diff --git a/lib/pages/new_private_chat/new_private_chat.dart b/lib/pages/new_private_chat/new_private_chat.dart index faf30114..6135b473 100644 --- a/lib/pages/new_private_chat/new_private_chat.dart +++ b/lib/pages/new_private_chat/new_private_chat.dart @@ -81,17 +81,19 @@ class NewPrivateChatController extends State { void inviteAction() => FluffyShare.shareInviteLink(context); Future openScannerAction() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); if (PlatformInfos.isAndroid) { final info = await DeviceInfoPlugin().androidInfo; + if (!mounted) return; if (info.version.sdkInt < 21) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(L10n.of(context).unsupportedAndroidVersionLong), - ), + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.unsupportedAndroidVersionLong)), ); return; } } + if (!mounted) return; await showAdaptiveBottomSheet( context: context, builder: (_) => QrScannerModal( @@ -101,12 +103,15 @@ class NewPrivateChatController extends State { } Future copyUserId() async { + final scaffoldMessenger = ScaffoldMessenger.of(context); + final l10n = L10n.of(context); await Clipboard.setData( ClipboardData(text: Matrix.of(context).client.userID!), ); - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text(L10n.of(context).copiedToClipboard))); + if (!mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.copiedToClipboard)), + ); } void openUserModal(Profile profile) => diff --git a/lib/pages/new_private_chat/qr_scanner_modal.dart b/lib/pages/new_private_chat/qr_scanner_modal.dart index 53a822b0..1983c1a6 100644 --- a/lib/pages/new_private_chat/qr_scanner_modal.dart +++ b/lib/pages/new_private_chat/qr_scanner_modal.dart @@ -66,6 +66,7 @@ class QrScannerModalState extends State { late StreamSubscription sub; sub = controller.scannedDataStream.listen((scanData) { sub.cancel(); + if (!mounted) return; Navigator.of(context).pop(); final data = scanData.code; if (data != null) widget.onScan(data); diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 2b988d08..e8b21a54 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -35,18 +35,20 @@ class SettingsController extends State { }); Future setDisplaynameAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); final profile = await profileFuture; + if (!mounted) return; final input = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context).editDisplayname, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, - initialText: - profile?.displayName ?? Matrix.of(context).client.userID!.localpart, + title: l10n.editDisplayname, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + initialText: profile?.displayName ?? matrix.client.userID!.localpart, ); if (input == null) return; - final matrix = Matrix.of(context); + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, future: () => matrix.client.setProfileField( @@ -61,19 +63,21 @@ class SettingsController extends State { } Future logoutAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context).areYouSureYouWantToLogout, - message: L10n.of(context).noBackupWarning, + title: l10n.areYouSureYouWantToLogout, + message: l10n.noBackupWarning, isDestructive: cryptoIdentityConnected == false, - okLabel: L10n.of(context).logout, - cancelLabel: L10n.of(context).cancel, + okLabel: l10n.logout, + cancelLabel: l10n.cancel, ) == OkCancelResult.cancel) { return; } - final matrix = Matrix.of(context); + if (!mounted) return; await showFutureLoadingDialog( context: context, future: () => matrix.client.logout(), @@ -81,24 +85,27 @@ class SettingsController extends State { } Future setAvatarAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); final profile = await profileFuture; + if (!mounted) return; final actions = [ if (PlatformInfos.isMobile) AdaptiveModalAction( value: AvatarAction.camera, - label: L10n.of(context).openCamera, + label: l10n.openCamera, isDefaultAction: true, icon: const Icon(Icons.camera_alt_outlined), ), AdaptiveModalAction( value: AvatarAction.file, - label: L10n.of(context).openGallery, + label: l10n.openGallery, icon: const Icon(Icons.photo_outlined), ), if (profile?.avatarUrl != null) AdaptiveModalAction( value: AvatarAction.remove, - label: L10n.of(context).removeYourAvatar, + label: l10n.removeYourAvatar, isDestructive: true, icon: const Icon(Icons.delete_outlined), ), @@ -107,12 +114,12 @@ class SettingsController extends State { ? actions.single.value : await showModalActionPopup( context: context, - title: L10n.of(context).changeYourAvatar, - cancelLabel: L10n.of(context).cancel, + title: l10n.changeYourAvatar, + cancelLabel: l10n.cancel, actions: actions, ); if (action == null) return; - final matrix = Matrix.of(context); + if (!mounted) return; if (action == AvatarAction.remove) { final success = await showFutureLoadingDialog( context: context, @@ -134,6 +141,7 @@ class SettingsController extends State { if (result == null) return; file = MatrixFile(bytes: await result.readAsBytes(), name: result.path); } else { + if (!mounted) return; final result = await selectFiles(context, type: FileType.image); final pickedFile = result.firstOrNull; if (pickedFile == null) return; @@ -142,6 +150,7 @@ class SettingsController extends State { name: pickedFile.name, ); } + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, future: () => matrix.client.setAvatar(file), @@ -168,6 +177,7 @@ class SettingsController extends State { } final state = await client.getCryptoIdentityState(); + if (!mounted) return; setState(() { cryptoIdentityConnected = state.initialized && state.connected; }); diff --git a/lib/pages/settings_3pid/settings_3pid.dart b/lib/pages/settings_3pid/settings_3pid.dart index 18f89be7..25f738f8 100644 --- a/lib/pages/settings_3pid/settings_3pid.dart +++ b/lib/pages/settings_3pid/settings_3pid.dart @@ -19,41 +19,48 @@ class Settings3Pid extends StatefulWidget { class Settings3PidController extends State { Future add3PidAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); final input = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context).enterAnEmailAddress, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, - hintText: L10n.of(context).enterAnEmailAddress, + title: l10n.enterAnEmailAddress, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, + hintText: l10n.enterAnEmailAddress, keyboardType: TextInputType.emailAddress, ); if (input == null) return; + if (!mounted) return; final clientSecret = DateTime.now().millisecondsSinceEpoch.toString(); final response = await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).client.requestTokenToRegisterEmail( + future: () => matrix.client.requestTokenToRegisterEmail( clientSecret, input, Settings3Pid.sendAttempt++, ), ); if (response.error != null) return; + if (!mounted) return; final ok = await showOkAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context).weSentYouAnEmail, - message: L10n.of(context).pleaseClickOnLink, - okLabel: L10n.of(context).iHaveClickedOnLink, + title: l10n.weSentYouAnEmail, + message: l10n.pleaseClickOnLink, + okLabel: l10n.iHaveClickedOnLink, ); if (ok != OkCancelResult.ok) return; + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, delay: false, - future: () => Matrix.of(context).client.uiaRequestBackground( - (auth) => Matrix.of( - context, - ).client.add3PID(clientSecret, response.result!.sid, auth: auth), + future: () => matrix.client.uiaRequestBackground( + (auth) => matrix.client.add3PID( + clientSecret, + response.result!.sid, + auth: auth, + ), ), ); if (success.error != null) return; @@ -63,21 +70,25 @@ class Settings3PidController extends State { Future?>? request; Future delete3Pid(ThirdPartyIdentifier identifier) async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context).areYouSure, - okLabel: L10n.of(context).yes, - cancelLabel: L10n.of(context).cancel, + title: l10n.areYouSure, + okLabel: l10n.yes, + cancelLabel: l10n.cancel, ) != OkCancelResult.ok) { return; } + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, - future: () => Matrix.of( - context, - ).client.delete3pidFromAccount(identifier.address, identifier.medium), + future: () => matrix.client.delete3pidFromAccount( + identifier.address, + identifier.medium, + ), ); if (success.error != null) return; setState(() => request = null); diff --git a/lib/pages/settings_emotes/import_archive_dialog.dart b/lib/pages/settings_emotes/import_archive_dialog.dart index 20b1ffde..80b9dcf0 100644 --- a/lib/pages/settings_emotes/import_archive_dialog.dart +++ b/lib/pages/settings_emotes/import_archive_dialog.dart @@ -91,6 +91,7 @@ class _ImportEmoteArchiveDialogState extends State { } Future _addEmotePack() async { + final matrix = Matrix.of(context); setState(() { _loading = true; _progress = 0; @@ -148,7 +149,7 @@ class _ImportEmoteArchiveDialogState extends State { } else { mxcFile = thumbnail; } - final uri = await Matrix.of(context).client.uploadContent( + final uri = await matrix.client.uploadContent( mxcFile.bytes, filename: mxcFile.name, contentType: mxcFile.mimeType, @@ -178,6 +179,7 @@ class _ImportEmoteArchiveDialogState extends State { } } + if (!mounted) return; await widget.controller.save(context); _importMap.removeWhere( (key, value) => successfulUploads.contains(key.name), diff --git a/lib/pages/settings_emotes/settings_emotes.dart b/lib/pages/settings_emotes/settings_emotes.dart index 9825daa9..13cd4819 100644 --- a/lib/pages/settings_emotes/settings_emotes.dart +++ b/lib/pages/settings_emotes/settings_emotes.dart @@ -293,6 +293,7 @@ class EmotesSettingsController extends State { } Future createStickers() async { + final matrix = Matrix.of(context); final pickedFiles = await selectFiles( context, type: FileType.image, @@ -315,7 +316,7 @@ class EmotesSettingsController extends State { nativeImplementations: ClientManager.nativeImplementations, ) ?? file; - final uri = await Matrix.of(context).client.uploadContent( + final uri = await matrix.client.uploadContent( file.bytes, filename: file.name, contentType: file.mimeType, @@ -361,6 +362,7 @@ class EmotesSettingsController extends State { final buffer = InputMemoryStream(await result.single.readAsBytes()); final archive = ZipDecoder().decodeStream(buffer); + if (!mounted) return; await showDialog( context: context, @@ -375,7 +377,7 @@ class EmotesSettingsController extends State { Future exportAsZip() async { final client = Matrix.of(context).client; - await showFutureLoadingDialog( + final result = await showFutureLoadingDialog( context: context, future: () async { final pack = _getPack(); @@ -397,11 +399,12 @@ class EmotesSettingsController extends State { '${pack.pack.displayName ?? client.userID?.localpart ?? 'emotes'}.zip'; final output = ZipEncoder().encode(archive); - MatrixFile( - name: fileName, - bytes: Uint8List.fromList(output), - ).save(context); + return MatrixFile(name: fileName, bytes: Uint8List.fromList(output)); }, ); + final file = result.result; + if (file == null) return; + if (!mounted) return; + file.save(context); } } diff --git a/lib/pages/settings_notifications/settings_notifications.dart b/lib/pages/settings_notifications/settings_notifications.dart index 1f61c33b..8874d1d3 100644 --- a/lib/pages/settings_notifications/settings_notifications.dart +++ b/lib/pages/settings_notifications/settings_notifications.dart @@ -40,6 +40,7 @@ class SettingsNotificationsController extends State { ], ); if (delete != true) return; + if (!mounted) return; final success = await showFutureLoadingDialog( context: context, diff --git a/lib/pages/settings_password/settings_password.dart b/lib/pages/settings_password/settings_password.dart index acceda75..e248e7c0 100644 --- a/lib/pages/settings_password/settings_password.dart +++ b/lib/pages/settings_password/settings_password.dart @@ -24,6 +24,8 @@ class SettingsPasswordController extends State { bool loading = false; Future changePassword() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); setState(() { oldPasswordError = newPassword1Error = newPassword2Error = null; }); @@ -51,13 +53,13 @@ class SettingsPasswordController extends State { loading = true; }); try { - final scaffoldMessenger = ScaffoldMessenger.of(context); await Matrix.of(context).client.changePassword( newPassword1Controller.text, oldPassword: oldPasswordController.text, ); + if (!mounted) return; scaffoldMessenger.showSnackBar( - SnackBar(content: Text(L10n.of(context).passwordHasBeenChanged)), + SnackBar(content: Text(l10n.passwordHasBeenChanged)), ); if (mounted) context.pop(); } catch (e) { diff --git a/lib/pages/settings_security/settings_security.dart b/lib/pages/settings_security/settings_security.dart index 57ea44f3..a0c5754a 100644 --- a/lib/pages/settings_security/settings_security.dart +++ b/lib/pages/settings_security/settings_security.dart @@ -19,20 +19,21 @@ class SettingsSecurity extends StatefulWidget { class SettingsSecurityController extends State { Future setAppLockAction() async { + final l10n = L10n.of(context); if (AppLock.of(context).isActive) { AppLock.of(context).showLockScreen(); } final newLock = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context).pleaseChooseAPasscode, - message: L10n.of(context).pleaseEnter4Digits, - cancelLabel: L10n.of(context).cancel, + title: l10n.pleaseChooseAPasscode, + message: l10n.pleaseEnter4Digits, + cancelLabel: l10n.cancel, validator: (text) { if (text.isEmpty || (text.length == 4 && int.tryParse(text)! >= 0)) { return null; } - return L10n.of(context).pleaseEnter4Digits; + return l10n.pleaseEnter4Digits; }, keyboardType: TextInputType.number, obscureText: true, @@ -41,53 +42,55 @@ class SettingsSecurityController extends State { maxLength: 4, ); if (newLock != null) { + if (!mounted) return; await AppLock.of(context).changePincode(newLock); } } Future deleteAccountAction() async { + final l10n = L10n.of(context); + final matrix = Matrix.of(context); if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, - title: L10n.of(context).warning, - message: L10n.of(context).deactivateAccountWarning, - okLabel: L10n.of(context).ok, - cancelLabel: L10n.of(context).cancel, + title: l10n.warning, + message: l10n.deactivateAccountWarning, + okLabel: l10n.ok, + cancelLabel: l10n.cancel, isDestructive: true, ) == OkCancelResult.cancel) { return; } - final supposedMxid = Matrix.of(context).client.userID!; + if (!mounted) return; + final supposedMxid = matrix.client.userID!; final mxid = await showTextInputDialog( useRootNavigator: false, context: context, - title: L10n.of(context).confirmMatrixId, - validator: (text) => text == supposedMxid - ? null - : L10n.of(context).supposedMxid(supposedMxid), + title: l10n.confirmMatrixId, + validator: (text) => + text == supposedMxid ? null : l10n.supposedMxid(supposedMxid), isDestructive: true, - okLabel: L10n.of(context).delete, - cancelLabel: L10n.of(context).cancel, + okLabel: l10n.delete, + cancelLabel: l10n.cancel, ); if (mxid == null || mxid.isEmpty || mxid != supposedMxid) { return; } + if (!mounted) return; final resp = await showFutureLoadingDialog( context: context, delay: false, - future: () => - Matrix.of(context).client.uiaRequestBackground( - (auth) => Matrix.of( - context, - ).client.deactivateAccount(auth: auth, erase: true), - ), + future: () => matrix.client.uiaRequestBackground( + (auth) => matrix.client.deactivateAccount(auth: auth, erase: true), + ), ); if (!resp.isError) { + if (!mounted) return; await showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).client.logout(), + future: () => matrix.client.logout(), ); } } diff --git a/lib/pages/settings_style/settings_style.dart b/lib/pages/settings_style/settings_style.dart index 0feff1c4..7e8e45f4 100644 --- a/lib/pages/settings_style/settings_style.dart +++ b/lib/pages/settings_style/settings_style.dart @@ -29,6 +29,7 @@ class SettingsStyleController extends State { final picked = await selectFiles(context, type: FileType.image); final pickedFile = picked.firstOrNull; if (pickedFile == null) return; + if (!mounted) return; await showFutureLoadingDialog( context: context, diff --git a/lib/utils/fluffy_share.dart b/lib/utils/fluffy_share.dart index 45699616..7a52d286 100644 --- a/lib/utils/fluffy_share.dart +++ b/lib/utils/fluffy_share.dart @@ -12,6 +12,8 @@ abstract class FluffyShare { BuildContext context, { bool copyOnly = false, }) async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); if (PlatformInfos.isMobile && !copyOnly) { final box = context.findRenderObject() as RenderBox; await SharePlus.instance.share( @@ -24,21 +26,20 @@ abstract class FluffyShare { } await Clipboard.setData(ClipboardData(text: text)); if (!PlatformInfos.isMobile) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - showCloseIcon: true, - content: Text(L10n.of(context).copiedToClipboard), - ), + scaffoldMessenger.showSnackBar( + SnackBar(showCloseIcon: true, content: Text(l10n.copiedToClipboard)), ); } return; } static Future shareInviteLink(BuildContext context) async { + final l10n = L10n.of(context); final client = Matrix.of(context).client; final ownProfile = await client.fetchOwnProfile(); + if (!context.mounted) return; await FluffyShare.share( - L10n.of(context).inviteText( + l10n.inviteText( ownProfile.displayName ?? client.userID!, 'https://matrix.to/#/${client.userID}?client=im.fluffychat', ), diff --git a/lib/utils/matrix_sdk_extensions/event_extension.dart b/lib/utils/matrix_sdk_extensions/event_extension.dart index 84b9f2d8..641898ac 100644 --- a/lib/utils/matrix_sdk_extensions/event_extension.dart +++ b/lib/utils/matrix_sdk_extensions/event_extension.dart @@ -25,12 +25,14 @@ extension LocalizedBody on Event { Future saveFile(BuildContext context) async { final matrixFile = await _getFile(context); + if (!context.mounted) return; matrixFile.result?.save(context); } Future shareFile(BuildContext context) async { final matrixFile = await _getFile(context); + if (!context.mounted) return; matrixFile.result?.share(context); } diff --git a/lib/utils/platform_infos.dart b/lib/utils/platform_infos.dart index f5addae6..4d4a0dfb 100644 --- a/lib/utils/platform_infos.dart +++ b/lib/utils/platform_infos.dart @@ -50,15 +50,17 @@ abstract class PlatformInfos { } static Future showDialog(BuildContext context) async { + final l10n = L10n.of(context); final version = await PlatformInfos.getVersion(); + if (!context.mounted) return; showAboutDialog( context: context, children: [ - Text(L10n.of(context).versionWithNumber(version)), + Text(l10n.versionWithNumber(version)), TextButton.icon( onPressed: () => launchUrlString(AppConfig.sourceCodeUrl), icon: const Icon(Icons.source_outlined), - label: Text(L10n.of(context).sourceCode), + label: Text(l10n.sourceCode), ), Builder( builder: (innerContext) { @@ -68,7 +70,7 @@ abstract class PlatformInfos { Navigator.of(innerContext).pop(); }, icon: const Icon(Icons.list_outlined), - label: Text(L10n.of(context).logs), + label: Text(l10n.logs), ); }, ), @@ -80,7 +82,7 @@ abstract class PlatformInfos { Navigator.of(innerContext).pop(); }, icon: const Icon(Icons.settings_applications_outlined), - label: Text(L10n.of(context).advancedConfigs), + label: Text(l10n.advancedConfigs), ); }, ), diff --git a/lib/utils/show_update_snackbar.dart b/lib/utils/show_update_snackbar.dart index 8735a941..c0366046 100644 --- a/lib/utils/show_update_snackbar.dart +++ b/lib/utils/show_update_snackbar.dart @@ -10,6 +10,7 @@ abstract class UpdateNotifier { static Future showUpdateSnackBar(BuildContext context) async { final scaffoldMessenger = ScaffoldMessenger.of(context); + final l10n = L10n.of(context); final currentVersion = await PlatformInfos.getVersion(); final store = await SharedPreferences.getInstance(); final storedVersion = store.getString(versionStoreKey); @@ -20,9 +21,9 @@ abstract class UpdateNotifier { SnackBar( duration: const Duration(seconds: 30), showCloseIcon: true, - content: Text(L10n.of(context).updateInstalled(currentVersion)), + content: Text(l10n.updateInstalled(currentVersion)), action: SnackBarAction( - label: L10n.of(context).changelog, + label: l10n.changelog, onPressed: () => launchUrlString(AppConfig.changelogUrl), ), ), diff --git a/lib/utils/sign_in_flows/check_homeserver.dart b/lib/utils/sign_in_flows/check_homeserver.dart index 213ad909..ca77b5ca 100644 --- a/lib/utils/sign_in_flows/check_homeserver.dart +++ b/lib/utils/sign_in_flows/check_homeserver.dart @@ -38,6 +38,7 @@ Future connectToHomeserverFlow( if ((kIsWeb || PlatformInfos.isLinux) && (supportsSso || authMetadata != null || (signUp && regLink != null))) { + if (!context.mounted) return; final consent = await showOkCancelAlertDialog( context: context, title: l10n.appWantsToUseForLogin(homeserverInput), @@ -45,7 +46,9 @@ Future connectToHomeserverFlow( okLabel: l10n.continueText, ); if (consent != OkCancelResult.ok) return; + if (!context.mounted) return; } + if (!context.mounted) return; if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) { await oidcLoginFlow(client, context, signUp); @@ -55,6 +58,7 @@ Future connectToHomeserverFlow( if (signUp && regLink != null) { await launchUrlString(regLink); } + if (!context.mounted) return; final pathSegments = List.of( GoRouter.of(context).routeInformationProvider.value.uri.pathSegments, ); diff --git a/lib/utils/url_launcher.dart b/lib/utils/url_launcher.dart index fcc64113..34649cd1 100644 --- a/lib/utils/url_launcher.dart +++ b/lib/utils/url_launcher.dart @@ -27,6 +27,8 @@ class UrlLauncher { const UrlLauncher(this.context, this.url, [this.name]); Future launchUrl() async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); if (url!.toLowerCase().startsWith(AppConfig.deepLinkPrefix) || url!.toLowerCase().startsWith(AppConfig.inviteLinkPrefix) || {'#', '@', '!', '+', '\$'}.contains(url![0]) || @@ -36,8 +38,8 @@ class UrlLauncher { final uri = Uri.tryParse(url!); if (uri == null) { // we can't open this thing - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).cantOpenUri(url!))), + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.cantOpenUri(url!))), ); return; } @@ -47,10 +49,10 @@ class UrlLauncher { // that the user can see the actual url before opening the browser. final consent = await showOkCancelAlertDialog( context: context, - title: L10n.of(context).openLinkInBrowser, + title: l10n.openLinkInBrowser, message: url, - okLabel: L10n.of(context).open, - cancelLabel: L10n.of(context).cancel, + okLabel: l10n.open, + cancelLabel: l10n.cancel, ); if (consent != OkCancelResult.ok) return; } @@ -90,8 +92,8 @@ class UrlLauncher { return; } if (uri.host.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).cantOpenUri(url!))), + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.cantOpenUri(url!))), ); return; } @@ -161,6 +163,7 @@ class UrlLauncher { } } servers.addAll(identityParts.via); + if (!context.mounted) return; if (room != null) { if (room.isSpace) { // TODO: Implement navigate to space @@ -178,6 +181,7 @@ class UrlLauncher { } return; } else { + if (!context.mounted) return; await showAdaptiveDialog( context: context, builder: (c) => @@ -185,6 +189,7 @@ class UrlLauncher { ); } if (roomIdOrAlias.sigil == '!') { + if (!context.mounted) return; if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, @@ -192,6 +197,7 @@ class UrlLauncher { ) == OkCancelResult.ok) { roomId = roomIdOrAlias; + if (!context.mounted) return; final response = await showFutureLoadingDialog( context: context, future: () => matrix.client.joinRoom( @@ -200,11 +206,13 @@ class UrlLauncher { ), ); if (response.error != null) return; + if (!context.mounted) return; // wait for two seconds so that it probably came down /sync await showFutureLoadingDialog( context: context, future: () => Future.delayed(const Duration(seconds: 2)), ); + if (!context.mounted) return; if (event != null) { context.go( Uri( @@ -228,6 +236,7 @@ class UrlLauncher { return Profile(userId: userId); }), ); + if (!context.mounted) return; await UserDialog.show( context: context, profile: profileResult.result!, diff --git a/lib/widgets/adaptive_dialogs/public_room_dialog.dart b/lib/widgets/adaptive_dialogs/public_room_dialog.dart index adb0865d..6149be12 100644 --- a/lib/widgets/adaptive_dialogs/public_room_dialog.dart +++ b/lib/widgets/adaptive_dialogs/public_room_dialog.dart @@ -25,6 +25,7 @@ class PublicRoomDialog extends StatelessWidget { const PublicRoomDialog({super.key, this.roomAlias, this.chunk, this.via}); Future _joinRoom(BuildContext context) async { + final l10n = L10n.of(context); final client = Matrix.of(context).client; final chunk = this.chunk; final knock = chunk?.joinRule == 'knock'; @@ -48,12 +49,13 @@ class PublicRoomDialog extends StatelessWidget { ); final roomId = result.result; if (roomId == null) return; + if (!context.mounted) return; if (knock && client.getRoomById(roomId) == null) { Navigator.of(context).pop(true); await showOkAlertDialog( context: context, - title: L10n.of(context).youHaveKnocked, - message: L10n.of(context).pleaseWaitUntilInvited, + title: l10n.youHaveKnocked, + message: l10n.pleaseWaitUntilInvited, ); return; } @@ -73,6 +75,7 @@ class PublicRoomDialog extends StatelessWidget { bool _testRoom(PublishedRoomsChunk r) => r.canonicalAlias == roomAlias; Future _search(BuildContext context) async { + final l10n = L10n.of(context); final chunk = this.chunk; if (chunk != null) return chunk; final query = await Matrix.of(context).client.queryPublicRooms( @@ -80,7 +83,7 @@ class PublicRoomDialog extends StatelessWidget { filter: PublicRoomQueryFilter(genericSearchTerm: roomAlias), ); if (!query.chunk.any(_testRoom)) { - throw (L10n.of(context).noRoomsFound); + throw (l10n.noRoomsFound); } return query.chunk.firstWhere(_testRoom); } @@ -248,6 +251,7 @@ class PublicRoomDialog extends StatelessWidget { hintText: L10n.of(context).reason, ); if (reason == null || reason.isEmpty) return; + if (!context.mounted) return; await showFutureLoadingDialog( context: context, future: () => Matrix.of(context).client.reportRoom( diff --git a/lib/widgets/adaptive_dialogs/user_dialog.dart b/lib/widgets/adaptive_dialogs/user_dialog.dart index 764a6ed8..4e30a5b3 100644 --- a/lib/widgets/adaptive_dialogs/user_dialog.dart +++ b/lib/widgets/adaptive_dialogs/user_dialog.dart @@ -220,6 +220,7 @@ class UserDialog extends StatelessWidget { hintText: L10n.of(context).reason, ); if (reason == null || reason.isEmpty) return; + if (!context.mounted) return; await showFutureLoadingDialog( context: context, future: () => Matrix.of( diff --git a/lib/widgets/chat_settings_popup_menu.dart b/lib/widgets/chat_settings_popup_menu.dart index 8ba7952c..a33cc911 100644 --- a/lib/widgets/chat_settings_popup_menu.dart +++ b/lib/widgets/chat_settings_popup_menu.dart @@ -53,16 +53,18 @@ class ChatSettingsPopupMenuState extends State { onSelected: (choice) async { switch (choice) { case ChatPopupMenuActions.leave: + final l10n = L10n.of(context); final router = GoRouter.of(context); final confirmed = await showOkCancelAlertDialog( context: context, - title: L10n.of(context).areYouSure, - message: L10n.of(context).archiveRoomDescription, - okLabel: L10n.of(context).leave, - cancelLabel: L10n.of(context).cancel, + title: l10n.areYouSure, + message: l10n.archiveRoomDescription, + okLabel: l10n.leave, + cancelLabel: l10n.cancel, isDestructive: true, ); if (confirmed != OkCancelResult.ok) return; + if (!context.mounted) return; final result = await showFutureLoadingDialog( context: context, future: () => widget.room.leave(), diff --git a/lib/widgets/future_loading_dialog.dart b/lib/widgets/future_loading_dialog.dart index 4cf2ee6d..9afb7b8f 100644 --- a/lib/widgets/future_loading_dialog.dart +++ b/lib/widgets/future_loading_dialog.dart @@ -5,6 +5,7 @@ import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/adaptive_dialog_action.dart'; import 'package:flutter/material.dart'; +import 'package:matrix/matrix_api_lite/utils/logs.dart'; /// Displays a loading dialog which reacts to the given [future]. The dialog /// will be dismissed and the value will be returned when the future completes. @@ -40,6 +41,15 @@ Future> showFutureLoadingDialog({ } } + if (!context.mounted) { + Logs().e( + 'Unable to show loading dialog!', + Exception('The BuildContext is not mounted!'), + StackTrace.current, + ); + return Result.capture(futureExec); + } + final result = await showAdaptiveDialog>( context: context, barrierDismissible: barrierDismissible, diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index 47597286..cf97ad50 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -17,6 +17,7 @@ import 'package:universal_html/html.dart' as html; extension LocalNotificationsExtension on MatrixState { Future showLocalNotification(Event event) async { + final l10n = L10n.of(context); final roomId = event.room.id; if (activeRoomId == roomId) { if (WidgetsBinding.instance.lifecycleState == AppLifecycleState.resumed) { @@ -114,11 +115,11 @@ extension LocalNotificationsExtension on MatrixState { actions: [ NotificationAction( DesktopNotificationActions.openChat.name, - L10n.of(context).openChat, + l10n.openChat, ), NotificationAction( DesktopNotificationActions.seen.name, - L10n.of(context).markAsRead, + l10n.markAsRead, ), ], hints: hints, diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index 2f7a3291..614bdb87 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -265,12 +265,19 @@ class MatrixState extends State with WidgetsBindingObserver { InitWithRestoreExtension.deleteSessionBackup(name); if (loggedInWithMultipleClients) { + final snackbarContext = + FluffyChatApp + .router + .routerDelegate + .navigatorKey + .currentContext ?? + context; + + if (!snackbarContext.mounted) return; + final l10n = L10n.of(snackbarContext); ScaffoldMessenger.of( - FluffyChatApp.router.routerDelegate.navigatorKey.currentContext ?? - context, - ).showSnackBar( - SnackBar(content: Text(L10n.of(context).oneClientLoggedOut)), - ); + snackbarContext, + ).showSnackBar(SnackBar(content: Text(l10n.oneClientLoggedOut))); return; } FluffyChatApp.router.go('/'); @@ -382,15 +389,17 @@ class MatrixState extends State with WidgetsBindingObserver { } Future dehydrateAction(BuildContext context) async { + final l10n = L10n.of(context); final response = await showOkCancelAlertDialog( context: context, isDestructive: true, - title: L10n.of(context).dehydrate, - message: L10n.of(context).dehydrateWarning, + title: l10n.dehydrate, + message: l10n.dehydrateWarning, ); if (response != OkCancelResult.ok) { return; } + if (!context.mounted) return; final result = await showFutureLoadingDialog( context: context, future: client.exportDump, @@ -404,6 +413,7 @@ class MatrixState extends State with WidgetsBindingObserver { 'fluffychat-export-${DateFormat(DateFormat.YEAR_MONTH_DAY).format(DateTime.now())}.fluffybackup'; final file = MatrixFile(bytes: exportBytes, name: exportFileName); + if (!context.mounted) return; file.save(context); } } diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart index 46ec8e96..1ae71387 100644 --- a/lib/widgets/member_actions_popup_menu_button.dart +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -14,6 +14,8 @@ Future showMemberActionsPopupMenu({ required User user, void Function()? onMention, }) async { + final l10n = L10n.of(context); + final scaffoldMessenger = ScaffoldMessenger.of(context); final theme = Theme.of(context); final displayname = user.calcDisplayname(); final isMe = user.room.client.userID == user.id; @@ -245,12 +247,13 @@ Future showMemberActionsPopupMenu({ case _MemberActions.kick: if (await showOkCancelAlertDialog( context: context, - title: L10n.of(context).areYouSure, - okLabel: L10n.of(context).yes, - cancelLabel: L10n.of(context).no, - message: L10n.of(context).kickUserDescription, + title: l10n.areYouSure, + okLabel: l10n.yes, + cancelLabel: l10n.no, + message: l10n.kickUserDescription, ) == OkCancelResult.ok) { + if (!context.mounted) return; await showFutureLoadingDialog( context: context, future: () => user.kick(), @@ -260,12 +263,13 @@ Future showMemberActionsPopupMenu({ case _MemberActions.ban: if (await showOkCancelAlertDialog( context: context, - title: L10n.of(context).areYouSure, - okLabel: L10n.of(context).yes, - cancelLabel: L10n.of(context).no, - message: L10n.of(context).banUserDescription, + title: l10n.areYouSure, + okLabel: l10n.yes, + cancelLabel: l10n.no, + message: l10n.banUserDescription, ) == OkCancelResult.ok) { + if (!context.mounted) return; await showFutureLoadingDialog( context: context, future: () => user.ban(), @@ -275,20 +279,22 @@ Future showMemberActionsPopupMenu({ case _MemberActions.report: final reason = await showTextInputDialog( context: context, - title: L10n.of(context).whyDoYouWantToReportThis, - okLabel: L10n.of(context).report, - cancelLabel: L10n.of(context).cancel, - hintText: L10n.of(context).reason, + title: l10n.whyDoYouWantToReportThis, + okLabel: l10n.report, + cancelLabel: l10n.cancel, + hintText: l10n.reason, ); if (reason == null || reason.isEmpty) return; + if (!context.mounted) return; final result = await showFutureLoadingDialog( context: context, future: () => user.room.client.reportUser(user.id, reason), ); if (result.error != null) return; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(L10n.of(context).contentHasBeenReported)), + if (!context.mounted) return; + scaffoldMessenger.showSnackBar( + SnackBar(content: Text(l10n.contentHasBeenReported)), ); return; case _MemberActions.info: @@ -304,12 +310,13 @@ Future showMemberActionsPopupMenu({ case _MemberActions.unban: if (await showOkCancelAlertDialog( context: context, - title: L10n.of(context).areYouSure, - okLabel: L10n.of(context).yes, - cancelLabel: L10n.of(context).no, - message: L10n.of(context).unbanUserDescription, + title: l10n.areYouSure, + okLabel: l10n.yes, + cancelLabel: l10n.no, + message: l10n.unbanUserDescription, ) == OkCancelResult.ok) { + if (!context.mounted) return; await showFutureLoadingDialog( context: context, future: () => user.unban(), From 9c90db876d7b6bebb59f78028422db89484f5aa9 Mon Sep 17 00:00:00 2001 From: Alex Katon Date: Thu, 26 Mar 2026 13:06:24 +0100 Subject: [PATCH 333/333] chore(translations): Translated using Weblate (Belarusian) Currently translated at 100.0% (763 of 763 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/be/ --- lib/l10n/intl_be.arb | 411 ++++++++----------------------------------- 1 file changed, 69 insertions(+), 342 deletions(-) diff --git a/lib/l10n/intl_be.arb b/lib/l10n/intl_be.arb index 338e33f9..021578d1 100644 --- a/lib/l10n/intl_be.arb +++ b/lib/l10n/intl_be.arb @@ -4,28 +4,19 @@ "description": "Set to true to always display time of day in 24 hour format." }, "repeatPassword": "Паўтарыце пароль", - "@repeatPassword": {}, "notAnImage": "Не файл выявы.", - "@notAnImage": {}, "ignoreUser": "Ігнараваць карыстальніка", - "@ignoreUser": {}, "remove": "Прыбраць", "@remove": { "type": "String", "placeholders": {} }, "importNow": "Імпартаваць зараз", - "@importNow": {}, "importEmojis": "Імпартаваць эмодзі", - "@importEmojis": {}, "importFromZipFile": "Імпартаваць з файла .zip", - "@importFromZipFile": {}, "exportEmotePack": "Экспартаваць пак эмодзі як .zip", - "@exportEmotePack": {}, "replace": "Замяніць", - "@replace": {}, "about": "Пра праграму", - "@about": {}, "aboutHomeserver": "Пра {homeserver}", "@aboutHomeserver": { "type": "String", @@ -69,7 +60,6 @@ "placeholders": {} }, "confirmMatrixId": "Калі ласка, спраўдзіце свой Matrix ID перад выдаленнем свайго ўліковага запісу.", - "@confirmMatrixId": {}, "supposedMxid": "Гэта павінна быць накшталт {mxid}", "@supposedMxid": { "type": "String", @@ -80,7 +70,6 @@ } }, "addToSpace": "Дадаць у прастору", - "@addToSpace": {}, "admin": "Адмін", "@admin": { "type": "String", @@ -102,13 +91,9 @@ "placeholders": {} }, "commandHint_roomupgrade": "Абнавіце гэты пакой да згаданай версіі", - "@commandHint_roomupgrade": {}, "commandHint_googly": "Даслаць смешныя вочы", - "@commandHint_googly": {}, "commandHint_cuddle": "Даслаць усмешку", - "@commandHint_cuddle": {}, "commandHint_hug": "Даслаць абдымашкі", - "@commandHint_hug": {}, "googlyEyesContent": "{senderName} даслаў(-ла) вам смешныя вочы", "@googlyEyesContent": { "type": "String", @@ -156,13 +141,12 @@ "placeholders": {} }, "appLockDescription": "Блакіруе праграму, пакуль вы не ўвядзіце пін-код", - "@appLockDescription": {}, "archive": "Архіў", "@archive": { "type": "String", "placeholders": {} }, - "areGuestsAllowedToJoin": "Ці дазволена карыстальнікам-гасцям далучыцца", + "areGuestsAllowedToJoin": "Ці дазволена карыстальнікам-гасцям далучыцца?", "@areGuestsAllowedToJoin": { "type": "String", "placeholders": {} @@ -209,21 +193,13 @@ } }, "sendTypingNotifications": "Дасылаць паведамленне пра друк", - "@sendTypingNotifications": {}, "swipeRightToLeftToReply": "Змахніце ўлева, каб адказаць", - "@swipeRightToLeftToReply": {}, "sendOnEnter": "Дасылаць на enter", - "@sendOnEnter": {}, "noMoreChatsFound": "Болей чатаў не знойдзена...", - "@noMoreChatsFound": {}, "noChatsFoundHere": "Здаецца, тут пуста. Пачніце новы чат з кімсьці праз кнопку ніжэй. ⤵️", - "@noChatsFoundHere": {}, "unread": "Непрачытаные", - "@unread": {}, "space": "Прастора", - "@space": {}, "spaces": "Прасторы", - "@spaces": {}, "banFromChat": "Заблакіраваць ў чаце", "@banFromChat": { "type": "String", @@ -402,7 +378,6 @@ } }, "noMessagesYet": "Паведамленняў пакуль што няма", - "@noMessagesYet": {}, "changedTheRoomAliases": "{username} змяніў псеўданімы пакою", "@changedTheRoomAliases": { "type": "String", @@ -457,7 +432,6 @@ "placeholders": {} }, "yourChatBackupHasBeenSetUp": "Рэзервовае капіраванне чатаў было наладжана.", - "@yourChatBackupHasBeenSetUp": {}, "chatBackup": "Рэзервовае капіраванне чатаў", "@chatBackup": { "type": "String", @@ -484,16 +458,13 @@ "placeholders": {} }, "clearArchive": "Ачысціць архіў", - "@clearArchive": {}, "close": "Закрыць", "@close": { "type": "String", "placeholders": {} }, "commandHint_markasdm": "Пазначыць як пакой асабоных паведамленняў для дадання Matrix ID", - "@commandHint_markasdm": {}, "commandHint_markasgroup": "Пазначыць як групу", - "@commandHint_markasgroup": {}, "commandHint_ban": "Заблакіраваць карыстальніка у гэтым пакое", "@commandHint_ban": { "type": "String", @@ -648,7 +619,6 @@ } }, "checkList": "Кантрольны спіс", - "@checkList": {}, "countParticipants": "{count} удзельніка(-ў)", "@countParticipants": { "type": "String", @@ -682,7 +652,6 @@ } }, "createGroup": "Стварыць групу", - "@createGroup": {}, "createNewSpace": "Новая прастора", "@createNewSpace": { "type": "String", @@ -776,7 +745,6 @@ "placeholders": {} }, "chatPermissions": "Дазволы чату", - "@chatPermissions": {}, "editDisplayname": "Змяніць адлюстроўваемае імя", "@editDisplayname": { "type": "String", @@ -818,17 +786,11 @@ "placeholders": {} }, "globalChatId": "ID габальнага чату", - "@globalChatId": {}, "accessAndVisibility": "Даступнасць і бачнасць", - "@accessAndVisibility": {}, "accessAndVisibilityDescription": "Каму дазволена далучацца да гэтага чату і як ён можа быць знойдзены.", - "@accessAndVisibilityDescription": {}, "calls": "Выклікі", - "@calls": {}, "customEmojisAndStickers": "Карыстальніцкія эмодзі і стыкеры", - "@customEmojisAndStickers": {}, "customEmojisAndStickersBody": "Дадаць ці падзяліцца карыстальніцкімі эмодзі ці стыкерамі, што могуць быць ужыты ў любым чаце.", - "@customEmojisAndStickersBody": {}, "emoteShortcode": "Скарачэнне эмодзі", "@emoteShortcode": { "type": "String", @@ -879,14 +841,12 @@ } }, "enableMultiAccounts": "(БЭТА) Уключыць некалькі ўліковых запісаў на гэтай прыладзе", - "@enableMultiAccounts": {}, "enterAnEmailAddress": "Увядзіце электроную пошту (email)", "@enterAnEmailAddress": { "type": "String", "placeholders": {} }, "homeserver": "Дамашні сервер", - "@homeserver": {}, "errorObtainingLocation": "Памылка атрымання месцазнаходжання: {error}", "@errorObtainingLocation": { "type": "String", @@ -942,9 +902,7 @@ "placeholders": {} }, "chatDescription": "Апісанне чату", - "@chatDescription": {}, "chatDescriptionHasBeenChanged": "Апісанне чату зменена", - "@chatDescriptionHasBeenChanged": {}, "groupIsPublic": "Група публічная", "@groupIsPublic": { "type": "String", @@ -997,11 +955,8 @@ "placeholders": {} }, "hideRedactedMessages": "Схаваць адрэдагаваныя паведамленні", - "@hideRedactedMessages": {}, "hideRedactedMessagesBody": "Калі хтосьці рэдагуе паведамленне, яно будзе схавана ў чаце.", - "@hideRedactedMessagesBody": {}, "hideInvalidOrUnknownMessageFormats": "Хаваць памылковыя ці невядомыя фарматы паведамленняў", - "@hideInvalidOrUnknownMessageFormats": {}, "howOffensiveIsThisContent": "Наколькі абражальны гэты кантэнт?", "@howOffensiveIsThisContent": { "type": "String", @@ -1013,13 +968,9 @@ "placeholders": {} }, "block": "Заблакіраваць", - "@block": {}, "blockedUsers": "Заблакіраваныя карыстальнікі", - "@blockedUsers": {}, "blockListDescription": "Вы можаце заблакіраваць карыстальнікаў, якія вам перашкаджаюць. Вы не атрымаеце ад іх ні паведамленняў, ні запрашэнняў.", - "@blockListDescription": {}, "blockUsername": "Ігнараваць імя карыстальніка", - "@blockUsername": {}, "iHaveClickedOnLink": "Я перайшоў па спасылцы", "@iHaveClickedOnLink": { "type": "String", @@ -1050,20 +1001,15 @@ } }, "noChatDescriptionYet": "Апісанне чату яшчэ няма.", - "@noChatDescriptionYet": {}, "tryAgain": "Паспрабуйце зноў", - "@tryAgain": {}, "invalidServerName": "Недапушчальная назва сервера", - "@invalidServerName": {}, "invited": "Запрошаны", "@invited": { "type": "String", "placeholders": {} }, "redactMessageDescription": "Гэта паведамленне будзе адрэдагавана для усіх карыстальнікаў. Вы не зможаце яго адмяніць.", - "@redactMessageDescription": {}, "optionalRedactReason": "(Неабавязкова) Прычына рэдагавання паведамлення...", - "@optionalRedactReason": {}, "invitedUser": "📩 {username} запрасіў(-ла) {targetName}", "@invitedUser": { "type": "String", @@ -1175,11 +1121,8 @@ } }, "dehydrate": "Экспарт сеансу і ачыстка прылады", - "@dehydrate": {}, "dehydrateWarning": "Гэта дзеянне не можа быць адменена. Пераканайцеся, што вы бяспечна захавалі файл рэзервовай копіі.", - "@dehydrateWarning": {}, "hydrate": "Аднавіць з рэзервовай копіі", - "@hydrate": {}, "loadingPleaseWait": "Загрузка... Калі ласка, пачакайце.", "@loadingPleaseWait": { "type": "String", @@ -1230,7 +1173,6 @@ "placeholders": {} }, "messagesStyle": "Паведамленні:", - "@messagesStyle": {}, "moderator": "Мадэратар", "@moderator": { "type": "String", @@ -1304,9 +1246,7 @@ } }, "shareInviteLink": "Падзяліцца запрашальнай спасылкай", - "@shareInviteLink": {}, "scanQrCode": "Сканіраваць QR-код", - "@scanQrCode": {}, "none": "Нічога", "@none": { "type": "String", @@ -1333,7 +1273,6 @@ "placeholders": {} }, "setChatDescription": "Задаць апісанне чату", - "@setChatDescription": {}, "setStatus": "Задаць статус", "@setStatus": { "type": "String", @@ -1543,29 +1482,17 @@ "placeholders": {} }, "messageInfo": "Інфармацыя пра паведамленне", - "@messageInfo": {}, "time": "Час", - "@time": {}, "messageType": "Тып паведамлення", - "@messageType": {}, "sender": "Адпраўшчык", - "@sender": {}, "openGallery": "Адкрыць галерэю", - "@openGallery": {}, "removeFromSpace": "Выдаліць з прасторы", - "@removeFromSpace": {}, "start": "Пачаць", - "@start": {}, "pleaseEnterRecoveryKeyDescription": "Каб разблакіраваць вашы мінулыя паведамленні, калі ласка, увядзіце ключ аднаўлення, што быў згенерыраваны ў мінулай сесіі. Ключ аднаўлення гэта НЕ ваш пароль.", - "@pleaseEnterRecoveryKeyDescription": {}, "openChat": "Адкрыць чат", - "@openChat": {}, "markAsRead": "Адзначыць як прачытанае", - "@markAsRead": {}, "reportUser": "Паскардзіцца на карыстальніка", - "@reportUser": {}, "dismiss": "Адхіліць", - "@dismiss": {}, "reactedWith": "{sender} рэагуе з {reaction}", "@reactedWith": { "type": "String", @@ -1579,29 +1506,17 @@ } }, "pinMessage": "Прымацаваць да пакою", - "@pinMessage": {}, "confirmEventUnpin": "Вы ўпэўнены ў тым, што хаціце назаўсёды адмацаваць гэту падзею?", - "@confirmEventUnpin": {}, "emojis": "Эмодзі", - "@emojis": {}, "placeCall": "Здзейсніць выклік", - "@placeCall": {}, "voiceCall": "Галасавы выклік", - "@voiceCall": {}, "unsupportedAndroidVersion": "Непадтрымліваемая версія Android", - "@unsupportedAndroidVersion": {}, "unsupportedAndroidVersionLong": "Гэта функцыя патрабуе навейшай версіі Android. Калі ласка, праверце наяўнасць абнаўленняў ці падтрымку Linage OS.", - "@unsupportedAndroidVersionLong": {}, "videoCallsBetaWarning": "Звярніце ўвагу, што відэа выклікі знаходзяцца ў бэце. Яны могуць працаваць некарэктна ці не на ўсіх платформах.", - "@videoCallsBetaWarning": {}, "experimentalVideoCalls": "Эксперыментальныя відэа выклікі", - "@experimentalVideoCalls": {}, "youRejectedTheInvitation": "Вы скасавалі запрашэнне", - "@youRejectedTheInvitation": {}, "youJoinedTheChat": "Вы далучыліся да чату", - "@youJoinedTheChat": {}, "youAcceptedTheInvitation": "👍 Вы прынялі запрашэнне", - "@youAcceptedTheInvitation": {}, "youBannedUser": "Вы заблакіравалі {user}", "@youBannedUser": { "placeholders": { @@ -1675,25 +1590,15 @@ } }, "usersMustKnock": "Карыстальнікі абавязаны пагрукацца", - "@usersMustKnock": {}, "noOneCanJoin": "Ніхто не можа далучыцца", - "@noOneCanJoin": {}, "knock": "Пагрукацца", - "@knock": {}, "users": "Карыстальнікі", - "@users": {}, "unlockOldMessages": "Адкрыць старыя паведамленні", - "@unlockOldMessages": {}, "storeInSecureStorageDescription": "Захаваць код аднаўлення ў бяспечным месцы на прыладзе.", - "@storeInSecureStorageDescription": {}, "saveKeyManuallyDescription": "Захаваць гэты ключ самастойна, выклікам сістэмнага акна Падзяліцца ці праз буфер.", - "@saveKeyManuallyDescription": {}, "storeInAndroidKeystore": "Захаваць у Android KeyStore", - "@storeInAndroidKeystore": {}, "storeInAppleKeyChain": "Захаваць у Apple KeyChain", - "@storeInAppleKeyChain": {}, "storeSecurlyOnThisDevice": "Захаваць на гэтай прыладзе", - "@storeSecurlyOnThisDevice": {}, "countFiles": "{count} файлаў", "@countFiles": { "placeholders": { @@ -1703,29 +1608,17 @@ } }, "user": "Карыстальнік", - "@user": {}, "custom": "Карыстальніцкае", - "@custom": {}, "foregroundServiceRunning": "Гэта паведамленне з'явіцца, калі асноўныя службы запрацуюць.", - "@foregroundServiceRunning": {}, "screenSharingTitle": "падзяліцца экранам", - "@screenSharingTitle": {}, "screenSharingDetail": "Вы дзеліцеся экранам у FluffyChat", - "@screenSharingDetail": {}, "whyIsThisMessageEncrypted": "Чаму гэта паведамленне нельга прачытаць?", - "@whyIsThisMessageEncrypted": {}, "noKeyForThisMessage": "Гэта можа здарыцца з-за таго, што паведамленне было даслана да таго, як вы увайшлі ў уліковы запіс на гэтай прыладзе.\n\nТаксама верагодна, што адпраўшчык заблакіраваў вашу прыладу ці ў вас хібы з інтэрнэтам.\n\nВы можаце чытаць гэта паведамленне з іншага сеансу? Тад дашліце паведамленне адтуль! Перайдзіце ў Налады > Прылады і пераканайцеся ў тым, што вашы прылады верыфікавалі адна адну. Калі вы адкрыеце пакой наступны раз і абодве сэсіі будуць запушчаны, ключы павінны сінхранізавацца аўтаматычна.\n\nВы не хаціце згубіць клбчы, калі будзеце выходзіць ці змяняць прылады? Пераканайцеся ў тым, што вы уключылі рэзервовае капіраванне чатаў у наладах.", - "@noKeyForThisMessage": {}, "newGroup": "Новая група", - "@newGroup": {}, "newSpace": "Новая прастора", - "@newSpace": {}, "allSpaces": "Усе прасторы", - "@allSpaces": {}, "hidePresences": "Хаваць спіс статусаў?", - "@hidePresences": {}, "doNotShowAgain": "Не паказваць зноў", - "@doNotShowAgain": {}, "wasDirectChatDisplayName": "Пусты чат (быў {oldDisplayName})", "@wasDirectChatDisplayName": { "type": "String", @@ -1736,21 +1629,13 @@ } }, "newSpaceDescription": "Прасторы дазваляюць аб'ядноўваць вашы чаты і ствараць агульныя ці асобныя супольнасці.", - "@newSpaceDescription": {}, "encryptThisChat": "Шыфраваць гэты чат", - "@encryptThisChat": {}, "disableEncryptionWarning": "У мэтах бяспекі, вы не можаце адклбчауь шыфраванне ў гэтым чаце, дзе яно было ўключана.", - "@disableEncryptionWarning": {}, "sorryThatsNotPossible": "Прабачце... Гэта немагчыма", - "@sorryThatsNotPossible": {}, "deviceKeys": "Ключы прылад:", - "@deviceKeys": {}, "reopenChat": "Адкрыць чат зноў", - "@reopenChat": {}, "noBackupWarning": "Увага! Без уключэння рэзервовага капіравання чатаў, вы страціце доступ да вашых зашыфраваных паведамленняў. Настойліва рэкамендуецца уключыць фукнцыю да таго, як выйсці.", - "@noBackupWarning": {}, "noOtherDevicesFound": "Іншыя прылады не знойдзены", - "@noOtherDevicesFound": {}, "fileIsTooBigForServer": "Немагчыма даслаць! Сервер падтрымлівае файлы да {max}.", "@fileIsTooBigForServer": { "type": "String", @@ -1770,55 +1655,30 @@ } }, "jumpToLastReadMessage": "Перайсці да апошняга паведамлення", - "@jumpToLastReadMessage": {}, "readUpToHere": "Чытаць тут", - "@readUpToHere": {}, "jump": "Перайсці", - "@jump": {}, "openLinkInBrowser": "Адкрыць спасылку ў браўзеры", - "@openLinkInBrowser": {}, "reportErrorDescription": "😭 О не, штосьці пайшло не так. Калі жадаеце, можаце падаць справаздачу аб памылке распрауоўшчыкам.", - "@reportErrorDescription": {}, "report": "паскардзіцца", - "@report": {}, "manageAccount": "Кіраванне ўліковым запісам", - "@manageAccount": {}, "noContactInformationProvided": "Сервер не мае ніякай вернай кантактнай інфармацыі", - "@noContactInformationProvided": {}, "contactServerAdmin": "Звязацца з адміністратарам сервера", - "@contactServerAdmin": {}, "contactServerSecurity": "Звязацца з сервернай бяспекай", - "@contactServerSecurity": {}, "supportPage": "Падтрымка", - "@supportPage": {}, "serverInformation": "Серверная інфармацыя:", - "@serverInformation": {}, "name": "Імя", - "@name": {}, "version": "Версія", - "@version": {}, "website": "Сайт", - "@website": {}, "compress": "Сцісканне", - "@compress": {}, "boldText": "Цёмны", - "@boldText": {}, "italicText": "Курсіў", - "@italicText": {}, "strikeThrough": "Перакрэслены", - "@strikeThrough": {}, "pleaseFillOut": "Калі ласка, запоўніце", - "@pleaseFillOut": {}, "invalidUrl": "Няслушны url", - "@invalidUrl": {}, "addLink": "Дадаць спасылку", - "@addLink": {}, "unableToJoinChat": "Немагчыма далучыцца да чату. Магчыма, іншы бок ужо скончыў размову.", - "@unableToJoinChat": {}, "previous": "Мінулы", - "@previous": {}, "otherPartyNotLoggedIn": "Іншы бок зараз не увайшоў, таму не можа атрымліваць паведамленні!", - "@otherPartyNotLoggedIn": {}, "appWantsToUseForLogin": "Выкарыстоўваць '{server}' для ўвахода", "@appWantsToUseForLogin": { "type": "String", @@ -1829,75 +1689,40 @@ } }, "appWantsToUseForLoginDescription": "Тым самым, вы дазваляеце праграме і сайту дзяліцца інфармацыяй пра вас.", - "@appWantsToUseForLoginDescription": {}, "open": "Адкрыць", - "@open": {}, "waitingForServer": "Чаканне сервера...", - "@waitingForServer": {}, "newChatRequest": "📩 Запыт новага чату", - "@newChatRequest": {}, "contentNotificationSettings": "Налады паведамленняў кантэнту", - "@contentNotificationSettings": {}, "generalNotificationSettings": "Агульныя налады паведамленняў", - "@generalNotificationSettings": {}, "roomNotificationSettings": "Налады паведамленняў пакою", - "@roomNotificationSettings": {}, "userSpecificNotificationSettings": "Налады паведамленняў карыстальніка", - "@userSpecificNotificationSettings": {}, "otherNotificationSettings": "Іншыя налады паведамленняў", - "@otherNotificationSettings": {}, "notificationRuleContainsUserName": "Змяшчае імя карыстальніка", - "@notificationRuleContainsUserName": {}, "notificationRuleContainsUserNameDescription": "Паведамляе пра тое, што паведамленне мае імя карыстальніка.", - "@notificationRuleContainsUserNameDescription": {}, "notificationRuleMaster": "Заглушыць усе паведамленні", - "@notificationRuleMaster": {}, "notificationRuleMasterDescription": "Перазапісвае ўсе іншыя правілы і адключае паведамленні.", - "@notificationRuleMasterDescription": {}, "notificationRuleSuppressNotices": "Адключыць аўтаматычныя паведамленні", - "@notificationRuleSuppressNotices": {}, "notificationRuleSuppressNoticesDescription": "Адключыць паведамленні ад аўтаматызаваных кліентаў, накшталт ботаў.", - "@notificationRuleSuppressNoticesDescription": {}, "notificationRuleInviteForMe": "Запрашэнне мяне", - "@notificationRuleInviteForMe": {}, "notificationRuleInviteForMeDescription": "Паведамляе карыстальніка, калі яго запрашаюць у пакой.", - "@notificationRuleInviteForMeDescription": {}, "allDevices": "Усе прылады", - "@allDevices": {}, "crossVerifiedDevicesIfEnabled": "З перакрыжаваным спраўджваннем прылад, калі ўключана", - "@crossVerifiedDevicesIfEnabled": {}, "crossVerifiedDevices": "Перакрыжавана спраўджаныя прылады", - "@crossVerifiedDevices": {}, "verifiedDevicesOnly": "Толькі спраўджаныя прылады", - "@verifiedDevicesOnly": {}, "takeAPhoto": "Зрабіць здымак", - "@takeAPhoto": {}, "recordAVideo": "Запісаць відэа", - "@recordAVideo": {}, "optionalMessage": "(Апцыянальна) паведамленне...", - "@optionalMessage": {}, "notSupportedOnThisDevice": "Не падтрымліваецца на гэтай прыладзе", - "@notSupportedOnThisDevice": {}, "enterNewChat": "Увядзіце новы чат", - "@enterNewChat": {}, "approve": "Пацвердзіць", - "@approve": {}, "youHaveKnocked": "Вы былі выгнаны", - "@youHaveKnocked": {}, "pleaseWaitUntilInvited": "Калі ласка, пачакайце, пакуль хтосьці з пакою вас не запрасіць.", - "@pleaseWaitUntilInvited": {}, "commandHint_logout": "Выйсці з бягуяай прылады", - "@commandHint_logout": {}, "commandHint_logoutall": "Выйсці на ўсіх актыўных прыладах", - "@commandHint_logoutall": {}, "displayNavigationRail": "Паказваць навігацыйны след на тэлефоне", - "@displayNavigationRail": {}, "customReaction": "Карыстальніцкая рэакцыя", - "@customReaction": {}, "moreEvents": "Больш падзей", - "@moreEvents": {}, "declineInvitation": "Скасаваць запрашэнне", - "@declineInvitation": {}, "numUsersTyping": "{count} карыстальнікаў пішуць…", "@numUsersTyping": { "type": "String", @@ -1958,26 +1783,18 @@ "placeholders": {} }, "oneClientLoggedOut": "Адзін з вашых кліентаў выйшаў", - "@oneClientLoggedOut": {}, "addAccount": "Дадаць уліковы запіс", - "@addAccount": {}, "editBundlesForAccount": "Змяніць пакеты для гэтага ўліковага запісу", - "@editBundlesForAccount": {}, "addToBundle": "Дадаць у пакет", - "@addToBundle": {}, "removeFromBundle": "Выдаліць з пакета", - "@removeFromBundle": {}, "bundleName": "Назва пакета", - "@bundleName": {}, "openInMaps": "Адкрыць на картах", "@openInMaps": { "type": "String", "placeholders": {} }, "link": "Спасылка", - "@link": {}, "serverRequiresEmail": "Гэты сервер павінен спраўдзіць ваш email для рэгістрацыі.", - "@serverRequiresEmail": {}, "or": "Ці", "@or": { "type": "String", @@ -2009,9 +1826,7 @@ "placeholders": {} }, "overview": "Агляд", - "@overview": {}, "passwordRecoverySettings": "Налады скіду пароля", - "@passwordRecoverySettings": {}, "passwordRecovery": "Аднаўленне пароля", "@passwordRecovery": { "type": "String", @@ -2106,7 +1921,6 @@ } }, "directChat": "Асобны чат", - "@directChat": {}, "redactedByBecause": "Адрэдагавана {username}, прычына: \"{reason}\"", "@redactedByBecause": { "type": "String", @@ -2222,9 +2036,7 @@ "placeholders": {} }, "recoveryKey": "Ключ аднаўлення", - "@recoveryKey": {}, "recoveryKeyLost": "Ключ абнаўлення страчаны?", - "@recoveryKeyLost": {}, "send": "Даслаць", "@send": { "type": "String", @@ -2458,7 +2270,6 @@ } }, "unverified": "Не спраўджана", - "@unverified": {}, "verified": "Спраўджана", "@verified": { "type": "String", @@ -2490,19 +2301,12 @@ "placeholders": {} }, "verifyOtherUserDescription": "Калі вы спраўдзілі іншага карыстальніка, вы можаце быць упэўненым з кім вы сапраўды перапісваецеся.💪\n\nКалі вы пачнеце спраўджванне, вы і іншы карыстальнік, убачыце ўсплывальнае акно ў праграме. У ім вы ўбачыце некалькі эмодзі ці лічб, якія вы павінны параўнаць адзін з адным.\n\nЛепшы метад зрабіць гэта - пачаць відэа выклік. 👭", - "@verifyOtherUserDescription": {}, "pleaseEnterANumber": "Калі ласка, увядзіце лічбу большую за 0", - "@pleaseEnterANumber": {}, "verifyOtherDeviceDescription": "Калі вы спраўдзіце другую прыладу, яны абмяняюцца ключамі, якія ўзмоцняць вашу бяспеку. 💪 Калі вы пачнеце спраўджванне, у праграмах прылад з'явіцца ўсплывальнае паведамленне. Потым, вы ўбачыце некалькі эмодзі ці лічбаў, якія вы павінны параўнаць паміж сабой. Прасцей за ўсё гэта зрабіць, маючы дзве прылады побач. 🤳", - "@verifyOtherDeviceDescription": {}, "verifyOtherUser": "🔐 Спраўдзіць іншага карыстальніка", - "@verifyOtherUser": {}, "verifyOtherDevice": "🔐 Спраўдзіць іншую прыладу", - "@verifyOtherDevice": {}, "changeTheCanonicalRoomAlias": "Змяніць публічны адрас чату", - "@changeTheCanonicalRoomAlias": {}, "wrongRecoveryKey": "Прабачце... гэта не выглядае як ключ аднаўлення.", - "@wrongRecoveryKey": {}, "restoreSessionBody": "Праграма спрабуе аднавіць вашу сесію з рэзервовай копіі. Калі ласка, паведаміце пра памылку распрацоўшчыкам па спасылцы {url}. Паведамленне памылкі: {error}", "@restoreSessionBody": { "type": "String", @@ -2516,7 +2320,6 @@ } }, "longPressToRecordVoiceMessage": "Доўга цісніце, каб запісаць галасавое паведамленне.", - "@longPressToRecordVoiceMessage": {}, "visibilityOfTheChatHistory": "Бачнасць гісторыі чату", "@visibilityOfTheChatHistory": { "type": "String", @@ -2528,13 +2331,9 @@ "placeholders": {} }, "setColorTheme": "Каляровая схема:", - "@setColorTheme": {}, "invite": "Запрасіць", - "@invite": {}, "inviteGroupChat": "📨 Запрашэнне ў групавы чат", - "@inviteGroupChat": {}, "invalidInput": "Недапушчальны ўвод!", - "@invalidInput": {}, "wrongPinEntered": "Няверны пін-код! Паспрабуйце праз {seconds} секунд...", "@wrongPinEntered": { "type": "String", @@ -2545,29 +2344,17 @@ } }, "archiveRoomDescription": "Чат перамясціцца ў архіў. Іншыя карыстальнікі будуць бачыць гэта так, быццам вы выйшлі з чату.", - "@archiveRoomDescription": {}, "roomUpgradeDescription": "Чат будзе пераствораны з новай версіяй пакою. Усе ўдзельнікі будуць паведамлены пра неабходнасць перайсці ў новы чат. Вы можаце даведацца пра версіі пакояў тут: https://spec.matrix.org/latest/rooms/", - "@roomUpgradeDescription": {}, "removeDevicesDescription": "Вы выйдзеце з гэтай прылады і больш не будзеце атрымліваць паведамленні.", - "@removeDevicesDescription": {}, "sendTypingNotificationsDescription": "Іншыя ўдзельнікі чату могуць бачыць, калі вы пішаце новае паведамленне.", - "@sendTypingNotificationsDescription": {}, "continueText": "Працягнуць", - "@continueText": {}, "banUserDescription": "Карыстальнік будзе заблакіраваны з чату і больш не зможа ўвайсці, пакуль вы яго не разблакіруеце.", - "@banUserDescription": {}, "unbanUserDescription": "Карыстальнік зможа зноў далучыцца да чату.", - "@unbanUserDescription": {}, "kickUserDescription": "Карыстальнік будзе выгнаны, але не заблакіраваны. У публічных чатах, ён зможа далучыцца зноў у любы час.", - "@kickUserDescription": {}, "makeAdminDescription": "Калі вы зробіце карыстальніка адміністратарам, вы не зможаце адмяніць гэта дзеянне, бо ён будзе мець такія ж правы, як і вы.", - "@makeAdminDescription": {}, "pushNotificationsNotAvailable": "Пуш-паведамленні недаступны", - "@pushNotificationsNotAvailable": {}, "learnMore": "Даведацца больш", - "@learnMore": {}, "yourGlobalUserIdIs": "Ваш глабальны ID-карыстальніка: ", - "@yourGlobalUserIdIs": {}, "noUsersFoundWithQuery": "На жаль, мы не змаглі знайсці карыстальніка з імём \"{query}\". Калі ласка, праверце наяўнасць памылак.", "@noUsersFoundWithQuery": { "type": "String", @@ -2578,9 +2365,7 @@ } }, "knocking": "Грукацца", - "@knocking": {}, "knockRestricted": "Грук абмежаваны", - "@knockRestricted": {}, "spaceMemberOfCanKnock": "Удзельнікі прасторы з {spaces} могуць грукацца", "@spaceMemberOfCanKnock": { "type": "String", @@ -2600,51 +2385,28 @@ } }, "searchChatsRooms": "Пошук #чатаў, @карыстальнікаў...", - "@searchChatsRooms": {}, "nothingFound": "Нічога не знойдзена...", - "@nothingFound": {}, "groupName": "Назва групы", - "@groupName": {}, "createGroupAndInviteUsers": "Стварыць групу і запрасіць карыстальнікаў", - "@createGroupAndInviteUsers": {}, "groupCanBeFoundViaSearch": "Група можа быць знойдзена праз пошук", - "@groupCanBeFoundViaSearch": {}, "commandHint_sendraw": "Даслаць толькі json", - "@commandHint_sendraw": {}, "databaseMigrationTitle": "База даных аптымізавана", - "@databaseMigrationTitle": {}, "databaseMigrationBody": "Калі ласка, пачакайце. Гэта можа заняць некаторы час.", - "@databaseMigrationBody": {}, "leaveEmptyToClearStatus": "Пакіньце пустым, каб ачысціць свой статус.", - "@leaveEmptyToClearStatus": {}, "select": "Выбраць", - "@select": {}, "searchForUsers": "Пошук @карыстальнікаў...", - "@searchForUsers": {}, "pleaseEnterYourCurrentPassword": "Калі ласка, увядзіце свой бягучы пароль", - "@pleaseEnterYourCurrentPassword": {}, "newPassword": "Новы пароль", - "@newPassword": {}, "pleaseChooseAStrongPassword": "Калі ласка, падбярыце больш надзейны пароль", - "@pleaseChooseAStrongPassword": {}, "passwordsDoNotMatch": "Паролі не супадаюць", - "@passwordsDoNotMatch": {}, "passwordIsWrong": "Вы ўвялі няверны пароль", - "@passwordIsWrong": {}, "publicChatAddresses": "Публічныя адрасы чату", - "@publicChatAddresses": {}, "createNewAddress": "Стварыць новы адрас", - "@createNewAddress": {}, "joinSpace": "Далучыцца да прасторы", - "@joinSpace": {}, "publicSpaces": "Публічныя прасторы", - "@publicSpaces": {}, "addChatOrSubSpace": "Дадаць чат ці пад-прастору", - "@addChatOrSubSpace": {}, "thisDevice": "Гэта прылада:", - "@thisDevice": {}, "initAppError": "Адбылася памылка пры ініцыялізацыі праграмы", - "@initAppError": {}, "searchIn": "Пошук у чаце \"{chat}\"...", "@searchIn": { "type": "String", @@ -2655,11 +2417,8 @@ } }, "searchMore": "Шукаць яшчэ...", - "@searchMore": {}, "gallery": "Галерэя", - "@gallery": {}, "files": "Файлы", - "@files": {}, "sessionLostBody": "Ваш сеанс страчаны. Калі ласка, паведаміце пра гэта распрацоўшчыкам: {url}. Паведамленне памылкі: {error}", "@sessionLostBody": { "type": "String", @@ -2673,13 +2432,9 @@ } }, "sendReadReceipts": "Дасылаць адзнаку аб чытанні", - "@sendReadReceipts": {}, "sendReadReceiptsDescription": "Іншыя карыстальнікі чатаў будуць бачыць, калі вы прачыталі паведамленні.", - "@sendReadReceiptsDescription": {}, "formattedMessages": "Фармаціраваныя паведамленні", - "@formattedMessages": {}, "formattedMessagesDescription": "Адлюстроўваць пашыраныя паведамленні разметкай markdown.", - "@formattedMessagesDescription": {}, "acceptedKeyVerification": "{sender} прыняў(-ла) спраўджванне ключэй", "@acceptedKeyVerification": { "type": "String", @@ -2735,17 +2490,11 @@ } }, "transparent": "Празрысты", - "@transparent": {}, "incomingMessages": "Уваходныя паведамленні", - "@incomingMessages": {}, "stickers": "Стыкеры", - "@stickers": {}, "discover": "Даследаваць", - "@discover": {}, "commandHint_ignore": "Ігнараваць дадзены matrix ID", - "@commandHint_ignore": {}, "commandHint_unignore": "Перастаць ігнараваць дадзены matrix ID", - "@commandHint_unignore": {}, "unreadChatsInApp": "{appname}: {unread} непрачытаных чатаў", "@unreadChatsInApp": { "type": "String", @@ -2759,21 +2508,18 @@ } }, "noDatabaseEncryption": "Шыфраванне базы даных не падтрымліваецца гэтай платформай", - "@noDatabaseEncryption": {}, "thereAreCountUsersBlocked": "На гэты момант, {count} карыстальнікаў заблакіравана.", "@thereAreCountUsersBlocked": { "type": "String", "count": {} }, "restricted": "Абмежавана", - "@restricted": {}, "goToSpace": "Перайсці да прасторы: {space}", "@goToSpace": { "type": "String", "space": {} }, "markAsUnread": "Адзначыць як непрачытанае", - "@markAsUnread": {}, "userLevel": "{level} - Карыстальнік", "@userLevel": { "type": "String", @@ -2802,19 +2548,12 @@ } }, "changeGeneralChatSettings": "Змяніць агульныя налады чату", - "@changeGeneralChatSettings": {}, "inviteOtherUsers": "Запрасіць іншых карыстальнікаў у гэты чат", - "@inviteOtherUsers": {}, "changeTheChatPermissions": "Змяніць дазволы чату", - "@changeTheChatPermissions": {}, "changeTheVisibilityOfChatHistory": "Змяніць бачнасць гісторыі чату", - "@changeTheVisibilityOfChatHistory": {}, "sendRoomNotifications": "Дасылаць паведамленні @room", - "@sendRoomNotifications": {}, "changeTheDescriptionOfTheGroup": "Змяніць апісанне чату", - "@changeTheDescriptionOfTheGroup": {}, "chatPermissionsDescription": "Задаць узровень дазволаў, які неабходны для некаторых дзеянняў у чаце. Узроўні 0, 50 і 100 звычайна адлюстроўваюць карыстальнікаў, мадэратараў і адміністратараў, але любая градацыя магчыма.", - "@chatPermissionsDescription": {}, "updateInstalled": "🎉 Абнаўленне {version} усталявана!", "@updateInstalled": { "type": "String", @@ -2825,23 +2564,14 @@ } }, "changelog": "Спіс змен", - "@changelog": {}, "sendCanceled": "Адпраўка скасавана", - "@sendCanceled": {}, "loginWithMatrixId": "Увайсці з Matrix-ID", - "@loginWithMatrixId": {}, "doesNotSeemToBeAValidHomeserver": "Гэта не выглядае як дамашні сервер. Няслушны URL?", - "@doesNotSeemToBeAValidHomeserver": {}, "calculatingFileSize": "Вылічэнне памеру файла...", - "@calculatingFileSize": {}, "prepareSendingAttachment": "Падрыхтоўка адпраўкі прыкладання...", - "@prepareSendingAttachment": {}, "sendingAttachment": "Адпраўка прыкладання...", - "@sendingAttachment": {}, "generatingVideoThumbnail": "Стварэнне вокладкі відэа...", - "@generatingVideoThumbnail": {}, "compressVideo": "Сцісканне відэа...", - "@compressVideo": {}, "sendingAttachmentCountOfCount": "Адпраўляецца прыкладанне {index} з {length}...", "@sendingAttachmentCountOfCount": { "type": "integer", @@ -2864,81 +2594,43 @@ } }, "oneOfYourDevicesIsNotVerified": "Адна з вашых прылад не спраўджана", - "@oneOfYourDevicesIsNotVerified": {}, "noticeChatBackupDeviceVerification": "Заўвага: Калі вы падключыце ўсе свае прылады да рэзервовага капіравання, яны аўтаматычна спраўдзяцца.", - "@noticeChatBackupDeviceVerification": {}, "welcomeText": "Вітаначкі 👋 Гэта FluffyChat. Вы можаце ўвайсці на любы дамашні сервер, што сумяшчальны з https://matrix.org, а потым паразмаўляць з кім-небудзь. Гэта вялізная дэцэнтралізаваная сетка абмену паведамленнямі!", - "@welcomeText": {}, "blur": "Размыццё:", - "@blur": {}, "opacity": "Празрыстасць:", - "@opacity": {}, "setWallpaper": "Задаць шпалеры", - "@setWallpaper": {}, "notificationRuleMemberEvent": "Падзеі ўдзельніцтва", - "@notificationRuleMemberEvent": {}, "notificationRuleMemberEventDescription": "Спыніць усе паведамленні пра ўдзельніцтва.", - "@notificationRuleMemberEventDescription": {}, "notificationRuleIsUserMention": "Згадванні карыстальніка", - "@notificationRuleIsUserMention": {}, "notificationRuleIsUserMentionDescription": "Паведамляе, калі карыстальніка згадалі ў паведамленні.", - "@notificationRuleIsUserMentionDescription": {}, "notificationRuleContainsDisplayName": "Мае адлюстроўваемае імя", - "@notificationRuleContainsDisplayName": {}, "notificationRuleContainsDisplayNameDescription": "Паведамляе, калі паведамленне мае іх адлюстроўваемае імя.", - "@notificationRuleContainsDisplayNameDescription": {}, "notificationRuleIsRoomMention": "Згадванні пакою", - "@notificationRuleIsRoomMention": {}, "notificationRuleIsRoomMentionDescription": "Паведамляе карыстальніка, калі згадваюць пакой.", - "@notificationRuleIsRoomMentionDescription": {}, "notificationRuleRoomnotif": "Паведамленні пакою", - "@notificationRuleRoomnotif": {}, "notificationRuleRoomnotifDescription": "Паведамляе пра згадванні '@room'.", - "@notificationRuleRoomnotifDescription": {}, "notificationRuleTombstone": "Помнік", - "@notificationRuleTombstone": {}, "notificationRuleTombstoneDescription": "Паведамляе пра дэактывацыю пакою.", - "@notificationRuleTombstoneDescription": {}, "notificationRuleReaction": "Рэакцыя", - "@notificationRuleReaction": {}, "notificationRuleReactionDescription": "Адключыць усе паведамленні пра рэакцыі.", - "@notificationRuleReactionDescription": {}, "notificationRuleRoomServerAcl": "ACL сервера пакою", - "@notificationRuleRoomServerAcl": {}, "notificationRuleRoomServerAclDescription": "Адключыць паведамленні пра серверныя спісы кантролю пакою (ACL).", - "@notificationRuleRoomServerAclDescription": {}, "notificationRuleSuppressEdits": "Заглушыць змены", - "@notificationRuleSuppressEdits": {}, "notificationRuleSuppressEditsDescription": "Заглушыць паведамленні пра адрэдагаваныя паведамленні.", - "@notificationRuleSuppressEditsDescription": {}, "notificationRuleCall": "Выклік", - "@notificationRuleCall": {}, "notificationRuleCallDescription": "Паведамляе пра выклікі.", - "@notificationRuleCallDescription": {}, "notificationRuleEncryptedRoomOneToOne": "Шыфраваны пакой One-to-One", - "@notificationRuleEncryptedRoomOneToOne": {}, "notificationRuleEncryptedRoomOneToOneDescription": "Паведамляе пра паведамленні ў шыфраваных one-to-one пакоях.", - "@notificationRuleEncryptedRoomOneToOneDescription": {}, "notificationRuleRoomOneToOne": "Пакой One-to-One", - "@notificationRuleRoomOneToOne": {}, "notificationRuleRoomOneToOneDescription": "Паведамляе пра паведамленні ў пакоях one-to-one.", - "@notificationRuleRoomOneToOneDescription": {}, "notificationRuleMessage": "Паведамленне", - "@notificationRuleMessage": {}, "notificationRuleMessageDescription": "Паведамляе пра звычайныя паведамленні.", - "@notificationRuleMessageDescription": {}, "notificationRuleEncrypted": "Зашыфравана", - "@notificationRuleEncrypted": {}, "notificationRuleEncryptedDescription": "Паведамляе пра паведамленні ў зашыфраваных пакоях.", - "@notificationRuleEncryptedDescription": {}, "notificationRuleJitsi": "Jitsi", - "@notificationRuleJitsi": {}, "notificationRuleJitsiDescription": "Паведамляе пра падзеі віджэту Jitsi.", - "@notificationRuleJitsiDescription": {}, "notificationRuleServerAcl": "Заглушыць серверныя падзеі ACL", - "@notificationRuleServerAcl": {}, "notificationRuleServerAclDescription": "Заглушыць паведамленні пра серверныя падзеі ACL.", - "@notificationRuleServerAclDescription": {}, "unknownPushRule": "Невядомае правіла пуша '{rule}'", "@unknownPushRule": { "type": "String", @@ -2961,19 +2653,12 @@ } }, "deletePushRuleCanNotBeUndone": "Калі вы выдаліце гэтыя налады паведамленняў, гэта не можа быць адменена.", - "@deletePushRuleCanNotBeUndone": {}, "more": "Больш", - "@more": {}, "shareKeysWith": "Падзяліцца ключамі з...", - "@shareKeysWith": {}, "shareKeysWithDescription": "Якім прыладам вы давяраеце настолькі, каб яны маглі чытаць вашыя зашыфраваныя паведамленні?", - "@shareKeysWithDescription": {}, "pause": "Паўза", - "@pause": {}, "resume": "Працягнуць", - "@resume": {}, "removeFromSpaceDescription": "Гэты чат будзе выдалены з прасторы, але з'явіцца ў вашым спісе чатаў.", - "@removeFromSpaceDescription": {}, "countChats": "{chats} чатаў", "@countChats": { "type": "String", @@ -3002,23 +2687,14 @@ } }, "poll": "Апытанне", - "@poll": {}, "startPoll": "Пачаць апытанне", - "@startPoll": {}, "endPoll": "Скончыць апытанне", - "@endPoll": {}, "answersVisible": "Адказы бачны", - "@answersVisible": {}, "pollQuestion": "Пытанне апытання", - "@pollQuestion": {}, "answerOption": "Варыянт адказу", - "@answerOption": {}, "addAnswerOption": "Дадаць варыянт адказу", - "@addAnswerOption": {}, "allowMultipleAnswers": "Дазволіць некалькі адказаў", - "@allowMultipleAnswers": {}, "pollHasBeenEnded": "Апытанне было скончана", - "@pollHasBeenEnded": {}, "countVotes": "{count, plural, =1{Адзін голас} other{{count} галасы(-оў)}}", "@countVotes": { "type": "int", @@ -3029,9 +2705,7 @@ } }, "answersWillBeVisibleWhenPollHasEnded": "Вынікі будуць бачны, калі апытанне скончыцца", - "@answersWillBeVisibleWhenPollHasEnded": {}, "replyInThread": "Адказаць у гутарку", - "@replyInThread": {}, "countReplies": "{count, plural, =1{Адзін адказ} other{{count} адказа(-ў)}}", "@countReplies": { "type": "int", @@ -3042,31 +2716,84 @@ } }, "thread": "Гутарка", - "@thread": {}, "backToMainChat": "Вярнуцца ў галоўны чат", - "@backToMainChat": {}, "saveChanges": "Захаваць змены", - "@saveChanges": {}, "createSticker": "Стварыць стыкер ці эмадзі", - "@createSticker": {}, "useAsSticker": "Ужыць як стыкер", - "@useAsSticker": {}, "useAsEmoji": "Ужыць як эмадзі", - "@useAsEmoji": {}, "stickerPackNameAlreadyExists": "Назва набору стыкераў ужо існуе", - "@stickerPackNameAlreadyExists": {}, "newStickerPack": "Новы набор стыкераў", - "@newStickerPack": {}, "stickerPackName": "Назва набору стыкераў", - "@stickerPackName": {}, "attribution": "Атрыбуцыя", - "@attribution": {}, "skipChatBackup": "Прапусціць рэзервовае капіраванне чатаў", - "@skipChatBackup": {}, "skipChatBackupWarning": "Вы ўпэўнены? Без наладжвання рэзервовага капіравання чатаў, вы можаце згубіць доступ да ўсіх вашых чатаў, калі вы зменіце прыладу.", - "@skipChatBackupWarning": {}, "loadingMessages": "Загрузка паведамленняў", - "@loadingMessages": {}, "setupChatBackup": "Наладзіць рэзервовае капіраванне чатаў", - "@setupChatBackup": {} -} \ No newline at end of file + "changedTheChatDescription": "{username} змяніў апісанне чата", + "changedTheChatName": "{username} змяніў назву чата", + "noMoreResultsFound": "Нічога не знойдзена", + "chatSearchedUntil": "Пошук у чаце да {time}", + "@chatSearchedUntil": { + "type": "String", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "federationBaseUrl": "Асноўны URL федэрацыі", + "clientWellKnownInformation": "Client-Well-Known інфармацыя:", + "baseUrl": "Базавы URL", + "identityServer": "Сервер профілей:", + "versionWithNumber": "Версія: {version}", + "@versionWithNumber": { + "type": "String", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "logs": "Логі", + "advancedConfigs": "Пашыраныя налады", + "advancedConfigurations": "Пашыраная канфігурацыя", + "signIn": "Увайсці", + "createNewAccount": "Стварыць новы ўліковы запіс", + "signUpGreeting": "FluffyChat дэцэнтралізаваны! Выберыце свой сервер, дзе вы хаціце стварыць уліковы запіс і прайягвайце!", + "signInGreeting": "Вы ўжо маеце ўліковы запіс у Matrix? З вяртаннем! Выберыце свой хатні сервер і аўтарызуйцеся.", + "appIntro": "З дапамогай FluffyChat вы можаце размаўляць з вашымі сябрамі. Гэта бяспечны дэцэнтралізаваны [matrix] мэнэджэр! Даведайцеся больш на https://matrix.org, калі хаціце ці проста ўвайдзіце.", + "theProcessWasCanceled": "Працэс быў скасаваны.", + "join": "Далучыцца", + "searchOrEnterHomeserverAddress": "Пашукайце ці ўвядзіце адрас хатняга сервера", + "matrixId": "Matrix ID", + "setPowerLevel": "Прызначыць узровень магчымасцей", + "makeModerator": "Прызначыць мадэратарам", + "makeAdmin": "Прызначыць адміністратарам", + "removeModeratorRights": "Адабраць правы мадэратара", + "removeAdminRights": "Прыбраць адміністратарскія правы", + "powerLevel": "Узровень дазволаў", + "setPowerLevelDescription": "Узровень дазволаў вызначае, што ўдзельнік можа рабіць у пакое і звычайна знаходзіцца паміж 0 і 100.", + "owner": "Уладальнік", + "mute": "Сцішыць", + "@mute": { + "description": "This should be a very short string because there is not much space in the button!" + }, + "createNewChat": "Стварыць новы чат", + "reset": "Скінуць", + "supportFluffyChat": "Падтрымаць FluffyChat", + "support": "Падтрымаць", + "fluffyChatSupportBannerMessage": "FluffyChat патрэбна ВАША дапамога!\n❤️❤️❤️\nFluffyChat будзе заўсёды бясплатным, bале распрацоўка і арэнда сервероў мае свой кошт.\nБудучыня праекту залежыць ад падтрымкі людзей як вы.", + "skipSupportingFluffyChat": "Прапусціць падтрымку FluffyChat", + "iDoNotWantToSupport": "Я не хачу падтрымаць", + "iAlreadySupportFluffyChat": "Я ўжо падтрымаў FluffyChat", + "setLowPriority": "Прызначыць нізкі прыярытэт", + "unsetLowPriority": "Скасаваць нізкі прыярытэт", + "removeCallFromChat": "Прыбраць выклік з чату", + "removeCallFromChatDescription": "Вы хаціце прыбраць выклік з чату для ўсіх удзельнікаў?", + "removeCallForEveryone": "Прыбраць выклікі для ўсіх", + "startVoiceCall": "Пачаць галасавы выклік", + "startVideoCall": "Пачаць відэа-выклік", + "joinVoiceCall": "Далучыцца да галасавога выкліка", + "joinVideoCall": "Далучыцца да відэа-выкліка", + "live": "Трансляцыя" +}