Merge commit 'cafd639c24dbcd2398271845aefbade283a8f279' into yiffed

This commit is contained in:
Inex Code 2020-10-03 21:36:17 +03:00
commit 16df5c123d
175 changed files with 25339 additions and 14446 deletions

2
.gitignore vendored
View file

@ -45,3 +45,5 @@ lib/generated_plugin_registrant.dart
/key.jks /key.jks
/android/key.properties /android/key.properties
**/android/app/.cxx **/android/app/.cxx
android/key.jks
lib/l10n_old

View file

@ -36,9 +36,10 @@ build_web:
- cd web/ && curl -L 'https://github.com/sql-js/sql.js/releases/latest/download/sqljs-wasm.zip' > sqljs-wasm.zip && cd ../ - cd web/ && curl -L 'https://github.com/sql-js/sql.js/releases/latest/download/sqljs-wasm.zip' > sqljs-wasm.zip && cd ../
- cd web/ && unzip sqljs-wasm.zip && cd ../ - cd web/ && unzip sqljs-wasm.zip && cd ../
- cd web/ && rm sqljs-wasm.zip && cd ../ - cd web/ && rm sqljs-wasm.zip && cd ../
- flutter pub get
- flutter clean - flutter clean
- flutter build web --release --verbose --dart-define=FLUTTER_WEB_USE_SKIA=true - flutter pub get
- flutter build web --release --verbose
# upload elsewhere, if wanted
artifacts: artifacts:
paths: paths:
- build/web/ - build/web/
@ -54,7 +55,7 @@ build_android_debug:
paths: paths:
- build/app/outputs/apk/debug/app-debug.apk - build/app/outputs/apk/debug/app-debug.apk
except: except:
- master - main
build_android_apk: build_android_apk:
@ -66,13 +67,16 @@ build_android_apk:
- cd android && echo "keyAlias=key" >> key.properties && cd .. - cd android && echo "keyAlias=key" >> key.properties && cd ..
- cd android && echo "storeFile=../key.jks" >> key.properties && cd .. - cd android && echo "storeFile=../key.jks" >> key.properties && cd ..
- cd android/app && echo $GOOGLE_SERVICES >> google-services.json && cd ../.. - cd android/app && echo $GOOGLE_SERVICES >> google-services.json && cd ../..
- flutter pub get
- flutter build apk --release - flutter build apk --release
- mkdir -p build/android
- cp build/app/outputs/apk/release/app-release.apk build/android/
artifacts: artifacts:
when: on_success when: on_success
paths: paths:
- build/app/outputs/apk/release/app-release.apk - build/android/app-release.apk
only: only:
- master - main
- tags - tags
@ -86,12 +90,15 @@ build_android_appbundle:
- cd android && echo "storeFile=../key.jks" >> key.properties && cd .. - cd android && echo "storeFile=../key.jks" >> key.properties && cd ..
- cd android/app && echo $GOOGLE_SERVICES >> google-services.json && cd ../.. - cd android/app && echo $GOOGLE_SERVICES >> google-services.json && cd ../..
- flutter build appbundle --target-platform android-arm,android-arm64,android-x64 - flutter build appbundle --target-platform android-arm,android-arm64,android-x64
- mkdir -p build/android
- cp build/app/outputs/bundle/release/app-release.aab build/android/
artifacts: artifacts:
when: on_success when: on_success
paths: paths:
- build/app/outputs/bundle/release/app-release.aab - build/android/app-release.aab
only: only:
- master - main
upload_to_fdroid_repo: upload_to_fdroid_repo:
stage: publish stage: publish
@ -105,17 +112,24 @@ upload_to_fdroid_repo:
## ##
- 'which rsync || (sudo apt-get update -y && sudo apt-get install rsync -y )' - 'which rsync || (sudo apt-get update -y && sudo apt-get install rsync -y )'
## ##
## Install pcregrep if not already installed.
##
- 'which pcregrep || (sudo apt-get update -y && sudo apt-get install pcregrep -y )'
##
## Run ssh-agent (inside the build environment) ## Run ssh-agent (inside the build environment)
## ##
- eval $(ssh-agent -s) - eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh - mkdir -p ~/.ssh
- chmod 700 ~/.ssh - chmod 700 ~/.ssh
- ssh-keyscan -t rsa fdroid.nordgedanken.dev >> ~/.ssh/known_hosts
script: script:
- export UPDATE_VERSION=$(pcregrep -o1 'version:\\s([0-9]*\\.[0-9]*\\.[0-9]*)\\+[0-9]*' pubspec.yaml) - mkdir -p upload
- mv app-release.apk "${UPDATE_VERSION}.apk" - cp build/android/* upload/
- cd build/app/outputs/apk/release/ && rsync -rav -e ssh ./ fluffy@fdroid.nordgedanken.dev:/fdroid/repo - cd build/android/
- ssh fluffy@fdroid.nordgedanken.dev "cd fdroid && fdroid update" - export UPDATE_VERSION=$(pcregrep -o1 'version:\\s([0-9]*\\.[0-9]*\\.[0-9]*)\\+[0-9]*' pubspec.yaml) && mv app-release.apk "${UPDATE_VERSION}.apk"
- rsync -rav -e ssh ./ fluffy@fdroid.nordgedanken.dev:/fdroid/repo
- ssh fluffy@fdroid.nordgedanken.dev "cd fdroid && mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc && fdroid update"
dependencies: dependencies:
- build_android_apk - build_android_apk
only: only:
@ -138,4 +152,4 @@ pages:
paths: paths:
- public - public
only: only:
- master - main

View file

@ -1,11 +1,73 @@
# Version 0.16.0 - 2020-07-?? # Version 0.20.0 - 2020-??-??
### Features
- Add ability to enable / disable emotes globally
- Add ability to manage emote packs with different state keys
# Version 0.19.0 - 2020-09-21
### Features
- Implemented ignore list
- Jump to events in timeline: When tapping on a reply and when tapping a matrix.to link
- Display messages with up to 10 emotes or emoji bigger
- New design for the chat list and message bubbles
- Implement reactions
- Implement password change
- Implement deactivate user account
### Fixes
- Timeline randomly resorting while more history is being fetched
- Automatically request history if the "load more" button is on the screen
# Version 0.18.0 - 2020-09-13
### Features
- Added translations: Armenian, Turkish, Chinese (Simplified), Estonian
- Url-ify matrix identifiers
- Use server-side generated thumbnails in cleartext rooms
- Add option to send images in their original resolution
- Add additional confirmation for sending files & share intents
- Add option to opt-in to report issues / crashes to sentry
- Write keys to online key backup, fully implementing online key backup
### Changes
- Tapping links, pills, etc. now does stuff
- Better handling of sending messages in bad network
- Better recovery of "keys not cached"
### Fixes:
- Various html rendering and url-ifying fixes
- Added support for blurhashes
- Image viewer now eventually displays the original image, not only the thumbnail
# Version 0.17.0 - 2020-08-31
### Features
- Pin and unpin chats
- Implement event aggregations
- Implement message edits
- Render reactions
- Add / Remove reactions by tapping on existing reactions
### Fixes:
- Don't re-render the room list nearly as often, increasing performance
- Various fixes for sending messages on bad networks
- Design tweeks and fixes
- Various performance fixes and improvements
# Version 0.16.0 - 2020-07-24
### Features ### Features
- Implement web notifications - Implement web notifications
- Implement a connection status header
### Changes ### Changes
- Various performance improvements - Switch out database engine for faster performance
- Added languages: Galician, Croatian, Japanese, Russian - Greatly improve startup time
- Added languages: Galician, Croatian, Japanese, Russian, Ukrainian - Thanks a lot to all the weblate users!
- Only show the microg toast once, if you have play services disabled
- Homeserver URL input now strips trailing whitespace and slash - Thanks @kate_shine
- Also use prev_content to determine profile of a user: This allows the username and avatar of people who left a group to still be displayed
### Fixes: ### Fixes:
- Various fixes, including key verification fixes - Fix not being able to initiate key verification properly
- Fix message sending being weird on slow networks
- Fix a few HTML rendering bugs
- Various other fixes
- Fix the 12h clock showing 00:15am, instead of 12:15am - Thanks @not_chicken
- Fix an issue with replies and invalid HTML
- Fix messages getting lost when retrieving chat history
- Fix a bug where an incorrect string encoding from the server is assumed
- Fix a bug where people couldn't log in if they had email notifications enabled
# Version 0.15.1 - 2020-06-26 # Version 0.15.1 - 2020-06-26
### Fixes: ### Fixes:

View file

@ -1,49 +1,97 @@
<span style="font-family:'Open Sans';font-size:31px;color:#24292e;">**Understand how your data is used**</span> # Privacy
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">The Matrix protocol is designed with your privacy and data sovereignty in mind. Because it is a decentralised, federated service with cryptographically-validated message integrity, there are a few important things to know before you use the Service.</span> FluffyChat is available on Android, iOS and as a web version. Desktop versions for Windows, Linux and macOS may follow.
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">This app can communicate with any matrix homeserver which supports the matrix specification by the homeserver. The user is free to choose the homeserver and has to accept the privacy policy of this homeserver before using it.</span> * [Matrix](#1)
* [Sentry](#2)
* [Database](#3)
* [Encryption](#4)
* [App Permissions](#5)
* [Push Notifications](#6)
<span style="font-family:'Open Sans';font-size:23px;color:#24292e;">**Federation**</span> ## Matrix<a id="1"/>
FluffyChat uses the Matrix protocol. This means that FluffyChat is just a client that can be connected to any compatible matrix server. The respective data protection agreement of the server selected by the user then applies.
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">Services using the Matrix protocol rely on Matrix homeservers which share user data with the wider ecosystem over federation.</span> For convenience, one or more servers are set as default that the FluffyChat developers consider trustworthy. The developers of FluffyChat do not guarantee their trustworthiness. Before the first communication, users are informed which server they are connecting to.
* <span style="font-family:'Open Sans';font-size:14px;color:#24292e;">When you send messages or files in a room, a copy of the data is sent to all participants in the room. If these participants are registered on remote homeservers, your username, display name, messages and files may be replicated across each participating h</span><span style="font-family:'Open Sans';font-size:14px;color:#24292e;">omeserver.</span> FluffyChat only communicates with the selected server and with sentry.io if enabled.
* <span style="font-family:'Open Sans';font-size:14px;color:#24292e;">We will forget your copy of your data upon your request. We will also forward your request onto federated homeservers. However - these homeservers are outside our span of control, so we cannot guarantee they will forget your data.</span> More information is available at: [https://matrix.org](https://matrix.org)
* <span style="font-family:'Open Sans';font-size:14px;color:#24292e;">Federated homeservers can be located anywhere in the world, and are subject to local laws and regulations.</span> ## Sentry<a id="2"/>
FluffyChat uses Sentry for crash reports if the user allows it.
<span style="font-family:'Open Sans';font-size:23px;color:#24292e;">**Bridging**</span> More information is available at: [https://sentry.io](https://sentry.io)
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">Some Matrix rooms are bridged to third-party services, such as IRC networks, twitter or email. When a room has been bridged, your messages and media may be copied onto the bridged service.</span> ## Database<a id="3"/>
FluffyChat caches some data received from the server in a local database on the device of the user.
* <span style="font-family:'Open Sans';font-size:14px;color:#24292e;">It may not be technically possible to support your management of your data once it has been copied onto a bridged service.</span> More information is available at: [https://pub.dev/packages/moor](https://pub.dev/packages/moor)
* <span style="font-family:'Open Sans';font-size:14px;color:#24292e;">Bridged services can be located anywhere in the world, and are subject to local laws and regulations.</span> ## Encryption<a id="4"/>
All communication of substantive content between Fluffychat and any server is done in secure way, using transport encryption to protect it.
<span style="font-family:'Open Sans';font-size:19px;color:#24292e;">**Integration Services (Bots and Widgets)**</span> FluffyChat is able to use End-To-End-Encryption as a tech preview.
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">The homeserver the user is using may provide a range of integrations in the form of Widgets (web applications accessed as part of the Matrix Client webapp) and Bots (automated participants in rooms). Bots and Widgets have access to the messages and files in rooms in</span><span style="font-family:'Open Sans';font-size:14px;color:#24292e;"> which they participate.</span> ## App Permissions<a id="5"/>
<span style="font-family:'Open Sans';font-size:23px;color:#24292e;">**Forgetting your Data**</span> The permissions are the same on Android and iOS but may differ in the name. This are the Android Permissions:
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">You can request that we forget your data if you deactivate your account. Each user in a Matrix conversation receives their own copy of all messages and files in that conversation (similar to email), so we ensure data is forgotten by ensuring that your data</span><span style="font-family:'Open Sans';font-size:14px;color:#24292e;"> is not shared further and is not visible to future users. Once all users copies have been forgotten the messages and files will be deleted from the homeserver database. For full details, please see the </span>[<span style="font-family:'Open Sans';font-size:14px;color:#0000ee;"><u>full privacy notice</u></span>](https://matrix.org/legal/privacy-notice/ "https://matrix.org/legal/privacy-notice/")<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">.</span> #### Internet Access
FluffyChat needs to have internet access to communicate with the Matrix Server.
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">If you remove (redact) a message, the message content will no longer be accessible to users. Redactions only remove message content, your display name and avatar - your username will still be visible. Federated homeservers and some matrix clients may not h</span><span style="font-family:'Open Sans';font-size:14px;color:#24292e;">onour the redaction request.</span> #### Vibrate
FluffyChat uses vibration for local notifications. More informations about this are at the used package:
[https://pub.dev/packages/flutter_local_notifications](https://pub.dev/packages/flutter_local_notifications)
<span style="font-family:'Open Sans';font-size:23px;color:#24292e;">**Legal Basis for Processing**</span> #### Record Audio
FluffyChat can send voice messages in a chat and therefore needs to have the permission to record audio.
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">New Vector processes your data under Legitimate Interest. This means that we process your data only as necessary to deliver the Service, and in a manner that you understand and expect.</span> #### Write External Storage
The user is able to save received files and therefore app needs this permission.
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">The Legitimate Interest of our Service is the provision of decentralised, openly-federated and (optionally) end-to-end encrypted communication services. The processing of user data we undertake is necessary to provide the Service. The nature of the Service</span><span style="font-family:'Open Sans';font-size:14px;color:#24292e;"> and its implementation results in some caveats concerning this processing, particularly in terms of GDPR Article 17 Right to Erasure (Right to be Forgotten). We believe these caveats are in line with the broader societal interests served by providing the </span><span style="font-family:'Open Sans';font-size:14px;color:#24292e;">Service. These caveats are discussed in detail in the full privacy notice, but the most important restriction is that your username will still be publicly associated with rooms in which you have participated even if you deactivate your account and ask us t</span><span style="font-family:'Open Sans';font-size:14px;color:#24292e;">o forget your data.</span> #### Read External Storage
The user is able to send files from the device's file system.
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">In situations where the interests of the individual appear to be in conflict with the broader societal interests, we will seek to reconcile those differences in accordance with our policy.</span> ## Push Notifications<a id="6"/>
FluffyChat uses the Firebase Cloud Messaging service for push notifications on Android and iOS. This takes place in the following steps:
1. The matrix server sends the push notification to the FluffyChat Push Gateway
2. The FluffyChat Push Gateway forwards the message in a different format to Firebase Cloud Messaging
3. Firebase Cloud Messaging waits until the user's device is online again
4. The device receives the push notification from Firebase Cloud Messaging and displays it as a notification
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">If any of the above are unacceptable to you, </span><span style="font-family:'Open Sans';font-size:14px;color:#24292e;">**please do not use the Service.**</span> The source code of the push gateway can be viewed here:
[https://gitlab.com/famedly/services/famedly-push-gateway](https://gitlab.com/famedly/services/famedly-push-gateway)
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">Please review the </span>[<span style="font-family:'Open Sans';font-size:14px;color:#0000ee;"><u>full privacy notice</u></span>](https://matrix.org/legal/privacy-notice/ "https://matrix.org/legal/privacy-notice/")<span style="font-family:'Open Sans';font-size:14px;color:#24292e;"> and </span>[<span style="font-family:'Open Sans';font-size:14px;color:#0000ee;"><u>code of conduct</u></span>](https://matrix.org/legal/code-of-conduct/ "https://matrix.org/legal/code-of-conduct/")<span style="font-family:'Open Sans';font-size:14px;color:#24292e;"> before using this Service.</span> `event_id_only` is used as the format for the push notification. A typical push notification therefore only contains:
- Event ID
- Room ID
- Unread Count
- Information about the device that is to receive the message
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">Please review the </span>[<span style="font-family:'Open Sans';font-size:14px;color:#0000ee;"><u>terms and conditions</u></span>](https://matrix.org/legal/terms-and-conditions/ "https://matrix.org/legal/terms-and-conditions/")<span style="font-family:'Open Sans';font-size:14px;color:#24292e;"> before using this Service.</span> A typical push notification could look like this:
```
{
"notification": {
"event_id": "$3957tyerfgewrf384",
"room_id": "!slw48wfj34rtnrf:example.com",
"counts": {
"unread": 2,
"missed_calls": 1
},
"devices": [
{
"app_id": "chat.fluffy.fluffychat",
"pushkey": "V2h5IG9uIGVhcnRoIGRpZCB5b3UgZGVjb2RlIHRoaXM/",
"pushkey_ts": 12345678,
"data": {},
"tweaks": {
"sound": "bing"
}
}
]
}
}
```
<span style="font-family:'Open Sans';font-size:14px;color:#24292e;">You must be at least 16 years old to use this Service.</span> FluffyChat sets the `event_id_only` flag at the Matrix Server. This server is then responsible to send the correct data.

View file

@ -5,6 +5,7 @@ An experimental fork of FluffyChat.
# Features # Features
* Single and group chats * Single and group chats
* Send images and files * Send images and files
* Voice messages
* Offline chat history * Offline chat history
* Push Notifications * Push Notifications
* Account settings * Account settings
@ -18,6 +19,9 @@ An experimental fork of FluffyChat.
* Archived chats * Archived chats
* Discover public chats on the user's homeserver * Discover public chats on the user's homeserver
* Registration * Registration
* Disable account
* Change password
* End-To-End-Encryption
## How to build ## How to build
@ -75,25 +79,40 @@ with a method call:
``` ```
Text(L10n.of(context).helloWorld), Text(L10n.of(context).helloWorld),
``` ```
And add the method to `/lib/l10n/l10n.dart`:
and add the following import if missing:
``` ```
String get helloWorld => Intl.message('Hello world'); import 'package:flutter_gen/gen_l10n/l10n.dart';
``` ```
2. Add the string to the .arb files with this command: 2. Add the string to `/lib/l10n/l10n_en.arb`:
(The following example need to be sorounded by the usual json `{}` and after the `@@locale` key)
Example A:
``` ```
flutter pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/l10n/l10n.dart "helloWorld": "Hello World!",
"@helloWorld": {
"description": "The conventional newborn programmer greeting"
}
``` ```
3. Copy the new translation objects from `/lib/l10n/intl_message.arb` to `/lib/l10n/intl_<yourlanguage>.arb` and translate it or create a new file for your language by copying `intl_message.arb`. Example B:
4. Update the translations with this command:
``` ```
flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading lib/l10n/l10n.dart lib/l10n/intl_*.arb "hello": "Hello {userName}",
"@hello": {
"description": "A message with a single parameter",
"placeholders": {
"userName": {
"type": “String”,
“example”: “Bob”
}
}
}
``` ```
5. Make sure your language is in `supportedLocales` in `/lib/main.dart` and in the List at `https://gitlab.com/ChristianPauly/fluffychat-flutter/-/blob/master/lib/l10n/l10n.dart#L11`. 3. For testing just run a regular build without extras
# Special thanks to # Special thanks to

Binary file not shown.

View file

@ -1 +1 @@
6c5611b14df049743797687d0807922a 8ccc4b539b008db59a45e66a3eaa417e

View file

@ -33,48 +33,46 @@ PODS:
- file_picker (0.0.1): - file_picker (0.0.1):
- DKImagePickerController/PhotoGallery - DKImagePickerController/PhotoGallery
- Flutter - Flutter
- Firebase/Core (6.27.0): - Firebase/CoreOnly (6.26.0):
- FirebaseCore (= 6.7.2)
- Firebase/Messaging (6.26.0):
- Firebase/CoreOnly - Firebase/CoreOnly
- FirebaseAnalytics (= 6.6.1) - FirebaseMessaging (~> 4.4.1)
- Firebase/CoreOnly (6.27.0): - firebase_core (0.5.0):
- FirebaseCore (= 6.8.0) - Firebase/CoreOnly (~> 6.26.0)
- Firebase/Messaging (6.27.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 4.5.0)
- firebase_messaging (0.0.1):
- Firebase/Core
- Firebase/Messaging
- Flutter - Flutter
- FirebaseAnalytics (6.6.1): - firebase_core_web (0.1.0):
- FirebaseCore (~> 6.8) - Flutter
- FirebaseInstallations (~> 1.4) - firebase_messaging (7.0.2):
- GoogleAppMeasurement (= 6.6.1) - Firebase/CoreOnly (~> 6.26.0)
- GoogleUtilities/AppDelegateSwizzler (~> 6.0) - Firebase/Messaging (~> 6.26.0)
- GoogleUtilities/MethodSwizzler (~> 6.0) - firebase_core
- GoogleUtilities/Network (~> 6.0) - Flutter
- "GoogleUtilities/NSData+zlib (~> 6.0)" - FirebaseAnalyticsInterop (1.5.0)
- nanopb (~> 1.30905.0) - FirebaseCore (6.7.2):
- FirebaseCore (6.8.0):
- FirebaseCoreDiagnostics (~> 1.3) - FirebaseCoreDiagnostics (~> 1.3)
- FirebaseCoreDiagnosticsInterop (~> 1.2)
- GoogleUtilities/Environment (~> 6.5) - GoogleUtilities/Environment (~> 6.5)
- GoogleUtilities/Logger (~> 6.5) - GoogleUtilities/Logger (~> 6.5)
- FirebaseCoreDiagnostics (1.4.0): - FirebaseCoreDiagnostics (1.6.0):
- GoogleDataTransportCCTSupport (~> 3.1) - GoogleDataTransport (~> 7.2)
- GoogleUtilities/Environment (~> 6.5) - GoogleUtilities/Environment (~> 6.7)
- GoogleUtilities/Logger (~> 6.5) - GoogleUtilities/Logger (~> 6.7)
- nanopb (~> 1.30905.0) - nanopb (~> 1.30906.0)
- FirebaseInstallations (1.4.0): - FirebaseCoreDiagnosticsInterop (1.2.0)
- FirebaseCore (~> 6.8) - FirebaseInstallations (1.3.0):
- FirebaseCore (~> 6.6)
- GoogleUtilities/Environment (~> 6.6) - GoogleUtilities/Environment (~> 6.6)
- GoogleUtilities/UserDefaults (~> 6.6) - GoogleUtilities/UserDefaults (~> 6.6)
- PromisesObjC (~> 1.2) - PromisesObjC (~> 1.2)
- FirebaseInstanceID (4.4.0): - FirebaseInstanceID (4.3.4):
- FirebaseCore (~> 6.8) - FirebaseCore (~> 6.6)
- FirebaseInstallations (~> 1.0) - FirebaseInstallations (~> 1.0)
- GoogleUtilities/Environment (~> 6.5) - GoogleUtilities/Environment (~> 6.5)
- GoogleUtilities/UserDefaults (~> 6.5) - GoogleUtilities/UserDefaults (~> 6.5)
- FirebaseMessaging (4.5.0): - FirebaseMessaging (4.4.1):
- FirebaseCore (~> 6.8) - FirebaseAnalyticsInterop (~> 1.5)
- FirebaseCore (~> 6.6)
- FirebaseInstanceID (~> 4.3) - FirebaseInstanceID (~> 4.3)
- GoogleUtilities/AppDelegateSwizzler (~> 6.5) - GoogleUtilities/AppDelegateSwizzler (~> 6.5)
- GoogleUtilities/Environment (~> 6.5) - GoogleUtilities/Environment (~> 6.5)
@ -83,10 +81,13 @@ PODS:
- Protobuf (>= 3.9.2, ~> 3.9) - Protobuf (>= 3.9.2, ~> 3.9)
- FLAnimatedImage (1.0.12) - FLAnimatedImage (1.0.12)
- Flutter (1.0.0) - Flutter (1.0.0)
- flutter_keyboard_visibility (0.7.0): - flutter_keyboard_visibility (0.0.1):
- Flutter - Flutter
- flutter_local_notifications (0.0.1): - flutter_local_notifications (0.0.1):
- Flutter - Flutter
- flutter_olm (0.0.1):
- Flutter
- OLMKit
- flutter_plugin_android_lifecycle (0.0.1): - flutter_plugin_android_lifecycle (0.0.1):
- Flutter - Flutter
- flutter_secure_storage (3.3.1): - flutter_secure_storage (3.3.1):
@ -95,45 +96,35 @@ PODS:
- Flutter - Flutter
- FMDB (2.7.5): - FMDB (2.7.5):
- FMDB/standard (= 2.7.5) - FMDB/standard (= 2.7.5)
- FMDB/SQLCipher (2.7.5):
- SQLCipher
- FMDB/standard (2.7.5) - FMDB/standard (2.7.5)
- GoogleAppMeasurement (6.6.1): - GoogleDataTransport (7.3.0):
- GoogleUtilities/AppDelegateSwizzler (~> 6.0) - nanopb (~> 1.30906.0)
- GoogleUtilities/MethodSwizzler (~> 6.0) - GoogleUtilities/AppDelegateSwizzler (6.7.2):
- GoogleUtilities/Network (~> 6.0)
- "GoogleUtilities/NSData+zlib (~> 6.0)"
- nanopb (~> 1.30905.0)
- GoogleDataTransport (6.2.1)
- GoogleDataTransportCCTSupport (3.2.0):
- GoogleDataTransport (~> 6.1)
- nanopb (~> 1.30905.0)
- GoogleUtilities/AppDelegateSwizzler (6.6.0):
- GoogleUtilities/Environment - GoogleUtilities/Environment
- GoogleUtilities/Logger - GoogleUtilities/Logger
- GoogleUtilities/Network - GoogleUtilities/Network
- GoogleUtilities/Environment (6.6.0): - GoogleUtilities/Environment (6.7.2):
- PromisesObjC (~> 1.2) - PromisesObjC (~> 1.2)
- GoogleUtilities/Logger (6.6.0): - GoogleUtilities/Logger (6.7.2):
- GoogleUtilities/Environment - GoogleUtilities/Environment
- GoogleUtilities/MethodSwizzler (6.6.0): - GoogleUtilities/Network (6.7.2):
- GoogleUtilities/Logger
- GoogleUtilities/Network (6.6.0):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib" - "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability - GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (6.6.0)" - "GoogleUtilities/NSData+zlib (6.7.2)"
- GoogleUtilities/Reachability (6.6.0): - GoogleUtilities/Reachability (6.7.2):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (6.6.0): - GoogleUtilities/UserDefaults (6.7.2):
- GoogleUtilities/Logger - GoogleUtilities/Logger
- image_picker (0.0.1): - image_picker (0.0.1):
- Flutter - Flutter
- nanopb (1.30905.0): - nanopb (1.30906.0):
- nanopb/decode (= 1.30905.0) - nanopb/decode (= 1.30906.0)
- nanopb/encode (= 1.30905.0) - nanopb/encode (= 1.30906.0)
- nanopb/decode (1.30905.0) - nanopb/decode (1.30906.0)
- nanopb/encode (1.30905.0) - nanopb/encode (1.30906.0)
- native_imaging (0.0.1):
- Flutter
- OLMKit (3.1.0): - OLMKit (3.1.0):
- OLMKit/olmc (= 3.1.0) - OLMKit/olmc (= 3.1.0)
- OLMKit/olmcpp (= 3.1.0) - OLMKit/olmcpp (= 3.1.0)
@ -143,58 +134,92 @@ PODS:
- Flutter - Flutter
- path_provider (0.0.1): - path_provider (0.0.1):
- Flutter - Flutter
- PromisesObjC (1.2.9) - path_provider_linux (0.0.1):
- Protobuf (3.12.0) - Flutter
- path_provider_macos (0.0.1):
- Flutter
- path_provider_windows (0.0.1):
- Flutter
- PromisesObjC (1.2.10)
- Protobuf (3.13.0)
- receive_sharing_intent (0.0.1): - receive_sharing_intent (0.0.1):
- Flutter - Flutter
- SDWebImage (5.8.1): - SDWebImage (5.9.1):
- SDWebImage/Core (= 5.8.1) - SDWebImage/Core (= 5.9.1)
- SDWebImage/Core (5.8.1) - SDWebImage/Core (5.9.1)
- SDWebImageFLPlugin (0.4.0): - SDWebImageFLPlugin (0.4.0):
- FLAnimatedImage (>= 1.0.11) - FLAnimatedImage (>= 1.0.11)
- SDWebImage/Core (~> 5.6) - SDWebImage/Core (~> 5.6)
- share (0.5.2): - share (0.0.1):
- Flutter - Flutter
- sqflite (0.0.1): - sqflite (0.0.1):
- Flutter - Flutter
- FMDB (~> 2.7.2) - FMDB (~> 2.7.2)
- sqflite_sqlcipher (0.0.1):
- Flutter
- FMDB/SQLCipher (~> 2.7.5)
- SQLCipher (4.4.0): - SQLCipher (4.4.0):
- SQLCipher/standard (= 4.4.0) - SQLCipher/standard (= 4.4.0)
- SQLCipher/common (4.4.0) - SQLCipher/common (4.4.0)
- SQLCipher/standard (4.4.0): - SQLCipher/standard (4.4.0):
- SQLCipher/common - SQLCipher/common
- sqlite3 (3.32.3):
- sqlite3/common (= 3.32.3)
- sqlite3/common (3.32.3)
- sqlite3/fts5 (3.32.3):
- sqlite3/common
- sqlite3/json1 (3.32.3):
- sqlite3/common
- sqlite3/perf-threadsafe (3.32.3):
- sqlite3/common
- sqlite3/rtree (3.32.3):
- sqlite3/common
- sqlite3_flutter_libs (0.0.1):
- Flutter
- sqlite3 (~> 3.32.3)
- sqlite3/fts5
- sqlite3/json1
- sqlite3/perf-threadsafe
- sqlite3/rtree
- url_launcher (0.0.1): - url_launcher (0.0.1):
- Flutter - Flutter
- url_launcher_linux (0.0.1):
- Flutter
- url_launcher_macos (0.0.1): - url_launcher_macos (0.0.1):
- Flutter - Flutter
- url_launcher_web (0.0.1): - url_launcher_web (0.0.1):
- Flutter - Flutter
- url_launcher_windows (0.0.1):
- Flutter
- webview_flutter (0.0.1): - webview_flutter (0.0.1):
- Flutter - Flutter
DEPENDENCIES: DEPENDENCIES:
- file_picker (from `.symlinks/plugins/file_picker/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_core_web (from `.symlinks/plugins/firebase_core_web/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`) - Flutter (from `Flutter`)
- flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_olm (from `.symlinks/plugins/flutter_olm/ios`)
- flutter_plugin_android_lifecycle (from `.symlinks/plugins/flutter_plugin_android_lifecycle/ios`) - flutter_plugin_android_lifecycle (from `.symlinks/plugins/flutter_plugin_android_lifecycle/ios`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- flutter_sound (from `.symlinks/plugins/flutter_sound/ios`) - flutter_sound (from `.symlinks/plugins/flutter_sound/ios`)
- image_picker (from `.symlinks/plugins/image_picker/ios`) - image_picker (from `.symlinks/plugins/image_picker/ios`)
- OLMKit - native_imaging (from `.symlinks/plugins/native_imaging/ios`)
- open_file (from `.symlinks/plugins/open_file/ios`) - open_file (from `.symlinks/plugins/open_file/ios`)
- path_provider (from `.symlinks/plugins/path_provider/ios`) - path_provider (from `.symlinks/plugins/path_provider/ios`)
- path_provider_linux (from `.symlinks/plugins/path_provider_linux/ios`)
- path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`)
- path_provider_windows (from `.symlinks/plugins/path_provider_windows/ios`)
- receive_sharing_intent (from `.symlinks/plugins/receive_sharing_intent/ios`) - receive_sharing_intent (from `.symlinks/plugins/receive_sharing_intent/ios`)
- share (from `.symlinks/plugins/share/ios`) - share (from `.symlinks/plugins/share/ios`)
- sqflite (from `.symlinks/plugins/sqflite/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`)
- sqflite_sqlcipher (from `.symlinks/plugins/sqflite_sqlcipher/ios`) - SQLCipher
- sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`)
- url_launcher (from `.symlinks/plugins/url_launcher/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`)
- url_launcher_linux (from `.symlinks/plugins/url_launcher_linux/ios`)
- url_launcher_macos (from `.symlinks/plugins/url_launcher_macos/ios`) - url_launcher_macos (from `.symlinks/plugins/url_launcher_macos/ios`)
- url_launcher_web (from `.symlinks/plugins/url_launcher_web/ios`) - url_launcher_web (from `.symlinks/plugins/url_launcher_web/ios`)
- url_launcher_windows (from `.symlinks/plugins/url_launcher_windows/ios`)
- webview_flutter (from `.symlinks/plugins/webview_flutter/ios`) - webview_flutter (from `.symlinks/plugins/webview_flutter/ios`)
SPEC REPOS: SPEC REPOS:
@ -202,17 +227,16 @@ SPEC REPOS:
- DKImagePickerController - DKImagePickerController
- DKPhotoGallery - DKPhotoGallery
- Firebase - Firebase
- FirebaseAnalytics - FirebaseAnalyticsInterop
- FirebaseCore - FirebaseCore
- FirebaseCoreDiagnostics - FirebaseCoreDiagnostics
- FirebaseCoreDiagnosticsInterop
- FirebaseInstallations - FirebaseInstallations
- FirebaseInstanceID - FirebaseInstanceID
- FirebaseMessaging - FirebaseMessaging
- FLAnimatedImage - FLAnimatedImage
- FMDB - FMDB
- GoogleAppMeasurement
- GoogleDataTransport - GoogleDataTransport
- GoogleDataTransportCCTSupport
- GoogleUtilities - GoogleUtilities
- nanopb - nanopb
- OLMKit - OLMKit
@ -221,10 +245,15 @@ SPEC REPOS:
- SDWebImage - SDWebImage
- SDWebImageFLPlugin - SDWebImageFLPlugin
- SQLCipher - SQLCipher
- sqlite3
EXTERNAL SOURCES: EXTERNAL SOURCES:
file_picker: file_picker:
:path: ".symlinks/plugins/file_picker/ios" :path: ".symlinks/plugins/file_picker/ios"
firebase_core:
:path: ".symlinks/plugins/firebase_core/ios"
firebase_core_web:
:path: ".symlinks/plugins/firebase_core_web/ios"
firebase_messaging: firebase_messaging:
:path: ".symlinks/plugins/firebase_messaging/ios" :path: ".symlinks/plugins/firebase_messaging/ios"
Flutter: Flutter:
@ -233,6 +262,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_keyboard_visibility/ios" :path: ".symlinks/plugins/flutter_keyboard_visibility/ios"
flutter_local_notifications: flutter_local_notifications:
:path: ".symlinks/plugins/flutter_local_notifications/ios" :path: ".symlinks/plugins/flutter_local_notifications/ios"
flutter_olm:
:path: ".symlinks/plugins/flutter_olm/ios"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
:path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios" :path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios"
flutter_secure_storage: flutter_secure_storage:
@ -241,24 +272,36 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_sound/ios" :path: ".symlinks/plugins/flutter_sound/ios"
image_picker: image_picker:
:path: ".symlinks/plugins/image_picker/ios" :path: ".symlinks/plugins/image_picker/ios"
native_imaging:
:path: ".symlinks/plugins/native_imaging/ios"
open_file: open_file:
:path: ".symlinks/plugins/open_file/ios" :path: ".symlinks/plugins/open_file/ios"
path_provider: path_provider:
:path: ".symlinks/plugins/path_provider/ios" :path: ".symlinks/plugins/path_provider/ios"
path_provider_linux:
:path: ".symlinks/plugins/path_provider_linux/ios"
path_provider_macos:
:path: ".symlinks/plugins/path_provider_macos/ios"
path_provider_windows:
:path: ".symlinks/plugins/path_provider_windows/ios"
receive_sharing_intent: receive_sharing_intent:
:path: ".symlinks/plugins/receive_sharing_intent/ios" :path: ".symlinks/plugins/receive_sharing_intent/ios"
share: share:
:path: ".symlinks/plugins/share/ios" :path: ".symlinks/plugins/share/ios"
sqflite: sqflite:
:path: ".symlinks/plugins/sqflite/ios" :path: ".symlinks/plugins/sqflite/ios"
sqflite_sqlcipher: sqlite3_flutter_libs:
:path: ".symlinks/plugins/sqflite_sqlcipher/ios" :path: ".symlinks/plugins/sqlite3_flutter_libs/ios"
url_launcher: url_launcher:
:path: ".symlinks/plugins/url_launcher/ios" :path: ".symlinks/plugins/url_launcher/ios"
url_launcher_linux:
:path: ".symlinks/plugins/url_launcher_linux/ios"
url_launcher_macos: url_launcher_macos:
:path: ".symlinks/plugins/url_launcher_macos/ios" :path: ".symlinks/plugins/url_launcher_macos/ios"
url_launcher_web: url_launcher_web:
:path: ".symlinks/plugins/url_launcher_web/ios" :path: ".symlinks/plugins/url_launcher_web/ios"
url_launcher_windows:
:path: ".symlinks/plugins/url_launcher_windows/ios"
webview_flutter: webview_flutter:
:path: ".symlinks/plugins/webview_flutter/ios" :path: ".symlinks/plugins/webview_flutter/ios"
@ -266,45 +309,54 @@ SPEC CHECKSUMS:
DKImagePickerController: 4a3e7948a848c4348e600b3fe5ce41478835fa10 DKImagePickerController: 4a3e7948a848c4348e600b3fe5ce41478835fa10
DKPhotoGallery: 0290d32343574f06eaa4c26f8f2f8a1035e916be DKPhotoGallery: 0290d32343574f06eaa4c26f8f2f8a1035e916be
file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1 file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1
Firebase: fc4cbf6f1592636431821ef9a3c557e4dfd9f268 Firebase: 7cf5f9c67f03cb3b606d1d6535286e1080e57eb6
firebase_messaging: cffb57ce40958c6204f03fb0c81713e4cd1e240c firebase_core: 3134fe79d257d430f163b558caf52a10a87efe8a
FirebaseAnalytics: 0ea640473474f036cabbc2576e20c2d63671c92f firebase_core_web: d501d8b946b60c8af265428ce483b0fff5ad52d1
FirebaseCore: feda061cb1ee6d8ad4824f4a4a8ffbcfe284f595 firebase_messaging: 2844c37f9ce87c0904b38fe435223161b1a71528
FirebaseCoreDiagnostics: 4505e4d4009b1d93f605088ee7d7764d5f0d1c84 FirebaseAnalyticsInterop: 3f86269c38ae41f47afeb43ebf32a001f58fcdae
FirebaseInstallations: 293f567159b6d66d1c990f13bb868066096c94ec FirebaseCore: f42e5e5f382cdcf6b617ed737bf6c871a6947b17
FirebaseInstanceID: 3b119bfe90e904851218159c9a4ecb847cc51d18 FirebaseCoreDiagnostics: 7415bfb3883b3500c5a95c42b6ba66baae78f600
FirebaseMessaging: ad9e1a80ea64905e01a0ce1b3eb76a2944544151 FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850
FirebaseInstallations: 6f5f680e65dc374397a483c32d1799ba822a395b
FirebaseInstanceID: cef67c4967c7cecb56ea65d8acbb4834825c587b
FirebaseMessaging: 29543feb343b09546ab3aa04d008ee8595b43c44
FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
flutter_keyboard_visibility: 6195387fb6d8f46e5cd6dda4a4154e41f800f545 flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069
flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186 flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186
flutter_olm: be36ebeb6388f7d7b3097d39feaf459a3cad2091
flutter_plugin_android_lifecycle: dc0b544e129eebb77a6bfb1239d4d1c673a60a35 flutter_plugin_android_lifecycle: dc0b544e129eebb77a6bfb1239d4d1c673a60a35
flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec
flutter_sound: 0e8163ceac1e00eb6d894e2ae4641ba726a2c479 flutter_sound: 0e8163ceac1e00eb6d894e2ae4641ba726a2c479
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
GoogleAppMeasurement: 2fd5c5a56c069db635c8e7b92d4809a9591d0a69 GoogleDataTransport: e85fb700c9b027079ce182c3d08e12e0f9618bb4
GoogleDataTransport: 9a8a16f79feffc7f42096743de2a7c4815e84020 GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
GoogleDataTransportCCTSupport: 489c1265d2c85b68187a83a911913d190012158d image_picker: 9c3312491f862b28d21ecd8fdf0ee14e601b3f09
GoogleUtilities: 39530bc0ad980530298e9c4af8549e991fd033b1 nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
image_picker: 66aa71bc96850a90590a35d4c4a2907b0d823109 native_imaging: 633687fc14422729cc67ed80c3435e359ef7a92b
nanopb: c43f40fadfe79e8b8db116583945847910cbabc9
OLMKit: 4ee0159d63feeb86d836fdcfefe418e163511639 OLMKit: 4ee0159d63feeb86d836fdcfefe418e163511639
open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d open_file: 02eb5cb6b21264bd3a696876f5afbfb7ca4f4b7d
path_provider: fb74bd0465e96b594bb3b5088ee4a4e7bb1f2a9d path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
PromisesObjC: b48e0338dbbac2207e611750777895f7a5811b75 path_provider_linux: 4d630dc393e1f20364f3e3b4a2ff41d9674a84e4
Protobuf: 2793fcd0622a00b546c60e7cbbcc493e043e9bb9 path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0
path_provider_windows: a2b81600c677ac1959367280991971cb9a1edb3b
PromisesObjC: b14b1c6b68e306650688599de8a45e49fae81151
Protobuf: 3dac39b34a08151c6d949560efe3f86134a3f748
receive_sharing_intent: c0d87310754e74c0f9542947e7cbdf3a0335a3b1 receive_sharing_intent: c0d87310754e74c0f9542947e7cbdf3a0335a3b1
SDWebImage: e3eae2eda88578db0685a0c88597fdadd9433f05 SDWebImage: a990c053fff71e388a10f3357edb0be17929c9c5
SDWebImageFLPlugin: 6c2295fb1242d44467c6c87dc5db6b0a13228fd8 SDWebImageFLPlugin: 6c2295fb1242d44467c6c87dc5db6b0a13228fd8
share: bae0a282aab4483288913fc4dc0b935d4b491f2e share: 0b2c3e82132f5888bccca3351c504d0003b3b410
sqflite: 4001a31ff81d210346b500c55b17f4d6c7589dd0 sqflite: 4001a31ff81d210346b500c55b17f4d6c7589dd0
sqflite_sqlcipher: 45e72be2f26bde6ad196ff8b084123d8634ba921
SQLCipher: e434ed542b24f38ea7b36468a13f9765e1b5c072 SQLCipher: e434ed542b24f38ea7b36468a13f9765e1b5c072
url_launcher: a1c0cc845906122c4784c542523d8cacbded5626 sqlite3: 8f7d2078ae27778699a622a94b853285793422a2
sqlite3_flutter_libs: 5651f8ff48e3b44d910863c4ea5916085b1b245f
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
url_launcher_linux: ac237cb7a8058736e4aae38bdbcc748a4b394cc0
url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313 url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313
url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c
webview_flutter: bec7599de6bfbe8008a739aa3ebd7b364ea9d0cd url_launcher_windows: 683d7c283894db8d1914d3ab2223b20cc1ad95d5
webview_flutter: d2b4d6c66968ad042ad94cbb791f5b72b4678a96
PODFILE CHECKSUM: a023bd4e2d89de8e64bb7aab80deaefdf9f0384c PODFILE CHECKSUM: 4b647f92a1fa32e6a4287abfd67897564ceda4e9
COCOAPODS: 1.9.1 COCOAPODS: 1.9.3

4
l10n.yaml Normal file
View file

@ -0,0 +1,4 @@
arb-dir: lib/l10n
template-arb-file: intl_en.arb
output-localization-file: l10n.dart
output-class: L10n

View file

@ -2,12 +2,15 @@ import 'dart:async';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/message_download_content.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_sound/flutter_sound.dart'; import 'package:flutter_sound/flutter_sound.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:universal_html/prefer_universal/html.dart' as html;
import 'dialogs/simple_dialogs.dart'; import 'dialogs/simple_dialogs.dart';
import '../utils/ui_fake.dart' if (dart.library.html) 'dart:ui' as ui;
import 'matrix.dart';
class AudioPlayer extends StatefulWidget { class AudioPlayer extends StatefulWidget {
final Color color; final Color color;
@ -36,6 +39,22 @@ class _AudioPlayerState extends State<AudioPlayer> {
double currentPosition = 0; double currentPosition = 0;
double maxPosition = 0; double maxPosition = 0;
String webSrcUrl;
@override
void initState() {
super.initState();
if (kIsWeb) {
ui.platformViewRegistry.registerViewFactory(
'web_audio_player',
(int viewId) => html.AudioElement()
..src = webSrcUrl
..autoplay = false
..controls = true
..style.border = 'none');
}
}
@override @override
void dispose() { void dispose() {
if (flutterSound.audioState == t_AUDIO_STATE.IS_PLAYING) { if (flutterSound.audioState == t_AUDIO_STATE.IS_PLAYING) {
@ -111,6 +130,18 @@ class _AudioPlayerState extends State<AudioPlayer> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (kIsWeb) {
if (widget.event.content['url'] is String) {
webSrcUrl = Uri.parse(widget.event.content['url'])
.getDownloadLink(Matrix.of(context).client);
return Container(
height: 50,
width: 300,
child: HtmlElementView(viewType: 'web_audio_player'),
);
}
return MessageDownloadContent(widget.event, widget.color);
}
return Row( return Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[

View file

@ -2,7 +2,7 @@ import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/utils/string_color.dart'; import 'package:fluffychat/utils/string_color.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_advanced_networkimage/provider.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'matrix.dart'; import 'matrix.dart';
@ -41,12 +41,7 @@ class Avatar extends StatelessWidget {
onTap: onTap, onTap: onTap,
child: CircleAvatar( child: CircleAvatar(
radius: size / 2, radius: size / 2,
backgroundImage: !noPic backgroundImage: !noPic ? CachedNetworkImageProvider(src) : null,
? AdvancedNetworkImage(
src,
useDiskCache: !kIsWeb,
)
: null,
backgroundColor: noPic backgroundColor: noPic
? name?.lightColor ?? Theme.of(context).secondaryHeaderColor ? name?.lightColor ?? Theme.of(context).secondaryHeaderColor
: Theme.of(context).secondaryHeaderColor, : Theme.of(context).secondaryHeaderColor,

View file

@ -1,11 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/chat_details.dart'; import 'package:fluffychat/views/chat_details.dart';
import 'package:fluffychat/views/chat_list.dart'; import 'package:fluffychat/views/chat_list.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'dialogs/simple_dialogs.dart'; import 'dialogs/simple_dialogs.dart';

View file

@ -11,7 +11,7 @@ class ConnectionStatusHeader extends StatefulWidget {
class _ConnectionStatusHeaderState extends State<ConnectionStatusHeader> { class _ConnectionStatusHeaderState extends State<ConnectionStatusHeader> {
StreamSubscription _onSyncSub; StreamSubscription _onSyncSub;
StreamSubscription _onSyncErrorSub; StreamSubscription _onSyncErrorSub;
static bool _connected = false; static bool _connected = true;
set connected(bool connected) { set connected(bool connected) {
if (mounted) { if (mounted) {

View file

@ -1,7 +1,7 @@
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_advanced_networkimage/provider.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'matrix.dart'; import 'matrix.dart';
@ -48,13 +48,10 @@ class ContentBanner extends StatelessWidget {
opacity: 0.75, opacity: 0.75,
child: !loading child: !loading
? mxContent != null ? mxContent != null
? Image( ? CachedNetworkImage(
imageUrl: src,
height: 300, height: 300,
fit: BoxFit.cover, fit: BoxFit.cover,
image: AdvancedNetworkImage(
src,
useDiskCache: !kIsWeb,
),
) )
: Icon(defaultIcon, size: 300) : Icon(defaultIcon, size: 300)
: Icon(defaultIcon, size: 300), : Icon(defaultIcon, size: 300),

View file

@ -1,63 +0,0 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/chat.dart';
import 'package:flutter/material.dart';
import 'package:fluffychat/utils/presence_extension.dart';
import '../avatar.dart';
import '../matrix.dart';
class PresenceDialog extends StatelessWidget {
final Uri avatarUrl;
final String displayname;
final Presence presence;
const PresenceDialog(
this.presence, {
this.avatarUrl,
this.displayname,
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return AlertDialog(
title: ListTile(
contentPadding: EdgeInsets.zero,
leading: Avatar(avatarUrl, displayname),
title: Text(displayname),
subtitle: Text(presence.senderId),
),
content: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(presence.getLocalizedStatusMessage(context)),
],
),
actions: <Widget>[
if (presence.senderId != Matrix.of(context).client.userID)
FlatButton(
child: Text(L10n.of(context).sendAMessage),
onPressed: () async {
final roomId = await User(
presence.senderId,
room: Room(id: '', client: Matrix.of(context).client),
).startDirectChat();
await Navigator.of(context).pushAndRemoveUntil(
AppRoute.defaultRoute(
context,
ChatView(roomId),
),
(Route r) => r.isFirst);
},
),
FlatButton(
child: Text(L10n.of(context).close),
onPressed: () => Navigator.of(context).pop(),
),
],
);
}
}

View file

@ -1,7 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:flutter_sound/flutter_sound.dart'; import 'package:flutter_sound/flutter_sound.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';

View file

@ -0,0 +1,134 @@
import 'dart:typed_data';
import 'dart:ui';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:native_imaging/native_imaging.dart' as native;
import '../../components/dialogs/simple_dialogs.dart';
import '../../utils/matrix_file_extension.dart';
import '../../utils/room_send_file_extension.dart';
class SendFileDialog extends StatefulWidget {
final Room room;
final MatrixFile file;
const SendFileDialog({this.room, this.file, Key key}) : super(key: key);
@override
_SendFileDialogState createState() => _SendFileDialogState();
}
class _SendFileDialogState extends State<SendFileDialog> {
bool origImage = false;
Future<void> _send() async {
var file = widget.file;
if (file is MatrixImageFile && !origImage) {
final imgFile = file as MatrixImageFile;
// resize to max 1600 x 1600
try {
await native.init();
var nativeImg = native.Image();
try {
await nativeImg.loadEncoded(imgFile.bytes);
imgFile.width = nativeImg.width();
imgFile.height = nativeImg.height();
} on UnsupportedError {
final dartCodec = await instantiateImageCodec(imgFile.bytes);
final dartFrame = await dartCodec.getNextFrame();
imgFile.width = dartFrame.image.width;
imgFile.height = dartFrame.image.height;
final rgbaData = await dartFrame.image.toByteData();
final rgba = Uint8List.view(
rgbaData.buffer, rgbaData.offsetInBytes, rgbaData.lengthInBytes);
dartFrame.image.dispose();
dartCodec.dispose();
nativeImg.loadRGBA(imgFile.width, imgFile.height, rgba);
}
const max = 1600;
if (imgFile.width > max || imgFile.height > max) {
var w = max, h = max;
if (imgFile.width > imgFile.height) {
h = max * imgFile.height ~/ imgFile.width;
} else {
w = max * imgFile.width ~/ imgFile.height;
}
final scaledImg = nativeImg.resample(w, h, native.Transform.lanczos);
nativeImg.free();
nativeImg = scaledImg;
}
final jpegBytes = await nativeImg.toJpeg(75);
file = MatrixImageFile(
bytes: jpegBytes,
name: 'scaled_' + imgFile.name.split('.').first + '.jpg');
nativeImg.free();
} catch (e) {
// couldn't resize
}
}
await widget.room.sendFileEventWithThumbnail(file);
}
@override
Widget build(BuildContext context) {
var sendStr = L10n.of(context).sendFile;
if (widget.file is MatrixImageFile) {
sendStr = L10n.of(context).sendImage;
} else if (widget.file is MatrixAudioFile) {
sendStr = L10n.of(context).sendAudio;
} else if (widget.file is MatrixVideoFile) {
sendStr = L10n.of(context).sendVideo;
}
Widget contentWidget;
if (widget.file is MatrixImageFile) {
contentWidget = Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
Flexible(
child: Image.memory(
widget.file.bytes,
fit: BoxFit.contain,
),
),
Text(widget.file.name),
Row(
children: <Widget>[
Checkbox(
value: origImage,
onChanged: (v) => setState(() => origImage = v),
),
InkWell(
onTap: () => setState(() => origImage = !origImage),
child: Text(L10n.of(context).sendOriginal +
' (${widget.file.sizeString})'),
),
],
)
]);
} else {
contentWidget = Text('${widget.file.name} (${widget.file.sizeString})');
}
return AlertDialog(
title: Text(sendStr),
content: contentWidget,
actions: <Widget>[
FlatButton(
child: Text(L10n.of(context).cancel),
onPressed: () {
// just close the dialog
Navigator.of(context).pop();
},
),
FlatButton(
child: Text(L10n.of(context).send),
onPressed: () async {
await SimpleDialogs(context).tryRequestWithLoadingDialog(_send());
await Navigator.of(context).pop();
},
),
],
);
}
}

View file

@ -1,7 +1,8 @@
import 'package:fluffychat/l10n/l10n.dart';
import 'package:flutter/material.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:bot_toast/bot_toast.dart'; import 'package:bot_toast/bot_toast.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix_link_text/link_text.dart';
class SimpleDialogs { class SimpleDialogs {
final BuildContext context; final BuildContext context;
@ -78,13 +79,14 @@ class SimpleDialogs {
String contentText, String contentText,
String confirmText, String confirmText,
String cancelText, String cancelText,
bool dangerous = false,
}) async { }) async {
var confirmed = false; var confirmed = false;
await showDialog( await showDialog(
context: context, context: context,
builder: (c) => AlertDialog( builder: (c) => AlertDialog(
title: Text(titleText ?? L10n.of(context).areYouSure), title: Text(titleText ?? L10n.of(context).areYouSure),
content: contentText != null ? Text(contentText) : null, content: contentText != null ? LinkText(text: contentText) : null,
actions: <Widget>[ actions: <Widget>[
FlatButton( FlatButton(
child: Text( child: Text(
@ -97,6 +99,7 @@ class SimpleDialogs {
child: Text( child: Text(
confirmText?.toUpperCase() ?? confirmText?.toUpperCase() ??
L10n.of(context).confirm.toUpperCase(), L10n.of(context).confirm.toUpperCase(),
style: TextStyle(color: dangerous ? Colors.red : null),
), ),
onPressed: () { onPressed: () {
confirmed = true; confirmed = true;
@ -135,11 +138,26 @@ class SimpleDialogs {
Future<dynamic> tryRequestWithLoadingDialog(Future<dynamic> request, Future<dynamic> tryRequestWithLoadingDialog(Future<dynamic> request,
{Function(MatrixException) onAdditionalAuth}) async { {Function(MatrixException) onAdditionalAuth}) async {
showLoadingDialog(context); var completed = false;
final dynamic = await tryRequestWithErrorToast(request, final futureResult = tryRequestWithErrorToast(
onAdditionalAuth: onAdditionalAuth); request,
Navigator.of(context)?.pop(); onAdditionalAuth: onAdditionalAuth,
return dynamic; ).whenComplete(() => completed = true);
await Future.delayed(Duration(seconds: 1));
if (completed) return futureResult;
return showDialog<dynamic>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
futureResult.then(
(result) => Navigator.of(context).pop<dynamic>(result),
);
return AlertDialog(
title: Text(L10n.of(context).loadingPleaseWait),
content: LinearProgressIndicator(),
);
},
);
} }
Future<dynamic> tryRequestWithErrorToast(Future<dynamic> request, Future<dynamic> tryRequestWithErrorToast(Future<dynamic> request,
@ -164,18 +182,8 @@ class SimpleDialogs {
context: context, context: context,
barrierDismissible: false, barrierDismissible: false,
builder: (BuildContext context) => AlertDialog( builder: (BuildContext context) => AlertDialog(
content: Row( title: Text(L10n.of(context).loadingPleaseWait),
children: <Widget>[ content: LinearProgressIndicator(),
CircularProgressIndicator(),
SizedBox(width: 16),
Expanded(
child: Text(
L10n.of(context).loadingPleaseWait,
overflow: TextOverflow.ellipsis,
maxLines: 1,
)),
],
),
), ),
); );
} }

View file

@ -1,11 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'package:bot_toast/bot_toast.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/chat_encryption_settings.dart'; import 'package:fluffychat/views/chat_encryption_settings.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:bot_toast/bot_toast.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'dialogs/simple_dialogs.dart'; import 'dialogs/simple_dialogs.dart';
import 'matrix.dart'; import 'matrix.dart';

View file

@ -1,7 +1,7 @@
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter_matrix_html/flutter_html.dart'; import 'package:flutter_matrix_html/flutter_html.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart'; import '../utils/url_launcher.dart';
import 'matrix.dart'; import 'matrix.dart';
@ -11,13 +11,15 @@ class HtmlMessage extends StatelessWidget {
final Room room; final Room room;
final TextStyle defaultTextStyle; final TextStyle defaultTextStyle;
final TextStyle linkStyle; final TextStyle linkStyle;
final double emoteSize;
const HtmlMessage( const HtmlMessage(
{this.html, {this.html,
this.maxLines, this.maxLines,
this.room, this.room,
this.defaultTextStyle, this.defaultTextStyle,
this.linkStyle}); this.linkStyle,
this.emoteSize});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -35,6 +37,7 @@ class HtmlMessage extends StatelessWidget {
return Html( return Html(
data: renderHtml, data: renderHtml,
defaultTextStyle: defaultTextStyle, defaultTextStyle: defaultTextStyle,
emoteSize: emoteSize,
linkStyle: linkStyle ?? linkStyle: linkStyle ??
themeData.textTheme.bodyText2.copyWith( themeData.textTheme.bodyText2.copyWith(
color: themeData.accentColor, color: themeData.accentColor,
@ -42,12 +45,8 @@ class HtmlMessage extends StatelessWidget {
), ),
shrinkToFit: true, shrinkToFit: true,
maxLines: maxLines, maxLines: maxLines,
onLinkTap: (String url) { onLinkTap: (url) => UrlLauncher(context, url).launchUrl(),
if (url == null || url.isEmpty) { onPillTap: (url) => UrlLauncher(context, url).launchUrl(),
return;
}
launch(url);
},
getMxcUrl: (String mxc, double width, double height) { getMxcUrl: (String mxc, double width, double height) {
final ratio = MediaQuery.of(context).devicePixelRatio; final ratio = MediaQuery.of(context).devicePixelRatio;
return Uri.parse(mxc)?.getThumbnail( return Uri.parse(mxc)?.getThumbnail(

View file

@ -1,8 +1,10 @@
import 'package:bubble/bubble.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/image_view.dart'; import 'package:fluffychat/views/image_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_blurhash/flutter_blurhash.dart';
import 'package:cached_network_image/cached_network_image.dart';
class ImageBubble extends StatefulWidget { class ImageBubble extends StatefulWidget {
final Event event; final Event event;
@ -11,6 +13,7 @@ class ImageBubble extends StatefulWidget {
final bool maxSize; final bool maxSize;
final Color backgroundColor; final Color backgroundColor;
final double radius; final double radius;
final bool thumbnailOnly;
const ImageBubble( const ImageBubble(
this.event, { this.event, {
@ -19,6 +22,7 @@ class ImageBubble extends StatefulWidget {
this.backgroundColor, this.backgroundColor,
this.fit = BoxFit.cover, this.fit = BoxFit.cover,
this.radius = 10.0, this.radius = 10.0,
this.thumbnailOnly = true,
Key key, Key key,
}) : super(key: key); }) : super(key: key);
@ -27,27 +31,47 @@ class ImageBubble extends StatefulWidget {
} }
class _ImageBubbleState extends State<ImageBubble> { class _ImageBubbleState extends State<ImageBubble> {
bool get isUnencrypted => widget.event.content['url'] is String;
static final Map<String, MatrixFile> _matrixFileMap = {}; static final Map<String, MatrixFile> _matrixFileMap = {};
MatrixFile get _file => _matrixFileMap[widget.event.eventId]; MatrixFile get _file => _matrixFileMap[widget.event.eventId];
set _file(MatrixFile file) { set _file(MatrixFile file) {
if (file != null) {
_matrixFileMap[widget.event.eventId] = file; _matrixFileMap[widget.event.eventId] = file;
} }
}
static final Map<String, MatrixFile> _matrixThumbnailMap = {};
MatrixFile get _thumbnail => _matrixThumbnailMap[widget.event.eventId];
set _thumbnail(MatrixFile thumbnail) {
if (thumbnail != null) {
_matrixThumbnailMap[widget.event.eventId] = thumbnail;
}
}
dynamic _error; dynamic _error;
bool _requestedFile = false;
Future<MatrixFile> _getFile() async { Future<MatrixFile> _getFile() async {
_requestedFile = true;
if (widget.thumbnailOnly) return null;
if (_file != null) return _file; if (_file != null) return _file;
return widget.event.downloadAndDecryptAttachment();
}
bool _requestedThumbnail = false;
Future<MatrixFile> _getThumbnail() async {
_requestedThumbnail = true;
if (isUnencrypted) return null;
if (_thumbnail != null) return _thumbnail;
return widget.event return widget.event
.downloadAndDecryptAttachment(getThumbnail: widget.event.hasThumbnail); .downloadAndDecryptAttachment(getThumbnail: widget.event.hasThumbnail);
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Bubble( return ClipRRect(
padding: BubbleEdges.all(0), borderRadius: BorderRadius.circular(widget.radius),
radius: Radius.circular(widget.radius),
color: widget.backgroundColor ?? Theme.of(context).secondaryHeaderColor,
elevation: 0,
child: Container( child: Container(
height: widget.maxSize ? 300 : null, height: widget.maxSize ? 300 : null,
width: widget.maxSize ? 400 : null, width: widget.maxSize ? 400 : null,
@ -60,7 +84,55 @@ class _ImageBubbleState extends State<ImageBubble> {
), ),
); );
} }
if (_file != null) { if (_thumbnail == null && !_requestedThumbnail && !isUnencrypted) {
_getThumbnail().then((MatrixFile thumbnail) {
setState(() => _thumbnail = thumbnail);
}, onError: (error, stacktrace) {
setState(() => _error = error);
});
}
if (_file == null && !widget.thumbnailOnly && !_requestedFile) {
_getFile().then((MatrixFile file) {
setState(() => _file = file);
}, onError: (error, stacktrace) {
setState(() => _error = error);
});
}
final display = _file ?? _thumbnail;
final generatePlaceholderWidget = () => Stack(
children: <Widget>[
if (widget.event.content['info'] is Map &&
widget.event.content['info']['xyz.amorgan.blurhash']
is String)
BlurHash(
hash: widget.event.content['info']
['xyz.amorgan.blurhash']),
Center(
child: CircularProgressIndicator(),
),
],
);
Widget renderWidget;
if (display != null) {
renderWidget = Image.memory(
display.bytes,
fit: widget.fit,
);
} else if (isUnencrypted) {
renderWidget = CachedNetworkImage(
imageUrl: Uri.parse(widget.event.content['url']).getThumbnail(
widget.event.room.client,
width: 800,
height: 800,
method: ThumbnailMethod.scale),
placeholder: (context, url) => generatePlaceholderWidget(),
fit: widget.fit,
);
} else {
renderWidget = generatePlaceholderWidget();
}
return InkWell( return InkWell(
onTap: () { onTap: () {
if (!widget.tapToView) return; if (!widget.tapToView) return;
@ -72,20 +144,8 @@ class _ImageBubbleState extends State<ImageBubble> {
}, },
child: Hero( child: Hero(
tag: widget.event.eventId, tag: widget.event.eventId,
child: Image.memory( child: renderWidget,
_file.bytes,
fit: widget.fit,
), ),
),
);
}
_getFile().then((MatrixFile file) {
setState(() => _file = file);
}, onError: (error, stacktrace) {
setState(() => _error = error);
});
return Center(
child: CircularProgressIndicator(),
); );
}, },
), ),

View file

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:flutter_advanced_networkimage/provider.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'avatar.dart'; import 'avatar.dart';
class InputBar extends StatelessWidget { class InputBar extends StatelessWidget {
@ -146,8 +146,8 @@ class InputBar extends StatelessWidget {
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Image( CachedNetworkImage(
image: AdvancedNetworkImage(url, useDiskCache: !kIsWeb), imageUrl: url,
width: size, width: size,
height: size, height: size,
), ),
@ -237,22 +237,10 @@ class InputBar extends StatelessWidget {
} }
if (insertText.isNotEmpty && startText.isNotEmpty) { if (insertText.isNotEmpty && startText.isNotEmpty) {
controller.text = startText + afterText; controller.text = startText + afterText;
if (startText == insertText) {
// stupid fix for now
FocusScope.of(context).requestFocus(FocusNode());
Future.delayed(Duration(milliseconds: 1)).then((res) {
focusNode.requestFocus();
controller.selection = TextSelection( controller.selection = TextSelection(
baseOffset: startText.length, baseOffset: startText.length,
extentOffset: startText.length, extentOffset: startText.length,
); );
});
} else {
controller.selection = TextSelection(
baseOffset: startText.length,
extentOffset: startText.length,
);
}
} }
} }

View file

@ -1,27 +1,37 @@
import 'package:bot_toast/bot_toast.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/utils/matrix_locals.dart';
import 'package:fluffychat/views/chat.dart'; import 'package:fluffychat/views/chat.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:bot_toast/bot_toast.dart';
import 'package:pedantic/pedantic.dart'; import 'package:pedantic/pedantic.dart';
import '../../l10n/l10n.dart';
import '../../utils/app_route.dart'; import '../../utils/app_route.dart';
import '../../utils/date_time_extension.dart'; import '../../utils/date_time_extension.dart';
import '../../views/chat.dart'; import '../../views/chat.dart';
import '../theme_switcher.dart';
import '../avatar.dart'; import '../avatar.dart';
import '../dialogs/send_file_dialog.dart';
import '../dialogs/simple_dialogs.dart'; import '../dialogs/simple_dialogs.dart';
import '../matrix.dart'; import '../matrix.dart';
import '../theme_switcher.dart';
class ChatListItem extends StatelessWidget { class ChatListItem extends StatelessWidget {
final Room room; final Room room;
final bool activeChat; final bool activeChat;
final bool selected;
final Function onForget; final Function onForget;
final Function onTap;
final Function onLongPress;
const ChatListItem(this.room, {this.activeChat = false, this.onForget}); const ChatListItem(this.room,
{this.activeChat = false,
this.selected = false,
this.onTap,
this.onLongPress,
this.onForget});
void clickAction(BuildContext context) async { void clickAction(BuildContext context) async {
if (onTap != null) return onTap();
if (!activeChat) { if (!activeChat) {
if (room.membership == Membership.invite && if (room.membership == Membership.invite &&
await SimpleDialogs(context) await SimpleDialogs(context)
@ -73,11 +83,12 @@ class ChatListItem extends StatelessWidget {
if (Matrix.of(context).shareContent != null) { if (Matrix.of(context).shareContent != null) {
if (Matrix.of(context).shareContent['msgtype'] == if (Matrix.of(context).shareContent['msgtype'] ==
'chat.fluffy.shared_file') { 'chat.fluffy.shared_file') {
await SimpleDialogs(context).tryRequestWithErrorToast( await showDialog(
room.sendFileEvent( context: context,
Matrix.of(context).shareContent['file'], builder: (context) => SendFileDialog(
), file: Matrix.of(context).shareContent['file'],
); room: room,
));
} else { } else {
unawaited(room.sendEvent(Matrix.of(context).shareContent)); unawaited(room.sendEvent(Matrix.of(context).shareContent));
} }
@ -92,7 +103,7 @@ class ChatListItem extends StatelessWidget {
} }
} }
Future<bool> archiveAction(BuildContext context) async { Future<void> archiveAction(BuildContext context) async {
{ {
if ([Membership.leave, Membership.ban].contains(room.membership)) { if ([Membership.leave, Membership.ban].contains(room.membership)) {
final success = await SimpleDialogs(context) final success = await SimpleDialogs(context)
@ -103,72 +114,61 @@ class ChatListItem extends StatelessWidget {
return success; return success;
} }
final confirmed = await SimpleDialogs(context).askConfirmation(); final confirmed = await SimpleDialogs(context).askConfirmation();
if (!confirmed) { if (!confirmed) return;
return false; await SimpleDialogs(context).tryRequestWithLoadingDialog(room.leave());
} return;
final success = await SimpleDialogs(context)
.tryRequestWithLoadingDialog(room.leave());
if (success == false) {
return false;
}
return true;
} }
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Slidable( final isMuted = room.pushRuleState != PushRuleState.notify;
key: Key(room.id), return Center(
secondaryActions: <Widget>[
if ([Membership.join, Membership.invite].contains(room.membership))
IconSlideAction(
caption: L10n.of(context).leave,
color: Colors.red,
icon: Icons.archive,
onTap: () => archiveAction(context),
),
if ([Membership.leave, Membership.ban].contains(room.membership))
IconSlideAction(
caption: L10n.of(context).delete,
color: Colors.red,
icon: Icons.delete_forever,
onTap: () => archiveAction(context),
),
],
actionPane: SlidableDrawerActionPane(),
dismissal: SlidableDismissal(
child: SlidableDrawerDismissal(),
onWillDismiss: (actionType) => archiveAction(context),
),
child: Material( child: Material(
color: chatListItemColor(context, activeChat), color: chatListItemColor(context, activeChat, selected),
child: ListTile( child: ListTile(
onLongPress: onLongPress,
leading: Avatar(room.avatar, room.displayname), leading: Avatar(room.avatar, room.displayname),
title: Row( title: Row(
children: <Widget>[ children: <Widget>[
Expanded( Expanded(
child: Text( child: Text(
room.getLocalizedDisplayname(L10n.of(context)), room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))),
maxLines: 1, maxLines: 1,
overflow: TextOverflow.fade, overflow: TextOverflow.ellipsis,
softWrap: false, softWrap: false,
), ),
), ),
SizedBox(width: 4), room.isFavourite
room.pushRuleState == PushRuleState.notify ? Padding(
? Container() padding: const EdgeInsets.only(left: 4.0),
: Icon( child: Icon(
Icons.favorite,
color: Colors.grey[400],
size: 16,
),
)
: Container(),
isMuted
? Padding(
padding: const EdgeInsets.only(left: 4.0),
child: Icon(
Icons.notifications_off, Icons.notifications_off,
color: Colors.grey[400], color: Colors.grey[400],
size: 16, size: 16,
), ),
Text( )
: Container(),
Padding(
padding: const EdgeInsets.only(left: 4.0),
child: Text(
room.timeCreated.localizedTimeShort(context), room.timeCreated.localizedTimeShort(context),
style: TextStyle( style: TextStyle(
color: Color(0xFF555555), color: Color(0xFF555555),
fontSize: 13, fontSize: 13,
), ),
), ),
),
], ],
), ),
subtitle: Row( subtitle: Row(
@ -185,14 +185,15 @@ class ChatListItem extends StatelessWidget {
) )
: Text( : Text(
room.lastEvent?.getLocalizedBody( room.lastEvent?.getLocalizedBody(
L10n.of(context), MatrixLocals(L10n.of(context)),
withSenderNamePrefix: !room.isDirectChat, withSenderNamePrefix: !room.isDirectChat ||
room.lastEvent.senderId == room.client.userID,
hideReply: true, hideReply: true,
) ?? ) ??
'', '',
softWrap: false, softWrap: false,
maxLines: 1, maxLines: 1,
overflow: TextOverflow.fade, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
decoration: room.lastEvent?.redacted == true decoration: room.lastEvent?.redacted == true
? TextDecoration.lineThrough ? TextDecoration.lineThrough

View file

@ -1,17 +1,16 @@
import 'package:bubble/bubble.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/components/message_content.dart'; import 'package:fluffychat/components/message_content.dart';
import 'package:fluffychat/components/reply_content.dart'; import 'package:fluffychat/components/reply_content.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/date_time_extension.dart';
import 'package:fluffychat/utils/event_extension.dart'; import 'package:fluffychat/utils/event_extension.dart';
import 'package:fluffychat/utils/string_color.dart'; import 'package:fluffychat/utils/string_color.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../adaptive_page_layout.dart';
import '../avatar.dart'; import '../avatar.dart';
import '../matrix.dart'; import '../matrix.dart';
import '../message_reactions.dart';
import 'state_message.dart'; import 'state_message.dart';
class Message extends StatelessWidget { class Message extends StatelessWidget {
@ -19,6 +18,7 @@ class Message extends StatelessWidget {
final Event nextEvent; final Event nextEvent;
final Function(Event) onSelect; final Function(Event) onSelect;
final Function(Event) onAvatarTab; final Function(Event) onAvatarTab;
final Function(String) scrollToEventId;
final bool longPressSelect; final bool longPressSelect;
final bool selected; final bool selected;
final Timeline timeline; final Timeline timeline;
@ -28,6 +28,7 @@ class Message extends StatelessWidget {
this.longPressSelect, this.longPressSelect,
this.onSelect, this.onSelect,
this.onAvatarTab, this.onAvatarTab,
this.scrollToEventId,
this.selected, this.selected,
this.timeline}); this.timeline});
@ -53,9 +54,6 @@ class Message extends StatelessWidget {
[EventTypes.Message, EventTypes.Sticker].contains(nextEvent.type) [EventTypes.Message, EventTypes.Sticker].contains(nextEvent.type)
? nextEvent.sender.id == event.sender.id ? nextEvent.sender.id == event.sender.id
: false; : false;
var nip = sameSender
? BubbleNip.no
: ownMessage ? BubbleNip.rightBottom : BubbleNip.leftBottom;
var textColor = ownMessage var textColor = ownMessage
? Colors.white ? Colors.white
: Theme.of(context).brightness == Brightness.dark : Theme.of(context).brightness == Brightness.dark
@ -64,42 +62,44 @@ class Message extends StatelessWidget {
var rowMainAxisAlignment = var rowMainAxisAlignment =
ownMessage ? MainAxisAlignment.end : MainAxisAlignment.start; ownMessage ? MainAxisAlignment.end : MainAxisAlignment.start;
final displayEvent = event.getDisplayEvent(timeline);
if (event.showThumbnail) { if (event.showThumbnail) {
color = Theme.of(context).scaffoldBackgroundColor.withOpacity(0.66); color = Theme.of(context).scaffoldBackgroundColor;
textColor = Theme.of(context).textTheme.bodyText2.color; textColor = Theme.of(context).textTheme.bodyText2.color;
} else if (ownMessage) { } else if (ownMessage) {
color = event.status == -1 color = displayEvent.status == -1
? Colors.redAccent ? Colors.redAccent
: Theme.of(context).primaryColor; : Theme.of(context).primaryColor;
} }
final radius = 16.0;
var rowChildren = <Widget>[ var rowChildren = <Widget>[
Expanded( Expanded(
child: Bubble(
elevation: 0,
radius: Radius.circular(8),
alignment: alignment,
margin: BubbleEdges.symmetric(horizontal: 4),
color: color,
nip: nip,
child: Container( child: Container(
constraints: alignment: alignment,
BoxConstraints(maxWidth: AdaptivePageLayout.defaultMinWidth), child: Container(
margin: const EdgeInsets.symmetric(horizontal: 8),
padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 10),
decoration: BoxDecoration(
color: color,
borderRadius: BorderRadius.circular(radius),
),
child: Stack( child: Stack(
children: <Widget>[ children: <Widget>[
Column( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
if (event.isReply) if (event.relationshipType == RelationshipTypes.Reply)
FutureBuilder<Event>( FutureBuilder<Event>(
future: event.getReplyEvent(timeline), future: event.getReplyEvent(timeline),
builder: (BuildContext context, snapshot) { builder: (BuildContext context, snapshot) {
final replyEvent = snapshot.hasData final replyEvent = snapshot.hasData
? snapshot.data ? snapshot.data
: Event( : Event(
eventId: event.content['m.relates_to'] eventId: event.relationshipEventId,
['m.in_reply_to']['event_id'],
content: {'msgtype': 'm.text', 'body': '...'}, content: {'msgtype': 'm.text', 'body': '...'},
senderId: event.senderId, senderId: event.senderId,
type: 'm.room.message', type: 'm.room.message',
@ -108,20 +108,29 @@ class Message extends StatelessWidget {
status: 1, status: 1,
originServerTs: DateTime.now(), originServerTs: DateTime.now(),
); );
return Container( return InkWell(
child: AbsorbPointer(
child: Container(
margin: EdgeInsets.symmetric(vertical: 4.0), margin: EdgeInsets.symmetric(vertical: 4.0),
child: child: ReplyContent(replyEvent,
ReplyContent(replyEvent, lightText: ownMessage), lightText: ownMessage, timeline: timeline),
),
),
onTap: () {
if (scrollToEventId != null) {
scrollToEventId(replyEvent.eventId);
}
},
); );
}, },
), ),
MessageContent( MessageContent(
event, displayEvent,
textColor: textColor, textColor: textColor,
), ),
if (event.type == EventTypes.Encrypted && if (displayEvent.type == EventTypes.Encrypted &&
event.messageType == MessageTypes.BadEncrypted && displayEvent.messageType == MessageTypes.BadEncrypted &&
event.content['can_request_session'] == true) displayEvent.content['can_request_session'] == true)
RaisedButton( RaisedButton(
color: color.withAlpha(100), color: color.withAlpha(100),
child: Text( child: Text(
@ -129,15 +138,18 @@ class Message extends StatelessWidget {
style: TextStyle(color: textColor), style: TextStyle(color: textColor),
), ),
onPressed: () => SimpleDialogs(context) onPressed: () => SimpleDialogs(context)
.tryRequestWithLoadingDialog(event.requestKey()), .tryRequestWithLoadingDialog(
displayEvent.requestKey()),
), ),
SizedBox(height: 4), SizedBox(height: 4),
Opacity( Opacity(
opacity: 0, opacity: 0,
child: _MetaRow( child: _MetaRow(
event, event, // meta information should be from the unedited event
ownMessage, ownMessage,
textColor, textColor,
timeline,
displayEvent,
), ),
), ),
], ],
@ -150,6 +162,8 @@ class Message extends StatelessWidget {
event, event,
ownMessage, ownMessage,
textColor, textColor,
timeline,
displayEvent,
), ),
), ),
], ],
@ -170,26 +184,45 @@ class Message extends StatelessWidget {
} else { } else {
rowChildren.insert(0, avatarOrSizedBox); rowChildren.insert(0, avatarOrSizedBox);
} }
final row = Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: rowMainAxisAlignment,
children: rowChildren,
);
Widget container;
if (event.hasAggregatedEvents(timeline, RelationshipTypes.Reaction)) {
container = Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment:
ownMessage ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: <Widget>[
row,
Padding(
padding: EdgeInsets.only(
top: 4.0,
left: (ownMessage ? 0 : Avatar.defaultSize) + 12.0,
right: (ownMessage ? Avatar.defaultSize : 0) + 12.0,
),
child: MessageReactions(event, timeline),
),
],
);
} else {
container = row;
}
return InkWell( return InkWell(
onHover: (b) => useMouse = true, onHover: (b) => useMouse = true,
onTap: !useMouse && longPressSelect ? () => null : () => onSelect(event), onTap: !useMouse && longPressSelect ? () => null : () => onSelect(event),
splashColor: Theme.of(context).primaryColor.withAlpha(100), splashColor: Theme.of(context).primaryColor.withAlpha(100),
onLongPress: !longPressSelect ? null : () => onSelect(event), onLongPress: !longPressSelect ? null : () => onSelect(event),
child: AnimatedContainer( child: Container(
duration: Duration(milliseconds: 300),
curve: Curves.fastOutSlowIn,
color: selected color: selected
? Theme.of(context).primaryColor.withAlpha(100) ? Theme.of(context).primaryColor.withAlpha(100)
: Theme.of(context).primaryColor.withAlpha(0), : Theme.of(context).primaryColor.withAlpha(0),
child: Padding( child: Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(left: 8.0, right: 8.0, bottom: 8.0),
left: 8.0, right: 8.0, bottom: sameSender ? 4.0 : 8.0), child: container,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: rowMainAxisAlignment,
children: rowChildren,
),
), ),
), ),
); );
@ -200,8 +233,12 @@ class _MetaRow extends StatelessWidget {
final Event event; final Event event;
final bool ownMessage; final bool ownMessage;
final Color color; final Color color;
final Timeline timeline;
final Event displayEvent;
const _MetaRow(this.event, this.ownMessage, this.color, {Key key}) const _MetaRow(
this.event, this.ownMessage, this.color, this.timeline, this.displayEvent,
{Key key})
: super(key: key); : super(key: key);
@override @override
@ -218,21 +255,30 @@ class _MetaRow extends StatelessWidget {
style: TextStyle( style: TextStyle(
fontSize: 11, fontSize: 11,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: displayname.color, color: displayname.color.withAlpha(200),
), ),
), ),
if (showDisplayname) SizedBox(width: 4), if (showDisplayname) SizedBox(width: 4),
Text( Text(
event.originServerTs.localizedTime(context), event.originServerTs.localizedTime(context),
style: TextStyle( style: TextStyle(
color: color, color: color.withAlpha(200),
fontSize: 11, fontSize: 11,
), ),
), ),
if (event.hasAggregatedEvents(timeline, RelationshipTypes.Edit))
Padding(
padding: const EdgeInsets.only(left: 2.0),
child: Icon(
Icons.edit,
size: 12,
color: color,
),
),
if (ownMessage) SizedBox(width: 2), if (ownMessage) SizedBox(width: 2),
if (ownMessage) if (ownMessage)
Icon( Icon(
event.statusIcon, displayEvent.statusIcon,
size: 12, size: 12,
color: color, color: color,
), ),

View file

@ -1,9 +1,9 @@
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/chat.dart'; import 'package:fluffychat/views/chat.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../avatar.dart'; import '../avatar.dart';
import '../matrix.dart'; import '../matrix.dart';
@ -71,7 +71,9 @@ class ParticipantListItem extends StatelessWidget {
}; };
final permissionBatch = user.powerLevel == 100 final permissionBatch = user.powerLevel == 100
? L10n.of(context).admin ? L10n.of(context).admin
: user.powerLevel >= 50 ? L10n.of(context).moderator : ''; : user.powerLevel >= 50
? L10n.of(context).moderator
: '';
var items = <PopupMenuEntry<String>>[]; var items = <PopupMenuEntry<String>>[];
if (user.id != Matrix.of(context).client.userID) { if (user.id != Matrix.of(context).client.userID) {

View file

@ -1,83 +0,0 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/dialogs/presence_dialog.dart';
import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/chat.dart';
import 'package:flutter/material.dart';
import '../avatar.dart';
import '../matrix.dart';
class PresenceListItem extends StatelessWidget {
final Room room;
const PresenceListItem(this.room);
void _startChatAction(BuildContext context, String userId) async {
final roomId = await User(userId,
room: Room(client: Matrix.of(context).client, id: ''))
.startDirectChat();
await Navigator.of(context).pushAndRemoveUntil(
AppRoute.defaultRoute(
context,
ChatView(roomId),
),
(Route r) => r.isFirst);
}
@override
Widget build(BuildContext context) {
final user = room.getUserByMXIDSync(room.directChatMatrixID);
final presence =
Matrix.of(context).client.presences[room.directChatMatrixID];
return InkWell(
onTap: () => presence?.presence?.statusMsg == null
? _startChatAction(context, user.id)
: showDialog(
context: context,
builder: (_) => PresenceDialog(
presence,
avatarUrl: user.avatarUrl,
displayname: user.calcDisplayname(),
),
),
child: Container(
width: 80,
child: Column(
children: <Widget>[
SizedBox(height: 16),
Container(
child: Avatar(user.avatarUrl, user.calcDisplayname()),
decoration: BoxDecoration(
border: Border.all(
width: 1,
color: presence?.presence?.statusMsg == null
? presence?.presence?.currentlyActive == true
? Colors.blue
: Theme.of(context).secondaryHeaderColor
: Theme.of(context).primaryColor,
),
borderRadius: BorderRadius.circular(80),
),
padding: EdgeInsets.all(2),
),
Padding(
padding: const EdgeInsets.only(left: 6.0, top: 0.0, right: 6.0),
child: Text(
user.calcDisplayname().trim().split(' ').first,
overflow: TextOverflow.clip,
maxLines: 1,
style: TextStyle(
color: Theme.of(context)
.textTheme
.bodyText2
.color
.withOpacity(0.66),
fontSize: 13,
),
),
),
],
),
),
);
}
}

View file

@ -2,8 +2,8 @@ import 'package:famedlysdk/famedlysdk.dart';
import 'package:famedlysdk/matrix_api.dart'; import 'package:famedlysdk/matrix_api.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../../l10n/l10n.dart';
import '../../utils/app_route.dart'; import '../../utils/app_route.dart';
import '../../views/chat.dart'; import '../../views/chat.dart';
import '../avatar.dart'; import '../avatar.dart';
@ -28,10 +28,8 @@ class PublicRoomListItem extends StatelessWidget {
} }
Future<String> _joinRoomAndWait(BuildContext context) async { Future<String> _joinRoomAndWait(BuildContext context) async {
final roomId = await Matrix.of(context) final roomId =
.client await Matrix.of(context).client.joinRoomOrAlias(publicRoomEntry.roomId);
.api
.joinRoomOrAlias(publicRoomEntry.roomId);
if (Matrix.of(context).client.getRoomById(roomId) == null) { if (Matrix.of(context).client.getRoomById(roomId) == null) {
await Matrix.of(context) await Matrix.of(context)
.client .client

View file

@ -1,7 +1,7 @@
import 'package:bubble/bubble.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/matrix_locals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
class StateMessage extends StatelessWidget { class StateMessage extends StatelessWidget {
final Event event; final Event event;
@ -16,12 +16,15 @@ class StateMessage extends StatelessWidget {
right: 8.0, right: 8.0,
bottom: 8.0, bottom: 8.0,
), ),
child: Bubble( child: Center(
elevation: 0, child: Container(
color: Theme.of(context).backgroundColor.withOpacity(0.66), padding: const EdgeInsets.all(4),
alignment: Alignment.center, decoration: BoxDecoration(
color: Theme.of(context).backgroundColor.withOpacity(0.8),
borderRadius: BorderRadius.circular(7),
),
child: Text( child: Text(
event.getLocalizedBody(L10n.of(context)), event.getLocalizedBody(MatrixLocals(L10n.of(context))),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
color: Theme.of(context).textTheme.bodyText2.color, color: Theme.of(context).textTheme.bodyText2.color,
@ -29,6 +32,7 @@ class StateMessage extends StatelessWidget {
), ),
), ),
), ),
),
); );
} }
} }

View file

@ -0,0 +1,83 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/utils/user_status.dart';
import 'package:fluffychat/views/status_view.dart';
import 'package:flutter/material.dart';
import '../avatar.dart';
import '../matrix.dart';
class StatusListItem extends StatelessWidget {
final UserStatus status;
const StatusListItem(this.status, {Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
final client = Matrix.of(context).client;
return FutureBuilder<Profile>(
future: client.getProfileFromUserId(status.userId),
builder: (context, snapshot) {
final profile =
snapshot.data ?? Profile(client.userID, Uri.parse(''));
return InkWell(
borderRadius: BorderRadius.circular(8),
onTap: () => Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => StatusView(
status: status,
avatarUrl: profile.avatarUrl,
displayname: profile.displayname,
),
),
),
child: Container(
width: 76,
child: Column(
children: <Widget>[
SizedBox(height: 10),
Container(
child: Stack(
children: [
Avatar(profile.avatarUrl, profile.displayname),
Positioned(
bottom: 0,
right: 0,
child: Container(
width: 10,
height: 10,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: Colors.green,
),
),
),
],
),
decoration: BoxDecoration(
border: Border.all(
width: 1,
color: Theme.of(context).primaryColor,
),
borderRadius: BorderRadius.circular(80),
),
padding: EdgeInsets.all(2),
),
Padding(
padding:
const EdgeInsets.only(left: 6.0, top: 0.0, right: 6.0),
child: Text(
profile.displayname.trim().split(' ').first,
overflow: TextOverflow.clip,
maxLines: 1,
style: TextStyle(
color: Theme.of(context).textTheme.bodyText2.color,
fontSize: 13,
),
),
),
],
),
),
);
});
}
}

View file

@ -1,25 +1,30 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:famedlysdk/encryption.dart'; import 'package:famedlysdk/encryption.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/utils/firebase_controller.dart'; import 'package:fluffychat/utils/firebase_controller.dart';
import 'package:fluffychat/utils/matrix_locals.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/utils/user_status.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:localstorage/localstorage.dart'; import 'package:localstorage/localstorage.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:universal_html/prefer_universal/html.dart' as html; import 'package:universal_html/prefer_universal/html.dart' as html;
import '../l10n/l10n.dart'; import 'package:url_launcher/url_launcher.dart';
import '../utils/app_route.dart';
import '../utils/beautify_string_extension.dart'; import '../utils/beautify_string_extension.dart';
import '../utils/famedlysdk_store.dart'; import '../utils/famedlysdk_store.dart';
import 'avatar.dart'; import '../utils/presence_extension.dart';
import '../views/key_verification.dart'; import '../views/key_verification.dart';
import '../utils/app_route.dart'; import 'avatar.dart';
class Matrix extends StatefulWidget { class Matrix extends StatefulWidget {
static const String callNamespace = 'chat.fluffy.jitsi_call'; static const String callNamespace = 'chat.fluffy.jitsi_call';
static const String defaultHomeserver = 'tchncs.de';
final Widget child; final Widget child;
@ -79,7 +84,7 @@ class MatrixState extends State<Matrix> {
var initLoginState = client.onLoginStateChanged.stream.first; var initLoginState = client.onLoginStateChanged.stream.first;
client.database = await getDatabase(client); client.database = await getDatabase(client);
client.connect(); client.connect();
if (await initLoginState == LoginState.logged && !kIsWeb) { if (await initLoginState == LoginState.logged && PlatformInfos.isMobile) {
await FirebaseController.setupFirebase( await FirebaseController.setupFirebase(
this, this,
widget.clientName, widget.clientName,
@ -102,6 +107,9 @@ class MatrixState extends State<Matrix> {
StreamSubscription onKeyVerificationRequestSub; StreamSubscription onKeyVerificationRequestSub;
StreamSubscription onJitsiCallSub; StreamSubscription onJitsiCallSub;
StreamSubscription onNotification; StreamSubscription onNotification;
StreamSubscription<html.Event> onFocusSub;
StreamSubscription<html.Event> onBlurSub;
StreamSubscription onPresenceSub;
void onJitsiCall(EventUpdate eventUpdate) { void onJitsiCall(EventUpdate eventUpdate) {
final event = Event.fromJson( final event = Event.fromJson(
@ -158,12 +166,15 @@ class MatrixState extends State<Matrix> {
return; return;
} }
bool webHasFocus = true;
void _showWebNotification(EventUpdate eventUpdate) async { void _showWebNotification(EventUpdate eventUpdate) async {
if (webHasFocus && activeRoomId == eventUpdate.roomID) return;
final room = client.getRoomById(eventUpdate.roomID); final room = client.getRoomById(eventUpdate.roomID);
if (room.notificationCount == 0) return; if (room.notificationCount == 0) return;
final event = Event.fromJson(eventUpdate.content, room); final event = Event.fromJson(eventUpdate.content, room);
final body = event.getLocalizedBody( final body = event.getLocalizedBody(
L10n.of(context), MatrixLocals(L10n.of(context)),
withSenderNamePrefix: withSenderNamePrefix:
!room.isDirectChat || room.lastEvent.senderId == client.userID, !room.isDirectChat || room.lastEvent.senderId == client.userID,
); );
@ -172,7 +183,7 @@ class MatrixState extends State<Matrix> {
..autoplay = true ..autoplay = true
..load(); ..load();
html.Notification( html.Notification(
room.getLocalizedDisplayname(L10n.of(context)), room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))),
body: body, body: body,
icon: event.sender.avatarUrl?.getThumbnail(client, icon: event.sender.avatarUrl?.getThumbnail(client,
width: 64, height: 64, method: ThumbnailMethod.crop) ?? width: 64, height: 64, method: ThumbnailMethod.crop) ??
@ -184,6 +195,16 @@ class MatrixState extends State<Matrix> {
@override @override
void initState() { void initState() {
store = widget.store ?? Store(); store = widget.store ?? Store();
store.getItem('fluffychat.user_statuses').then(
(json) {
userStatuses = json == null
? []
: (jsonDecode(json)['user_statuses'] as List)
.map((j) => UserStatus.fromJson(j))
.toList();
_cleanUpUserStatus();
},
);
if (widget.client == null) { if (widget.client == null) {
debugPrint('[Matrix] Init matrix client'); debugPrint('[Matrix] Init matrix client');
final Set verificationMethods = <KeyVerificationMethod>{ final Set verificationMethods = <KeyVerificationMethod>{
@ -194,12 +215,14 @@ class MatrixState extends State<Matrix> {
verificationMethods.add(KeyVerificationMethod.emoji); verificationMethods.add(KeyVerificationMethod.emoji);
} }
client = Client(widget.clientName, client = Client(widget.clientName,
debug: false,
enableE2eeRecovery: true, enableE2eeRecovery: true,
verificationMethods: verificationMethods, verificationMethods: verificationMethods,
importantStateEvents: <String>{ importantStateEvents: <String>{
'im.ponies.room_emotes', // we want emotes to work properly 'im.ponies.room_emotes', // we want emotes to work properly
}); });
onPresenceSub ??= client.onPresence.stream
.where((p) => p.isUserStatus)
.listen(_storeUserStatus);
onJitsiCallSub ??= client.onEvent.stream onJitsiCallSub ??= client.onEvent.stream
.where((e) => .where((e) =>
e.type == 'timeline' && e.type == 'timeline' &&
@ -207,6 +230,7 @@ class MatrixState extends State<Matrix> {
e.content['content']['msgtype'] == Matrix.callNamespace && e.content['content']['msgtype'] == Matrix.callNamespace &&
e.content['sender'] != client.userID) e.content['sender'] != client.userID)
.listen(onJitsiCall); .listen(onJitsiCall);
onRoomKeyRequestSub ??= onRoomKeyRequestSub ??=
client.onRoomKeyRequest.stream.listen((RoomKeyRequest request) async { client.onRoomKeyRequest.stream.listen((RoomKeyRequest request) async {
final room = request.room; final room = request.room;
@ -262,11 +286,13 @@ class MatrixState extends State<Matrix> {
}); });
} }
if (kIsWeb) { if (kIsWeb) {
onFocusSub = html.window.onFocus.listen((_) => webHasFocus = true);
onBlurSub = html.window.onBlur.listen((_) => webHasFocus = false);
client.onSync.stream.first.then((s) { client.onSync.stream.first.then((s) {
html.Notification.requestPermission(); html.Notification.requestPermission();
onNotification ??= client.onEvent.stream onNotification ??= client.onEvent.stream
.where((e) => .where((e) =>
e.roomID != activeRoomId &&
e.type == 'timeline' && e.type == 'timeline' &&
[EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted] [EventTypes.Message, EventTypes.Sticker, EventTypes.Encrypted]
.contains(e.eventType) && .contains(e.eventType) &&
@ -277,12 +303,57 @@ class MatrixState extends State<Matrix> {
super.initState(); super.initState();
} }
List<UserStatus> userStatuses = [];
void _storeUserStatus(Presence presence) {
final currentStatusIndex =
userStatuses.indexWhere((u) => u.userId == presence.senderId);
final newUserStatus = UserStatus()
..receivedAt = DateTime.now().millisecondsSinceEpoch
..statusMsg = presence.presence.statusMsg
..userId = presence.senderId;
if (currentStatusIndex == -1) {
userStatuses.add(newUserStatus);
} else if (userStatuses[currentStatusIndex].statusMsg !=
presence.presence.statusMsg) {
if (presence.presence.statusMsg.trim().isEmpty) {
userStatuses.removeAt(currentStatusIndex);
} else {
userStatuses[currentStatusIndex] = newUserStatus;
}
} else {
return;
}
_cleanUpUserStatus();
}
void _cleanUpUserStatus() {
final now = DateTime.now().millisecondsSinceEpoch;
userStatuses
.removeWhere((u) => (now - u.receivedAt) > (1000 * 60 * 60 * 24));
userStatuses.sort((a, b) => b.receivedAt.compareTo(a.receivedAt));
if (userStatuses.length > 40) {
userStatuses.removeRange(40, userStatuses.length);
}
store.setItem(
'fluffychat.user_statuses',
jsonEncode(
{
'user_statuses': userStatuses.map((i) => i.toJson()).toList(),
},
),
);
}
@override @override
void dispose() { void dispose() {
onRoomKeyRequestSub?.cancel(); onRoomKeyRequestSub?.cancel();
onKeyVerificationRequestSub?.cancel(); onKeyVerificationRequestSub?.cancel();
onJitsiCallSub?.cancel(); onJitsiCallSub?.cancel();
onPresenceSub?.cancel();
onNotification?.cancel(); onNotification?.cancel();
onFocusSub?.cancel();
onBlurSub?.cancel();
super.dispose(); super.dispose();
} }
@ -303,12 +374,11 @@ class _InheritedMatrix extends InheritedWidget {
@override @override
bool updateShouldNotify(_InheritedMatrix old) { bool updateShouldNotify(_InheritedMatrix old) {
var update = var update = old.data.client.accessToken != data.client.accessToken ||
old.data.client.api.accessToken != data.client.api.accessToken ||
old.data.client.userID != data.client.userID || old.data.client.userID != data.client.userID ||
old.data.client.deviceID != data.client.deviceID || old.data.client.deviceID != data.client.deviceID ||
old.data.client.deviceName != data.client.deviceName || old.data.client.deviceName != data.client.deviceName ||
old.data.client.api.homeserver != data.client.api.homeserver; old.data.client.homeserver != data.client.homeserver;
return update; return update;
} }
} }

View file

@ -1,14 +1,17 @@
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/audio_player.dart'; import 'package:fluffychat/components/audio_player.dart';
import 'package:fluffychat/components/image_bubble.dart'; import 'package:fluffychat/components/image_bubble.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/event_extension.dart'; import 'package:fluffychat/utils/event_extension.dart';
import 'package:fluffychat/utils/matrix_locals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:link_text/link_text.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix_link_text/link_text.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import '../utils/url_launcher.dart';
import 'html_message.dart';
import 'matrix.dart'; import 'matrix.dart';
import 'message_download_content.dart'; import 'message_download_content.dart';
import 'html_message.dart';
class MessageContent extends StatelessWidget { class MessageContent extends StatelessWidget {
final Event event; final Event event;
@ -40,22 +43,25 @@ class MessageContent extends StatelessWidget {
case MessageTypes.Text: case MessageTypes.Text:
case MessageTypes.Notice: case MessageTypes.Notice:
case MessageTypes.Emote: case MessageTypes.Emote:
case MessageTypes.Reply:
if (Matrix.of(context).renderHtml && if (Matrix.of(context).renderHtml &&
!event.redacted && !event.redacted &&
event.content['format'] == 'org.matrix.custom.html' && event.isRichMessage) {
event.content['formatted_body'] is String) {
String html = event.content['formatted_body']; String html = event.content['formatted_body'];
if (event.messageType == MessageTypes.Emote) { if (event.messageType == MessageTypes.Emote) {
html = '* $html'; html = '* $html';
} }
final bigEmotes = event.onlyEmotes &&
event.numberEmotes > 0 &&
event.numberEmotes <= 10;
final fontSize = DefaultTextStyle.of(context).style.fontSize;
return HtmlMessage( return HtmlMessage(
html: html, html: html,
defaultTextStyle: TextStyle( defaultTextStyle: TextStyle(
color: textColor, color: textColor,
fontSize: DefaultTextStyle.of(context).style.fontSize, fontSize: bigEmotes ? fontSize * 3 : fontSize,
), ),
room: event.room, room: event.room,
emoteSize: bigEmotes ? fontSize * 3 : fontSize * 1.5,
); );
} }
// else we fall through to the normal message rendering // else we fall through to the normal message rendering
@ -78,13 +84,19 @@ class MessageContent extends StatelessWidget {
onPressed: () => launch(event.body), onPressed: () => launch(event.body),
); );
} }
final bigEmotes = event.onlyEmotes &&
event.numberEmotes > 0 &&
event.numberEmotes <= 10;
final fontSize = DefaultTextStyle.of(context).style.fontSize;
return LinkText( return LinkText(
text: event.getLocalizedBody(L10n.of(context), hideReply: true), text: event.getLocalizedBody(MatrixLocals(L10n.of(context)),
hideReply: true),
textStyle: TextStyle( textStyle: TextStyle(
color: textColor, color: textColor,
fontSize: DefaultTextStyle.of(context).style.fontSize, fontSize: bigEmotes ? fontSize * 3 : fontSize,
decoration: event.redacted ? TextDecoration.lineThrough : null, decoration: event.redacted ? TextDecoration.lineThrough : null,
), ),
onLinkTap: (url) => UrlLauncher(context, url).launchUrl(),
); );
} }
break; break;

View file

@ -0,0 +1,142 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'dialogs/simple_dialogs.dart';
import 'matrix.dart';
class MessageReactions extends StatelessWidget {
final Event event;
final Timeline timeline;
const MessageReactions(this.event, this.timeline);
@override
Widget build(BuildContext context) {
final allReactionEvents =
event.aggregatedEvents(timeline, RelationshipTypes.Reaction);
final reactionMap = <String, _ReactionEntry>{};
for (final e in allReactionEvents) {
if (e.content['m.relates_to'].containsKey('key')) {
final key = e.content['m.relates_to']['key'];
if (!reactionMap.containsKey(key)) {
reactionMap[key] = _ReactionEntry(
key: key,
count: 0,
reacted: false,
);
}
reactionMap[key].count++;
reactionMap[key].reacted |= e.senderId == e.room.client.userID;
}
}
final reactionList = reactionMap.values.toList();
reactionList.sort((a, b) => b.count - a.count > 0 ? 1 : -1);
return Wrap(
spacing: 4.0,
runSpacing: 4.0,
children: reactionList
.map((r) => _Reaction(
reactionKey: r.key,
count: r.count,
reacted: r.reacted,
onTap: () {
if (r.reacted) {
final evt = allReactionEvents.firstWhere(
(e) =>
e.senderId == e.room.client.userID &&
e.content['m.relates_to']['key'] == r.key,
orElse: () => null);
if (evt != null) {
SimpleDialogs(context)
.tryRequestWithLoadingDialog(evt.redact());
}
} else {
SimpleDialogs(context).tryRequestWithLoadingDialog(
event.room.sendReaction(event.eventId, r.key));
}
},
))
.toList(),
);
}
}
class _Reaction extends StatelessWidget {
final String reactionKey;
final int count;
final bool reacted;
final void Function() onTap;
const _Reaction({this.reactionKey, this.count, this.reacted, this.onTap});
@override
Widget build(BuildContext context) {
final borderColor = reacted
? Theme.of(context).primaryColor
: Theme.of(context).secondaryHeaderColor;
final textColor = Theme.of(context).brightness == Brightness.dark
? Colors.white
: Colors.black;
final color = Theme.of(context).secondaryHeaderColor;
final fontSize = DefaultTextStyle.of(context).style.fontSize;
final padding = fontSize / 5;
Widget content;
if (reactionKey.startsWith('mxc://')) {
final src = Uri.parse(reactionKey)?.getThumbnail(
Matrix.of(context).client,
width: 9999,
height: fontSize * MediaQuery.of(context).devicePixelRatio,
method: ThumbnailMethod.scale,
);
content = Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
CachedNetworkImage(
imageUrl: src,
height: fontSize,
),
Container(width: 4),
Text(count.toString(),
style: TextStyle(
color: textColor,
fontSize: DefaultTextStyle.of(context).style.fontSize,
)),
],
);
} else {
var renderKey = reactionKey;
if (renderKey.length > 10) {
renderKey = renderKey.substring(0, 7) + '...';
}
content = Text('$renderKey $count',
style: TextStyle(
color: textColor,
fontSize: DefaultTextStyle.of(context).style.fontSize,
));
}
return InkWell(
child: Container(
decoration: BoxDecoration(
color: color,
border: Border.all(
width: 1,
color: borderColor,
),
borderRadius: BorderRadius.circular(8),
),
padding: EdgeInsets.all(padding),
child: content,
),
onTap: () => onTap != null ? onTap() : null,
);
}
}
class _ReactionEntry {
String key;
int count;
bool reacted;
_ReactionEntry({this.key, this.count, this.reacted});
}

View file

@ -1,6 +1,7 @@
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/matrix_locals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'html_message.dart'; import 'html_message.dart';
import 'matrix.dart'; import 'matrix.dart';
@ -8,23 +9,29 @@ import 'matrix.dart';
class ReplyContent extends StatelessWidget { class ReplyContent extends StatelessWidget {
final Event replyEvent; final Event replyEvent;
final bool lightText; final bool lightText;
final Timeline timeline;
const ReplyContent(this.replyEvent, {this.lightText = false, Key key}) const ReplyContent(this.replyEvent,
{this.lightText = false, Key key, this.timeline})
: super(key: key); : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Widget replyBody; Widget replyBody;
if (replyEvent != null && final displayEvent = replyEvent != null && timeline != null
? replyEvent.getDisplayEvent(timeline)
: replyEvent;
if (displayEvent != null &&
Matrix.of(context).renderHtml && Matrix.of(context).renderHtml &&
[EventTypes.Message, EventTypes.Encrypted].contains(replyEvent.type) && [EventTypes.Message, EventTypes.Encrypted]
.contains(displayEvent.type) &&
[MessageTypes.Text, MessageTypes.Notice, MessageTypes.Emote] [MessageTypes.Text, MessageTypes.Notice, MessageTypes.Emote]
.contains(replyEvent.messageType) && .contains(displayEvent.messageType) &&
!replyEvent.redacted && !displayEvent.redacted &&
replyEvent.content['format'] == 'org.matrix.custom.html' && displayEvent.content['format'] == 'org.matrix.custom.html' &&
replyEvent.content['formatted_body'] is String) { displayEvent.content['formatted_body'] is String) {
String html = replyEvent.content['formatted_body']; String html = displayEvent.content['formatted_body'];
if (replyEvent.messageType == MessageTypes.Emote) { if (displayEvent.messageType == MessageTypes.Emote) {
html = '* $html'; html = '* $html';
} }
replyBody = HtmlMessage( replyBody = HtmlMessage(
@ -36,12 +43,12 @@ class ReplyContent extends StatelessWidget {
fontSize: DefaultTextStyle.of(context).style.fontSize, fontSize: DefaultTextStyle.of(context).style.fontSize,
), ),
maxLines: 1, maxLines: 1,
room: replyEvent.room, room: displayEvent.room,
); );
} else { } else {
replyBody = Text( replyBody = Text(
replyEvent?.getLocalizedBody( displayEvent?.getLocalizedBody(
L10n.of(context), MatrixLocals(L10n.of(context)),
withSenderNamePrefix: false, withSenderNamePrefix: false,
hideReply: true, hideReply: true,
) ?? ) ??
@ -71,7 +78,7 @@ class ReplyContent extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Text( Text(
(replyEvent?.sender?.calcDisplayname() ?? '') + ':', (displayEvent?.sender?.calcDisplayname() ?? '') + ':',
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(

View file

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../components/theme_switcher.dart';
import '../components/matrix.dart'; import '../components/matrix.dart';
import '../l10n/l10n.dart'; import '../components/theme_switcher.dart';
class ThemesSettings extends StatefulWidget { class ThemesSettings extends StatefulWidget {
@override @override

View file

@ -112,9 +112,13 @@ final ThemeData amoledTheme = ThemeData.dark().copyWith(
), ),
); );
Color chatListItemColor(BuildContext context, bool activeChat) => Color chatListItemColor(BuildContext context, bool activeChat, bool selected) =>
Theme.of(context).brightness == Brightness.light selected
? activeChat ? Color(0xFFE8E8E8) : Colors.white ? Theme.of(context).primaryColor.withAlpha(50)
: Theme.of(context).brightness == Brightness.light
? activeChat
? Color(0xFFE8E8E8)
: Colors.white
: activeChat : activeChat
? ThemeSwitcherWidget.of(context).amoledEnabled ? ThemeSwitcherWidget.of(context).amoledEnabled
? Color(0xff121212) ? Color(0xff121212)

View file

@ -0,0 +1,9 @@
abstract class AppConfig {
static const String applicationName = 'FluffyChat';
static const String defaultHomeserver = 'matrix.tchncs.de';
static const String privacyUrl = 'https://fluffychat.im/en/privacy.html';
static const String sourceCodeUrl =
'https://gitlab.com/ChristianPauly/fluffychat-flutter';
static const String supportUrl =
'https://gitlab.com/ChristianPauly/fluffychat-flutter/issues';
}

View file

@ -0,0 +1,30 @@
abstract class AppEmojis {
static const List<String> emojis = [
'👍',
'😊',
'😀',
'❤️',
'😍',
'😘',
'😇',
'😅',
'😭',
'😜',
'😱',
'😆',
'😉',
'😡',
'👋',
'🤔',
'🙁',
'🥳',
'😟',
'😄',
'😁',
'🙄',
'😂',
'🤣',
'😌',
'😬',
];
}

1706
lib/l10n/intl_ar.arb Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

1706
lib/l10n/intl_et.arb Normal file

File diff suppressed because it is too large Load diff

1671
lib/l10n/intl_eu.arb Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

1593
lib/l10n/intl_hy.arb Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

1600
lib/l10n/intl_tr.arb Normal file

File diff suppressed because it is too large Load diff

1607
lib/l10n/intl_uk.arb Normal file

File diff suppressed because it is too large Load diff

1
lib/l10n/intl_zh.arb Normal file
View file

@ -0,0 +1 @@
{}

1636
lib/l10n/intl_zh_Hans.arb Normal file

File diff suppressed because it is too large Load diff

View file

@ -1,106 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that looks up messages for specific locales by
// delegating to the appropriate library.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:implementation_imports, file_names, unnecessary_new
// ignore_for_file:unnecessary_brace_in_string_interps, directives_ordering
// ignore_for_file:argument_type_not_assignable, invalid_assignment
// ignore_for_file:prefer_single_quotes, prefer_generic_function_type_aliases
// ignore_for_file:comment_references
import 'dart:async';
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
import 'package:intl/src/intl_helpers.dart';
import 'messages_cs.dart' as messages_cs;
import 'messages_de.dart' as messages_de;
import 'messages_es.dart' as messages_es;
import 'messages_fr.dart' as messages_fr;
import 'messages_gl.dart' as messages_gl;
import 'messages_hr.dart' as messages_hr;
import 'messages_hu.dart' as messages_hu;
import 'messages_ja.dart' as messages_ja;
import 'messages_messages.dart' as messages_messages;
import 'messages_pl.dart' as messages_pl;
import 'messages_ru.dart' as messages_ru;
import 'messages_sk.dart' as messages_sk;
typedef Future<dynamic> LibraryLoader();
Map<String, LibraryLoader> _deferredLibraries = {
'cs': () => new Future.value(null),
'de': () => new Future.value(null),
'es': () => new Future.value(null),
'fr': () => new Future.value(null),
'gl': () => new Future.value(null),
'hr': () => new Future.value(null),
'hu': () => new Future.value(null),
'ja': () => new Future.value(null),
'messages': () => new Future.value(null),
'pl': () => new Future.value(null),
'ru': () => new Future.value(null),
'sk': () => new Future.value(null),
};
MessageLookupByLibrary _findExact(String localeName) {
switch (localeName) {
case 'cs':
return messages_cs.messages;
case 'de':
return messages_de.messages;
case 'es':
return messages_es.messages;
case 'fr':
return messages_fr.messages;
case 'gl':
return messages_gl.messages;
case 'hr':
return messages_hr.messages;
case 'hu':
return messages_hu.messages;
case 'ja':
return messages_ja.messages;
case 'messages':
return messages_messages.messages;
case 'pl':
return messages_pl.messages;
case 'ru':
return messages_ru.messages;
case 'sk':
return messages_sk.messages;
default:
return null;
}
}
/// User programs should call this before using [localeName] for messages.
Future<bool> initializeMessages(String localeName) async {
var availableLocale = Intl.verifiedLocale(
localeName, (locale) => _deferredLibraries[locale] != null,
onFailure: (_) => null);
if (availableLocale == null) {
return new Future.value(false);
}
var lib = _deferredLibraries[availableLocale];
await (lib == null ? new Future.value(false) : lib());
initializeInternalMessageLookup(() => new CompositeMessageLookup());
messageLookup.addLocale(availableLocale, _findGeneratedMessagesFor);
return new Future.value(true);
}
bool _messagesExistFor(String locale) {
try {
return _findExact(locale) != null;
} catch (e) {
return false;
}
}
MessageLookupByLibrary _findGeneratedMessagesFor(String locale) {
var actualLocale =
Intl.verifiedLocale(locale, _messagesExistFor, onFailure: (_) => null);
if (actualLocale == null) return null;
return _findExact(actualLocale);
}

View file

@ -1,525 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a cs locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'cs';
static m0(username) => "${username} přijali pozvání";
static m1(username) => "${username} aktivoval koncové šifrování";
static m2(username, targetName) => "${username} zabanoval ${targetName}";
static m3(homeserver) =>
"V základním nastavení budete připojeni do ${homeserver}";
static m4(username) => "${username} změnili svůj avatar";
static m5(username, description) =>
"${username} změnili popis diskuze na: „${description}";
static m6(username, chatname) =>
"${username} změnili jméno diskuze na: „${chatname}";
static m7(username) => "${username} změnili nastavení oprávnění v diskuzi";
static m8(username, displayname) =>
"${username} změnili přezdívku na: ${displayname}";
static m9(username) => "${username} změnili přístupová práva pro hosty";
static m10(username, rules) =>
"${username} změnili přístupová práva pro hosty na: ${rules}";
static m11(username) =>
"${username} změnili nastavení viditelnosti historie diskuze";
static m12(username, rules) =>
"${username} změnili nastavení viditelnosti historie diskuze na: ${rules}";
static m13(username) => "${username} změnili nastavení pravidel připojení";
static m14(username, joinRules) =>
"${username} změnili nastavení pravidel připojení na: ${joinRules}";
static m15(username) => "${username} změnili nastavení profilového avataru";
static m16(username) => "${username} změnili nastavení aliasů místnosti";
static m17(username) => "${username} změnili odkaz k pozvání do místnosti";
static m18(error) => "Nebylo možné dešifrovat zprávu: ${error}";
static m19(count) => "${count} účastníků";
static m20(username) => "${username} založil diskuzi";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${day}. ${month}. ${year}";
static m23(month, day) => "${day}.${month}";
static m24(displayname) => "Skupina s ${displayname}";
static m25(username, targetName) =>
"${username} vzal zpět pozvání pro ${targetName}";
static m26(groupName) => "Pozvat kontakt do ${groupName}";
static m27(username, link) => "";
static m28(username, targetName) => "${username} pozvali ${targetName}";
static m29(username) => "${username} se připojili do diskuze";
static m30(username, targetName) => "${username} vyhodil ${targetName}";
static m31(username, targetName) =>
"${username} vyhodil a zabanoval ${targetName}";
static m32(localizedTimeShort) => "Naposledy aktivní: ${localizedTimeShort}";
static m33(count) => "Načíst dalších ${count} účastníků";
static m34(homeserver) => "Přihlášení k ${homeserver}";
static m35(number) => "${number} vybráno";
static m36(fileName) => "Přehrát (fileName}";
static m37(username) => "${username} odstranili událost";
static m38(username) => "${username} odmítli pozvání";
static m39(username) => "Odstraněno ${username}";
static m40(username) => "Viděno uživatelem ${username}";
static m41(username, count) =>
"Viděno uživateli ${username} a ${count} dalšími";
static m42(username, username2) =>
"Viděno uživateli ${username} a ${username2}";
static m43(username) => "${username} poslali soubor";
static m44(username) => "${username} poslali obrázek";
static m45(username) => "${username} poslali samolepku";
static m46(username) => "${username} poslali video";
static m47(username) => "${username} poslali zvukovou nahrávku";
static m48(username) => "${username} nasdíleli lokaci";
static m49(hours12, hours24, minutes, suffix) => "${hours24}:${minutes}";
static m50(username, targetName) => "";
static m51(type) => "Neznámá událost „${type}";
static m52(unreadCount) => "${unreadCount} nepřečtených diskuzí";
static m53(unreadEvents) => "${unreadEvents} nepřečtených zpráv";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} nepřečtených zpráv v ${unreadChats}";
static m55(username, count) => "${username} a ${count} dalších píší…";
static m56(username, username2) => "${username} a ${username2} píší…";
static m57(username) => "${username} píše…";
static m58(username) => "${username} opustili diskuzi";
static m59(username, type) => "${username} poslal událost ${type}";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(Volitelné) Název skupiny"),
"About": MessageLookupByLibrary.simpleMessage("O aplikaci"),
"Accept": MessageLookupByLibrary.simpleMessage("Přijmout"),
"Account": MessageLookupByLibrary.simpleMessage("Účet"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Informace o účtu"),
"Add a group description":
MessageLookupByLibrary.simpleMessage("Přidat popis skupiny"),
"Admin": MessageLookupByLibrary.simpleMessage("Administrátor"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("Máte již účet?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Kdokoliv se může připojit"),
"Archive": MessageLookupByLibrary.simpleMessage("Archiv"),
"Archived Room":
MessageLookupByLibrary.simpleMessage("Archivované místnosti"),
"Are guest users allowed to join":
MessageLookupByLibrary.simpleMessage("Mohou se připojit hosté"),
"Are you sure?": MessageLookupByLibrary.simpleMessage("Jste si jisti?"),
"Authentication": MessageLookupByLibrary.simpleMessage("Autentizace"),
"Avatar has been changed":
MessageLookupByLibrary.simpleMessage("Avatar byl změněn"),
"Ban from chat":
MessageLookupByLibrary.simpleMessage("Zabanovat z diskuze"),
"Banned": MessageLookupByLibrary.simpleMessage("Zabanován"),
"Cancel": MessageLookupByLibrary.simpleMessage("Zrušit"),
"Change the homeserver":
MessageLookupByLibrary.simpleMessage("Změnit použitý server"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Změnit název skupiny"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Změnit server"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Změnit pozadí"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Nastavte svůj styl"),
"Changelog": MessageLookupByLibrary.simpleMessage("Historie změn"),
"Chat": MessageLookupByLibrary.simpleMessage("Diskuze"),
"Chat details": MessageLookupByLibrary.simpleMessage("Detail diskuze"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("Vyberte silné heslo"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("Vyberte uživatelské jméno"),
"Close": MessageLookupByLibrary.simpleMessage("Zavřít"),
"Confirm": MessageLookupByLibrary.simpleMessage("Potvrdit"),
"Connect": MessageLookupByLibrary.simpleMessage("Připojit"),
"Connection attempt failed":
MessageLookupByLibrary.simpleMessage("Pokus o připojení selhal"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"Kontakt byl pozván do skupiny"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Prohlížeč obsahu"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Zkopírováno do schránky"),
"Copy": MessageLookupByLibrary.simpleMessage("Kopírovat"),
"Could not set avatar": MessageLookupByLibrary.simpleMessage(
"Nebylo možné nastavit avatar"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"Nebylo možné nastavit přezdívku uživatele"),
"Create": MessageLookupByLibrary.simpleMessage("Vytvořit"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Vytvořit účet teď"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Založit skupinu"),
"Currently active":
MessageLookupByLibrary.simpleMessage("Momentálně aktivní"),
"Dark": MessageLookupByLibrary.simpleMessage("Tmavý"),
"Delete": MessageLookupByLibrary.simpleMessage("Smazat"),
"Delete message": MessageLookupByLibrary.simpleMessage("Smazat zprávu"),
"Deny": MessageLookupByLibrary.simpleMessage("Zakázat"),
"Device": MessageLookupByLibrary.simpleMessage("Zařízení"),
"Devices": MessageLookupByLibrary.simpleMessage("Zařízení"),
"Discard picture":
MessageLookupByLibrary.simpleMessage("Vyřadit obrázek"),
"Displayname has been changed":
MessageLookupByLibrary.simpleMessage("Přezdívka byla změněna"),
"Donate": MessageLookupByLibrary.simpleMessage("Přispějte"),
"Download file":
MessageLookupByLibrary.simpleMessage("Stáhnout soubor"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Nastavení instance Jitsi"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Změnit přezdívku"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Nastavení emotikon"),
"Emote shortcode":
MessageLookupByLibrary.simpleMessage("Označení emotikony"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Prázdná diskuze"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Šifrovací algoritmus"),
"Encryption is not enabled":
MessageLookupByLibrary.simpleMessage("Šifrování není aktivní"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"Koncové šifrování je momentálně v Beta verzi! Používejte na vlastní nebezpečí!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Nastavení koncového šifrování"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Zadejte jméno skupiny"),
"Enter a username":
MessageLookupByLibrary.simpleMessage("Zadejte uživatelské jméno"),
"Enter your homeserver":
MessageLookupByLibrary.simpleMessage("Zadejte adresu serveru"),
"File name": MessageLookupByLibrary.simpleMessage("Název souboru"),
"File size": MessageLookupByLibrary.simpleMessage("Velikost souboru"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Přeposlat"),
"Friday": MessageLookupByLibrary.simpleMessage("Pátek"),
"From joining": MessageLookupByLibrary.simpleMessage("Od připojení"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("Od pozvání"),
"Group": MessageLookupByLibrary.simpleMessage("Skupina"),
"Group description":
MessageLookupByLibrary.simpleMessage("Popis skupiny"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage("Popis skupiny byl změněn"),
"Group is public":
MessageLookupByLibrary.simpleMessage("Skupina je veřejná"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("Hosté jsou zakázáni"),
"Guests can join":
MessageLookupByLibrary.simpleMessage("Hosté se mohou připojit"),
"Help": MessageLookupByLibrary.simpleMessage("Pomoc"),
"Homeserver is not compatible":
MessageLookupByLibrary.simpleMessage("Server není kompatibilní"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("Jak se máte?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("Identita"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Pozvat kontakt"),
"Invited": MessageLookupByLibrary.simpleMessage("Pozváni"),
"Invited users only":
MessageLookupByLibrary.simpleMessage("Pouze pozvaní uživatelé"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"Vypadá to, že váš telefon nemá nainstalovány google services. Dobré rozhodnutí pro vaši bezpečnost! Pro příjem notifikací doporučujeme použít miocroG: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Vyhodit z diskuze"),
"Last seen IP":
MessageLookupByLibrary.simpleMessage("Naposledy viděná IP"),
"Leave": MessageLookupByLibrary.simpleMessage("Odejít"),
"Left the chat":
MessageLookupByLibrary.simpleMessage("Odešel z diskuze"),
"License": MessageLookupByLibrary.simpleMessage("Licence"),
"Light": MessageLookupByLibrary.simpleMessage("Světlý"),
"Load more...": MessageLookupByLibrary.simpleMessage("Načíst další…"),
"Loading... Please wait":
MessageLookupByLibrary.simpleMessage("Načítání… Prosíme počkejte"),
"Login": MessageLookupByLibrary.simpleMessage("Přihlášení"),
"Logout": MessageLookupByLibrary.simpleMessage("Odhlásit"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Učiň moderátorem"),
"Make an admin": MessageLookupByLibrary.simpleMessage("Učiň adminem"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Ujistěte se, že je identifikátor validní"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"Zpráva bude odstraněna pro všechny účastníky"),
"Moderator": MessageLookupByLibrary.simpleMessage("Moderátor"),
"Monday": MessageLookupByLibrary.simpleMessage("Pondělí"),
"Mute chat": MessageLookupByLibrary.simpleMessage("Ztišit diskuzi"),
"New message in FluffyChat":
MessageLookupByLibrary.simpleMessage("Nová zpráva ve FluffyChatu"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Nová soukromá diskuze"),
"No emotes found. 😕": MessageLookupByLibrary.simpleMessage(
"Žádné emotikony nebyly nalezeny. 😕"),
"No permission":
MessageLookupByLibrary.simpleMessage("Chybí oprávnění"),
"No rooms found...": MessageLookupByLibrary.simpleMessage(
"Žádné místnosti nebyly nalezeny…"),
"None": MessageLookupByLibrary.simpleMessage("Nic"),
"Not supported in web":
MessageLookupByLibrary.simpleMessage("Nepodporováno na webu"),
"Oops something went wrong...":
MessageLookupByLibrary.simpleMessage("Ups! Něco se pokazilo…"),
"Open app to read messages": MessageLookupByLibrary.simpleMessage(
"Otevřete aplikaci pro přečtení zpráv"),
"Open camera":
MessageLookupByLibrary.simpleMessage("Otevřít fotoaparát"),
"Participating user devices": MessageLookupByLibrary.simpleMessage(
"Zúčastněná zařízení uživatele"),
"Password": MessageLookupByLibrary.simpleMessage("Heslo"),
"Pick image": MessageLookupByLibrary.simpleMessage("Zvolit obrázek"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(""),
"Please choose a username": MessageLookupByLibrary.simpleMessage(
"Prosíme zvolte si uživatelské jméno"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Prosíme zadejte identifikátor sítě matrix"),
"Please enter your password":
MessageLookupByLibrary.simpleMessage("Prosíme zadejte heslo"),
"Please enter your username": MessageLookupByLibrary.simpleMessage(
"Prosíme zadejte uživateslké jméno"),
"Public Rooms":
MessageLookupByLibrary.simpleMessage("Veřejné místnosti"),
"Recording": MessageLookupByLibrary.simpleMessage("Nahrávání"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Připojit znovu"),
"Remove": MessageLookupByLibrary.simpleMessage("Odstranit"),
"Remove all other devices": MessageLookupByLibrary.simpleMessage(
"Odstranit všechna další zařízení"),
"Remove device":
MessageLookupByLibrary.simpleMessage("Odstraň zařízení"),
"Remove exile": MessageLookupByLibrary.simpleMessage(""),
"Remove message":
MessageLookupByLibrary.simpleMessage("Odstranit zprávu"),
"Render rich message content":
MessageLookupByLibrary.simpleMessage("Zobrazit formátovaný obsah"),
"Reply": MessageLookupByLibrary.simpleMessage("Odpovědět"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Vyžádat oprávnění"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Vyžádat přečtení starších zpráv"),
"Revoke all permissions": MessageLookupByLibrary.simpleMessage(
"Vezmi zpět všechna oprávnění"),
"Saturday": MessageLookupByLibrary.simpleMessage("Sobota"),
"Search for a chat":
MessageLookupByLibrary.simpleMessage("Hledej diskuzi"),
"Seen a long time ago": MessageLookupByLibrary.simpleMessage(""),
"Send": MessageLookupByLibrary.simpleMessage("Odeslat"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Odeslat zprávu"),
"Send file": MessageLookupByLibrary.simpleMessage("Odeslat soubor"),
"Send image": MessageLookupByLibrary.simpleMessage("Odeslat obrázek"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("Nastavit profilový obrázek"),
"Set group description":
MessageLookupByLibrary.simpleMessage("Nastavit popis skupiny"),
"Set invitation link":
MessageLookupByLibrary.simpleMessage("Nastavit zvací odkaz"),
"Set status": MessageLookupByLibrary.simpleMessage("Nastavit status"),
"Settings": MessageLookupByLibrary.simpleMessage("Nastavení"),
"Share": MessageLookupByLibrary.simpleMessage("Sdílet"),
"Sign up": MessageLookupByLibrary.simpleMessage("Registrovat se"),
"Source code": MessageLookupByLibrary.simpleMessage("Zdrojové kódy"),
"Start your first chat :-)": MessageLookupByLibrary.simpleMessage(
"Začněte svou první diskuzi :)"),
"Sunday": MessageLookupByLibrary.simpleMessage("Neděle"),
"System": MessageLookupByLibrary.simpleMessage("Systém"),
"Tap to show menu":
MessageLookupByLibrary.simpleMessage("Klepněte pro zobrazení menu"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage("Šifrování bylo poškozeno"),
"This room has been archived.": MessageLookupByLibrary.simpleMessage(
"Tato místnost byla archivována."),
"Thursday": MessageLookupByLibrary.simpleMessage("Čtvrtek"),
"Try to send again": MessageLookupByLibrary.simpleMessage(""),
"Tuesday": MessageLookupByLibrary.simpleMessage(""),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Neznámé zařízení"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Neznámý šifrovací algoritmus"),
"Unmute chat": MessageLookupByLibrary.simpleMessage("Zrušit ztišení"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"Použít barvy kompatibilní s Amoled displayem?"),
"Username": MessageLookupByLibrary.simpleMessage("Uživatelské jméno"),
"Verify": MessageLookupByLibrary.simpleMessage("Ověř"),
"Video call": MessageLookupByLibrary.simpleMessage("Video hovor"),
"Visibility of the chat history": MessageLookupByLibrary.simpleMessage(
"Viditelnost historie diskuze"),
"Visible for all participants": MessageLookupByLibrary.simpleMessage(
"Viditelné pro všechny účastníky"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Viditelné pro všechny"),
"Voice message": MessageLookupByLibrary.simpleMessage("Hlasová zpráva"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Pozadí"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Středa"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Vítejte v nejroztomilejší diskuzní aplikaci pro síť matrix."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Kdo se může připojit do této skupiny"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Napište zprávu…"),
"Yes": MessageLookupByLibrary.simpleMessage("Ano"),
"You": MessageLookupByLibrary.simpleMessage("Ty"),
"You are invited to this chat":
MessageLookupByLibrary.simpleMessage("Jste zváni do této diskuze"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Této diskuze se nadále neúčastníte"),
"You cannot invite yourself":
MessageLookupByLibrary.simpleMessage("Nemůžete pozvat sami sebe"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Byli jste zabanováni z této diskuze"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Šifrování jiš nebude možné vypnout. Jste si tím jisti?"),
"Your own username": MessageLookupByLibrary.simpleMessage(
"Vaše vlastní uživatelské jméno"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("alias"),
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists":
MessageLookupByLibrary.simpleMessage("Emotikona již existuje"),
"emoteInvalid": MessageLookupByLibrary.simpleMessage(
"Nesprávné označení emotikony"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"Musíte zvolit označení emotikony a obrázek"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...": MessageLookupByLibrary.simpleMessage("píše…"),
"joinedTheChat": m29,
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("ok"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59
};
}

View file

@ -1,610 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a de locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'de';
static m0(username) => "${username} hat die Einladung akzeptiert";
static m1(username) =>
"${username} hat Ende-zu-Ende Verschlüsselung aktiviert";
static m60(username) => "Diese Bestätigungsanfrage von ${username} annehmen?";
static m2(username, targetName) => "${username} hat ${targetName} verbannt";
static m3(homeserver) => "Standardmäßig wirst Du mit ${homeserver} verbunden";
static m4(username) => "${username} hat den Chat-Avatar geändert";
static m5(username, description) =>
"${username} hat die Beschreibung vom Chat geändert zu: \'${description}\'";
static m6(username, chatname) =>
"${username} hat den Chat-Namen geändert zu: \'${chatname}\'";
static m7(username) => "${username} hat die Berechtigungen vom Chat geändert";
static m8(username, displayname) =>
"${username} hat den Nicknamen geändert zu: ${displayname}";
static m9(username) => "${username} hat Gast-Zugangsregeln geändert";
static m10(username, rules) =>
"${username} hat Gast-Zugangsregeln geändert zu: ${rules}";
static m11(username) =>
"${username} hat die Sichtbarkeit des Chat-Verlaufs geändert";
static m12(username, rules) =>
"${username} hat die Sichtbarkeit des Chat-Verlaufs geändert zu: ${rules}";
static m13(username) => "${username} hat die Zugangsregeln geändert";
static m14(username, joinRules) =>
"${username} hat die Zugangsregeln geändert zu: ${joinRules}";
static m15(username) => "${username} hat das Profilbild geändert";
static m16(username) => "${username} hat die Raum-Aliase geändert";
static m17(username) => "${username} hat den Einladungslink geändert";
static m18(error) => "Nachricht konnte nicht entschlüsselt werden: ${error}";
static m19(count) => "${count} Teilnehmer*innen";
static m20(username) => "${username} hat den Chat erstellt";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${day}. ${month}. ${year}";
static m23(month, day) => "${day}. ${month}";
static m24(displayname) => "Gruppe mit ${displayname}";
static m25(username, targetName) =>
"${username} hat die Einladung für ${targetName} zurückgezogen";
static m26(groupName) => "Kontakt in die Gruppe ${groupName} einladen";
static m27(username, link) =>
"${username} hat Dich zu FluffyChat eingeladen. \n1. Installiere FluffyChat: http://fluffy.chat \n2. Melde Dich in der App an \n3. Öffne den Einladungslink: ${link}";
static m28(username, targetName) =>
"${username} hat ${targetName} eingeladen";
static m29(username) => "${username} ist dem Chat beigetreten";
static m30(username, targetName) =>
"${username} hat ${targetName} hinausgeworfen";
static m31(username, targetName) =>
"${username} hat ${targetName} hinausgeworfen und verbannt";
static m32(localizedTimeShort) => "Zuletzt aktiv: ${localizedTimeShort}";
static m33(count) => "${count} weitere Teilnehmer*innen laden";
static m34(homeserver) => "Bei ${homeserver} anmelden";
static m35(number) => "${number} ausgewählt";
static m36(fileName) => "${fileName} abspielen";
static m37(username) => "${username} hat ein Event enternt";
static m38(username) => "${username} hat die Einladung abgelehnt";
static m39(username) => "Entfernt von ${username}";
static m40(username) => "Gelesen von ${username}";
static m41(username, count) => "Gelesen von ${username} und ${count} anderen";
static m42(username, username2) => "Gelesen von ${username} und ${username2}";
static m43(username) => "${username} hat eine Datei gesendet";
static m44(username) => "${username} hat ein Bild gesendet";
static m45(username) => "${username} hat einen Sticker gesendet";
static m46(username) => "${username} hat ein Video gesendet";
static m47(username) => "${username} hat eine Audio-Datei gesendet";
static m48(username) => "${username} hat den Standort geteilt";
static m49(hours12, hours24, minutes, suffix) => "${hours24}:${minutes}";
static m50(username, targetName) =>
"${username} hat die Verbannung von ${targetName} aufgehoben";
static m51(type) => "Unbekanntes Ereignis \'${type}\'";
static m52(unreadCount) => "${unreadCount} ungelesene Unterhaltungen";
static m53(unreadEvents) => "${unreadEvents} ungelesene Nachrichten";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} ungelesene Nachrichten in ${unreadChats} Chats";
static m55(username, count) =>
"${username} und ${count} andere schreiben ...";
static m56(username, username2) =>
"${username} und ${username2} schreiben ...";
static m57(username) => "${username} schreibt ...";
static m58(username) => "${username} hat den Chat verlassen";
static m59(username, type) => "${username} hat ${type} Event gesendet";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name": MessageLookupByLibrary.simpleMessage(
"(Optional) Name für die Gruppe"),
"About": MessageLookupByLibrary.simpleMessage("Über"),
"Accept": MessageLookupByLibrary.simpleMessage("Annehmen"),
"Account": MessageLookupByLibrary.simpleMessage("Konto"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Kontoinformationen"),
"Add a group description": MessageLookupByLibrary.simpleMessage(
"Eine Beschreibung für die Gruppe hinzufügen"),
"Admin": MessageLookupByLibrary.simpleMessage("Admin"),
"Already have an account?": MessageLookupByLibrary.simpleMessage(
"Hast du schon einen Account?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Jeder darf beitreten"),
"Archive": MessageLookupByLibrary.simpleMessage("Archiv"),
"Archived Room":
MessageLookupByLibrary.simpleMessage("Archivierter Raum"),
"Are guest users allowed to join": MessageLookupByLibrary.simpleMessage(
"Dürfen Gast-Benutzer beitreten"),
"Are you sure?":
MessageLookupByLibrary.simpleMessage("Bist Du sicher?"),
"Authentication":
MessageLookupByLibrary.simpleMessage("Authentifizierung"),
"Avatar has been changed":
MessageLookupByLibrary.simpleMessage("Avatar wurde geändert"),
"Ban from chat":
MessageLookupByLibrary.simpleMessage("Aus dem Chat verbannen"),
"Banned": MessageLookupByLibrary.simpleMessage("Verbannt"),
"Block Device": MessageLookupByLibrary.simpleMessage("Blockiere Gerät"),
"Cancel": MessageLookupByLibrary.simpleMessage("Abbrechen"),
"Change the homeserver": MessageLookupByLibrary.simpleMessage(
"Anderen Homeserver verwenden"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Gruppenname ändern"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Ändere den Server"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Hintergrund ändern"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Ändere Deinen Style"),
"Changelog":
MessageLookupByLibrary.simpleMessage("Protokoll der Änderungen"),
"Chat": MessageLookupByLibrary.simpleMessage("Chat"),
"Chat details": MessageLookupByLibrary.simpleMessage("Gruppeninfo"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("Wähle ein sicheres Passwort"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("Wähle einen Benutzernamen"),
"Close": MessageLookupByLibrary.simpleMessage("Schließen"),
"Confirm": MessageLookupByLibrary.simpleMessage("Bestätigen"),
"Connect": MessageLookupByLibrary.simpleMessage("Verbinden"),
"Connection attempt failed": MessageLookupByLibrary.simpleMessage(
"Verbindungsversuch fehlgeschlagen"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"Kontakt wurde in die Gruppe eingeladen"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Content Viewer"),
"Copied to clipboard": MessageLookupByLibrary.simpleMessage(
"Wurde in die Zwischenablage kopiert"),
"Copy": MessageLookupByLibrary.simpleMessage("Kopieren"),
"Could not set avatar": MessageLookupByLibrary.simpleMessage(
"Profilbild konnte nicht gesetzt werden"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"Anzeigename konnte nicht gesetzt werden"),
"Create": MessageLookupByLibrary.simpleMessage("Erstellen"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Account jetzt erstellen"),
"Create new group": MessageLookupByLibrary.simpleMessage("Neue Gruppe"),
"Currently active":
MessageLookupByLibrary.simpleMessage("Jetzt gerade online"),
"Dark": MessageLookupByLibrary.simpleMessage("Dunkel"),
"Delete": MessageLookupByLibrary.simpleMessage("Löschen"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Nachricht löschen"),
"Deny": MessageLookupByLibrary.simpleMessage("Ablehnen"),
"Device": MessageLookupByLibrary.simpleMessage("Gerät"),
"Devices": MessageLookupByLibrary.simpleMessage("Geräte"),
"Discard picture":
MessageLookupByLibrary.simpleMessage("Bild verwerfen"),
"Displayname has been changed":
MessageLookupByLibrary.simpleMessage("Anzeigename wurde geändert"),
"Donate": MessageLookupByLibrary.simpleMessage("Spenden"),
"Download file":
MessageLookupByLibrary.simpleMessage("Datei herunterladen"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Jitsi Instanz ändern"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Anzeigename ändern"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Emote Einstellungen"),
"Emote shortcode": MessageLookupByLibrary.simpleMessage("Emote kürzel"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Leerer Chat"),
"Encryption": MessageLookupByLibrary.simpleMessage("Verschlüsselung"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Verschlüsselungsalgorithmus"),
"Encryption is not enabled": MessageLookupByLibrary.simpleMessage(
"Verschlüsselung ist nicht aktiviert"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"Ende-zu-Ende-Verschlüsselung ist im Beta-Status. Benutzung auf eigene Gefahr!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Ende-zu-Ende-Verschlüsselung"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Gib einen Gruppennamen ein"),
"Enter a username":
MessageLookupByLibrary.simpleMessage("Gib einen Benutzernamen ein"),
"Enter your homeserver":
MessageLookupByLibrary.simpleMessage("Gib Deinen Homeserver ein"),
"File name": MessageLookupByLibrary.simpleMessage("Dateiname"),
"File size": MessageLookupByLibrary.simpleMessage("Dateigröße"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Weiterleiten"),
"Friday": MessageLookupByLibrary.simpleMessage("Freitag"),
"From joining": MessageLookupByLibrary.simpleMessage("Ab dem Beitritt"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("Ab der Einladung"),
"Group": MessageLookupByLibrary.simpleMessage("Gruppe"),
"Group description":
MessageLookupByLibrary.simpleMessage("Gruppenbeschreibung"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage(
"Gruppenbeschreibung wurde geändert"),
"Group is public":
MessageLookupByLibrary.simpleMessage("Öffentliche Gruppe"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("Gäste sind verboten"),
"Guests can join":
MessageLookupByLibrary.simpleMessage("Gäste dürfen beitreten"),
"Help": MessageLookupByLibrary.simpleMessage("Hilfe"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"Homeserver ist nicht kompatibel"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("Wie geht es dir heute?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("Identität"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Kontakt einladen"),
"Invited": MessageLookupByLibrary.simpleMessage("Eingeladen"),
"Invited users only":
MessageLookupByLibrary.simpleMessage("Nur eingeladene Benutzer"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"Es sieht so aus als hättest du keine Google Dienste auf deinem Gerät. Das ist eine gute Entscheidung für deine Privatsphäre. Um Push Benachrichtigungen in FluffyChat zu erhalten, empfehlen wir die Verwendung von microG: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Aus dem Chat hinauswerfen"),
"Last seen IP":
MessageLookupByLibrary.simpleMessage("Zuletzt bekannte IP"),
"Leave": MessageLookupByLibrary.simpleMessage("Verlassen"),
"Left the chat":
MessageLookupByLibrary.simpleMessage("Hat den Chat verlassen"),
"License": MessageLookupByLibrary.simpleMessage("Lizenz"),
"Light": MessageLookupByLibrary.simpleMessage("Hell"),
"Load more...": MessageLookupByLibrary.simpleMessage("Lade mehr ..."),
"Loading... Please wait":
MessageLookupByLibrary.simpleMessage("Lade ... Bitte warten"),
"Login": MessageLookupByLibrary.simpleMessage("Login"),
"Logout": MessageLookupByLibrary.simpleMessage("Abmelden"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Zum Moderator ernennen"),
"Make an admin":
MessageLookupByLibrary.simpleMessage("Zum Admin ernennen"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Gib bitte einen richtigen Benutzernamen ein"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"Nachricht wird für alle Teilnehmer*innen entfernt"),
"Moderator": MessageLookupByLibrary.simpleMessage("Moderator"),
"Monday": MessageLookupByLibrary.simpleMessage("Montag"),
"Mute chat": MessageLookupByLibrary.simpleMessage("Stummschalten"),
"New message in FluffyChat": MessageLookupByLibrary.simpleMessage(
"Neue Nachricht in FluffyChat"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Neuer privater Chat"),
"No emotes found. 😕":
MessageLookupByLibrary.simpleMessage("Keine Emotes gefunden. 😕"),
"No permission":
MessageLookupByLibrary.simpleMessage("Keine Berechtigung"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("Keine Räume gefunden ..."),
"None": MessageLookupByLibrary.simpleMessage("Keiner"),
"Not supported in web": MessageLookupByLibrary.simpleMessage(
"Wird in der Web-Version nicht unterstützt"),
"Oops something went wrong...": MessageLookupByLibrary.simpleMessage(
"Hoppla! Da ist etwas schief gelaufen ..."),
"Open app to read messages": MessageLookupByLibrary.simpleMessage(
"Öffne app, um Nachrichten zu lesen"),
"Open camera": MessageLookupByLibrary.simpleMessage("Kamera öffnen"),
"Participating user devices":
MessageLookupByLibrary.simpleMessage("Teilnehmende Geräte"),
"Password": MessageLookupByLibrary.simpleMessage("Passwort"),
"Pick image": MessageLookupByLibrary.simpleMessage("Wähle Bild"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Bitte beachte, dass du Pantalaimon brauchst, um Ende-zu-Ende-Verschlüsselung benutzen zu können."),
"Please choose a username": MessageLookupByLibrary.simpleMessage(
"Bitte wähle einen Benutzernamen"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Bitte eine Matrix ID eingeben"),
"Please enter your password": MessageLookupByLibrary.simpleMessage(
"Bitte dein Passwort eingeben"),
"Please enter your username": MessageLookupByLibrary.simpleMessage(
"Bitte deinen Benutzernamen eingeben"),
"Public Rooms":
MessageLookupByLibrary.simpleMessage("Öffentliche Räume"),
"Recording": MessageLookupByLibrary.simpleMessage("Aufnahme"),
"Reject": MessageLookupByLibrary.simpleMessage("Ablehnen"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Wieder beitreten"),
"Remove": MessageLookupByLibrary.simpleMessage("Entfernen"),
"Remove all other devices": MessageLookupByLibrary.simpleMessage(
"Alle anderen Geräte entfernen"),
"Remove device":
MessageLookupByLibrary.simpleMessage("Gerät entfernen"),
"Remove exile":
MessageLookupByLibrary.simpleMessage("Verbannung aufheben"),
"Remove message":
MessageLookupByLibrary.simpleMessage("Nachricht entfernen"),
"Render rich message content": MessageLookupByLibrary.simpleMessage(
"Zeige Nachrichtenformatierungen an"),
"Reply": MessageLookupByLibrary.simpleMessage("Antworten"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Berechtigung anfragen"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Anfrage um ältere Nachrichten zu lesen"),
"Revoke all permissions": MessageLookupByLibrary.simpleMessage(
"Alle Berechtigungen zurücknehmen"),
"Room has been upgraded":
MessageLookupByLibrary.simpleMessage("Der Raum wurde ge-upgraded"),
"Saturday": MessageLookupByLibrary.simpleMessage("Samstag"),
"Search for a chat":
MessageLookupByLibrary.simpleMessage("Chat suchen"),
"Seen a long time ago": MessageLookupByLibrary.simpleMessage(
"Vor sehr langer Zeit gesehen"),
"Send": MessageLookupByLibrary.simpleMessage("Senden"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Nachricht schreiben"),
"Send file": MessageLookupByLibrary.simpleMessage("Datei senden"),
"Send image": MessageLookupByLibrary.simpleMessage("Bild senden"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("Ein Profilbild festlegen"),
"Set group description": MessageLookupByLibrary.simpleMessage(
"Gruppenbeschreibung festlegen"),
"Set invitation link":
MessageLookupByLibrary.simpleMessage("Einladungslink festlegen"),
"Set status": MessageLookupByLibrary.simpleMessage("Status ändern"),
"Settings": MessageLookupByLibrary.simpleMessage("Einstellungen"),
"Share": MessageLookupByLibrary.simpleMessage("Teilen"),
"Sign up": MessageLookupByLibrary.simpleMessage("Registrieren"),
"Skip": MessageLookupByLibrary.simpleMessage("Überspringe"),
"Source code": MessageLookupByLibrary.simpleMessage("Quellcode"),
"Start your first chat :-)": MessageLookupByLibrary.simpleMessage(
"Starte deinen ersten Chat :-)"),
"Submit": MessageLookupByLibrary.simpleMessage("Absenden"),
"Sunday": MessageLookupByLibrary.simpleMessage("Sonntag"),
"System": MessageLookupByLibrary.simpleMessage("System"),
"Tap to show menu": MessageLookupByLibrary.simpleMessage(
"Tippen, um das Menü anzuzeigen"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage(
"Die Verschlüsselung wurde korrumpiert"),
"They Don\'t Match":
MessageLookupByLibrary.simpleMessage("Stimmen nicht überein"),
"They Match": MessageLookupByLibrary.simpleMessage("Stimmen überein"),
"This room has been archived.": MessageLookupByLibrary.simpleMessage(
"Dieser Raum wurde archiviert."),
"Thursday": MessageLookupByLibrary.simpleMessage("Donnerstag"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Nochmal versuchen zu senden"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Dienstag"),
"Unblock Device":
MessageLookupByLibrary.simpleMessage("Geräteblockierung aufheben"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Unbekanntes Gerät"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Unbekannter Verschlüsselungsalgorithmus"),
"Unmute chat": MessageLookupByLibrary.simpleMessage("Stumm aus"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"Amoled optimierte Farben verwenden?"),
"Username": MessageLookupByLibrary.simpleMessage("Benutzername"),
"Verify": MessageLookupByLibrary.simpleMessage("Bestätigen"),
"Verify User":
MessageLookupByLibrary.simpleMessage("Verifiziere Benutzer"),
"Video call": MessageLookupByLibrary.simpleMessage("Videoanruf"),
"Visibility of the chat history": MessageLookupByLibrary.simpleMessage(
"Sichtbarkeit des Chat-Verlaufs"),
"Visible for all participants": MessageLookupByLibrary.simpleMessage(
"Sichtbar für alle Teilnehmer*innen"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Für jeden sichtbar"),
"Voice message":
MessageLookupByLibrary.simpleMessage("Sprachnachricht"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Hintergrund"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Mittwoch"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Herzlich willkommen beim knuffigsten Instant Messenger im Matrix-Netwerk."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Wer darf der Gruppe beitreten"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Schreibe eine Nachricht ..."),
"Yes": MessageLookupByLibrary.simpleMessage("Ja"),
"You": MessageLookupByLibrary.simpleMessage("Du"),
"You are invited to this chat": MessageLookupByLibrary.simpleMessage(
"Du wurdest eingeladen in diesen Chat"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Du bist kein Mitglied mehr in diesem Chat"),
"You cannot invite yourself": MessageLookupByLibrary.simpleMessage(
"Du kannst dich nicht selbst einladen"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Du wurdest aus dem Chat verbannt"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Du wirst die Verschlüsselung nicht mehr ausstellen können. Bist Du sicher?"),
"Your own username":
MessageLookupByLibrary.simpleMessage("Dein eigener Benutzername"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("Alias"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"Bitte gib dein Secure-Store Passwort oder Wiederherstellungsschlüssel ein, um die Keys zu cachen."),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"Bitte gebe um die andere Person signieren zu können dein Secure-Store Passwort oder Wiederherstellungsschlüssel ein."),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"Bitte gebe um deine Session zu verifizieren dein Secure-Store Passwort oder Wiederherstellungsschlüssel ein."),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys":
MessageLookupByLibrary.simpleMessage("Keys erfolgreich gecached!"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"Vergleiche und stelle sicher, dass die folgenden Emoji mit denen des anderen Gerätes übereinstimmen:"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"Vergleiche und stelle sicher, dass die folgenden Zahlen mit denen des anderen Gerätes übereinstimmen:"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled": MessageLookupByLibrary.simpleMessage(
"Cross-Signing ist deaktiviert"),
"crossSigningEnabled":
MessageLookupByLibrary.simpleMessage("Cross-Signing ist aktiviert"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists":
MessageLookupByLibrary.simpleMessage("Emote existiert bereits!"),
"emoteInvalid":
MessageLookupByLibrary.simpleMessage("Ungültiges Emote-kürzel!"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"Wähle ein Emote-kürzel und ein Bild!"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Falsches Passwort oder Wiederherstellungsschlüssel"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...": MessageLookupByLibrary.simpleMessage("schreibt..."),
"isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(
"Ist der folgende Geräteschlüssel korrekt?"),
"joinedTheChat": m29,
"keysCached":
MessageLookupByLibrary.simpleMessage("Keys sind gecached"),
"keysMissing": MessageLookupByLibrary.simpleMessage("Keys fehlen"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest":
MessageLookupByLibrary.simpleMessage("Neue Verifikationsanfrage!"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat unterstützt noch nicht das Einschalten von Cross-Signing. Bitte schalte es innerhalb Riot an."),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat unterstützt noch nicht das Einschalten vom Online Key Backup. Bitte schalte es innerhalb Riot an."),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("ok"),
"onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(
"Online Key Backup ist deaktiviert"),
"onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(
"Online Key Backup ist aktiviert"),
"passphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Passwort oder Wiederherstellungsschlüssel"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified":
MessageLookupByLibrary.simpleMessage("Sitzung ist verifiziert"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify": MessageLookupByLibrary.simpleMessage(
"Unbekannte Sitzung, bitte verifiziere diese"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession": MessageLookupByLibrary.simpleMessage(
"Sitzung erfolgreich verifiziert!"),
"verifyManual":
MessageLookupByLibrary.simpleMessage("Verifiziere manuell"),
"verifyStart":
MessageLookupByLibrary.simpleMessage("Starte Verifikation"),
"verifySuccess":
MessageLookupByLibrary.simpleMessage("Erfolgreich verifiziert!"),
"verifyTitle": MessageLookupByLibrary.simpleMessage(
"Verifiziere anderen Benutzer"),
"waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(
"Warte darauf, dass der Partner die Verifikationsanfrage annimmt..."),
"waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(
"Warte darauf, dass der Partner die Emoji annimmt..."),
"waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage(
"Warte darauf, dass der Partner die Zahlen annimmt...")
};
}

View file

@ -1,609 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a es locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'es';
static m0(username) => "${username} aceptó la invitación";
static m1(username) => "${username} activó el cifrado de extremo a extremo";
static m60(username) =>
"¿Aceptar esta solicitud de verificación de ${username}?";
static m2(username, targetName) => "${username} vetó a ${targetName}";
static m3(homeserver) =>
"De forma predeterminada estará conectado a ${homeserver}";
static m4(username) => "${username} cambió el icono del chat";
static m5(username, description) =>
"${username} cambió la descripción del chat a: \'${description}\'";
static m6(username, chatname) =>
"${username} cambió el nombre del chat a: \'${chatname}\'";
static m7(username) => "${username} cambió los permisos del chat";
static m8(username, displayname) =>
"${username} cambió su nombre visible a: ${displayname}";
static m9(username) =>
"${username} cambió las reglas de acceso de visitantes";
static m10(username, rules) =>
"${username} cambió las reglas de acceso de visitantes a: ${rules}";
static m11(username) => "${username} cambió la visibilidad del historial";
static m12(username, rules) =>
"${username} cambió la visibilidad del historial a: ${rules}";
static m13(username) => "${username} cambió las reglas de ingreso";
static m14(username, joinRules) =>
"${username} cambió las reglas de ingreso a ${joinRules}";
static m15(username) => "${username} cambió su imagen de perfil";
static m16(username) => "${username} cambió el alias de la sala";
static m17(username) => "${username} cambió el enlace de invitación";
static m18(error) => "No se pudo descifrar el mensaje: ${error}";
static m19(count) => "${count} participantes";
static m20(username) => "${username} creó el chat";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${day}/${month}/${year}";
static m23(month, day) => "${day}/${month}";
static m24(displayname) => "Grupo con ${displayname}";
static m25(username, targetName) =>
"${username} ha retirado la invitación para ${targetName}";
static m26(groupName) => "Invitar contacto a ${groupName}";
static m27(username, link) =>
"${username} te invitó a FluffyChat.\n1. Instale FluffyChat: http://fluffy.chat\n2. Regístrate o inicia sesión \n3. Abra el enlace de invitación: ${link}";
static m28(username, targetName) => "${username} invitó a ${targetName}";
static m29(username) => "${username} se unió al chat";
static m30(username, targetName) => "${username} echó a ${targetName}";
static m31(username, targetName) => "${username} echó y vetó a ${targetName}";
static m32(localizedTimeShort) => "Última vez activo: ${localizedTimeShort}";
static m33(count) => "Mostrar ${count} participantes más";
static m34(homeserver) => "Iniciar sesión en ${homeserver}";
static m35(number) => "${number} seleccionado(s)";
static m36(fileName) => "Reproducir ${fileName}";
static m37(username) => "${username} redactó un evento";
static m38(username) => "${username} rechazó la invitación";
static m39(username) => "Eliminado por ${username}";
static m40(username) => "Visto por ${username}";
static m41(username, count) => "Visto por ${username} y ${count} más";
static m42(username, username2) => "Visto por ${username} y ${username2}";
static m43(username) => "${username} envió un archivo";
static m44(username) => "${username} envió una imagen";
static m45(username) => "${username} envió un sticker";
static m46(username) => "${username} envió un video";
static m47(username) => "${username} envió un audio";
static m48(username) => "${username} compartió la ubicación";
static m49(hours12, hours24, minutes, suffix) => "${hours24}:${minutes}";
static m50(username, targetName) =>
"${username} admitió a ${targetName} nuevamente";
static m51(type) => "Evento desconocido \'${type}\'";
static m52(unreadCount) => "${unreadCount} chats no leídos";
static m53(unreadEvents) => "${unreadEvents} mensajes no leídos";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} mensajes no leídos en ${unreadChats} chats";
static m55(username, count) =>
"${username} y ${count} más están escribiendo...";
static m56(username, username2) =>
"${username} y ${username2} están escribiendo...";
static m57(username) => "${username} está escribiendo...";
static m58(username) => "${username} abandonó el chat";
static m59(username, type) => "${username} envió un evento ${type}";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(Opcional) Nombre del grupo"),
"About": MessageLookupByLibrary.simpleMessage("Acerca de"),
"Accept": MessageLookupByLibrary.simpleMessage("Aceptar"),
"Account": MessageLookupByLibrary.simpleMessage("Cuenta"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Información de la cuenta"),
"Add a group description": MessageLookupByLibrary.simpleMessage(
"Agregar una descripción al grupo"),
"Admin": MessageLookupByLibrary.simpleMessage("Administrador"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("¿Ya tienes una cuenta?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Cualquiera puede unirse"),
"Archive": MessageLookupByLibrary.simpleMessage("Archivo"),
"Archived Room": MessageLookupByLibrary.simpleMessage("Sala archivada"),
"Are guest users allowed to join": MessageLookupByLibrary.simpleMessage(
"¿Pueden unirse los usuarios visitantes?"),
"Are you sure?": MessageLookupByLibrary.simpleMessage("¿Estás seguro?"),
"Authentication": MessageLookupByLibrary.simpleMessage("Autenticación"),
"Avatar has been changed": MessageLookupByLibrary.simpleMessage(
"La imagen de perfil ha sido cambiada"),
"Ban from chat": MessageLookupByLibrary.simpleMessage("Vetar del chat"),
"Banned": MessageLookupByLibrary.simpleMessage("Vetado"),
"Block Device":
MessageLookupByLibrary.simpleMessage("Bloquear dispositivo"),
"Cancel": MessageLookupByLibrary.simpleMessage("Cancelar"),
"Change the homeserver":
MessageLookupByLibrary.simpleMessage("Cambiar el servidor"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Cambiar el nombre del grupo"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Cambiar el servidor"),
"Change wallpaper": MessageLookupByLibrary.simpleMessage(
"Cambiar el fondo de pantalla"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Cambia tu estilo"),
"Changelog":
MessageLookupByLibrary.simpleMessage("Registro de cambios"),
"Chat": MessageLookupByLibrary.simpleMessage("Chat"),
"Chat details":
MessageLookupByLibrary.simpleMessage("Detalles del chat"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("Elija una contraseña segura"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("Elija un nombre de usuario"),
"Close": MessageLookupByLibrary.simpleMessage("Cerrar"),
"Confirm": MessageLookupByLibrary.simpleMessage("Confirmar"),
"Connect": MessageLookupByLibrary.simpleMessage("Conectar"),
"Connection attempt failed": MessageLookupByLibrary.simpleMessage(
"Falló el intento de conexión"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"El contacto ha sido invitado al grupo"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Visor de contenido"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Copiado al portapapeles"),
"Copy": MessageLookupByLibrary.simpleMessage("Copiar"),
"Could not set avatar": MessageLookupByLibrary.simpleMessage(
"No se pudo establecer la imagen de perfil"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"No se pudo establecer el nombre visible"),
"Create": MessageLookupByLibrary.simpleMessage("Crear"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Crear cuenta ahora"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Crear grupo nuevo"),
"Currently active":
MessageLookupByLibrary.simpleMessage("Actualmente activo"),
"Dark": MessageLookupByLibrary.simpleMessage("Oscuro"),
"Delete": MessageLookupByLibrary.simpleMessage("Eliminar"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Eliminar mensaje"),
"Deny": MessageLookupByLibrary.simpleMessage("Rechazar"),
"Device": MessageLookupByLibrary.simpleMessage("Dispositivo"),
"Devices": MessageLookupByLibrary.simpleMessage("Dispositivos"),
"Discard picture":
MessageLookupByLibrary.simpleMessage("Descartar imagen"),
"Displayname has been changed": MessageLookupByLibrary.simpleMessage(
"El nombre visible ha cambiado"),
"Donate": MessageLookupByLibrary.simpleMessage("Donar"),
"Download file":
MessageLookupByLibrary.simpleMessage("Descargar archivo"),
"Edit Jitsi instance": MessageLookupByLibrary.simpleMessage(
"Cambiar la instancia de Jitsi"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Editar nombre visible"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Configuración de emotes"),
"Emote shortcode":
MessageLookupByLibrary.simpleMessage("Atajo de emote"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Chat vacío"),
"Encryption": MessageLookupByLibrary.simpleMessage("Cifrado"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Algoritmo de cifrado"),
"Encryption is not enabled": MessageLookupByLibrary.simpleMessage(
"El cifrado no está habilitado"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"¡El cifrado de extremo a extremo está actualmente en período de prueba! ¡Úselo bajo su propio riesgo!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Configuración del cifrado de extremo a extremo"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Ingrese un nombre de grupo"),
"Enter a username": MessageLookupByLibrary.simpleMessage(
"Ingrese un nombre de usuario"),
"Enter your homeserver":
MessageLookupByLibrary.simpleMessage("Ingrese su servidor"),
"File name": MessageLookupByLibrary.simpleMessage("Nombre del archivo"),
"File size": MessageLookupByLibrary.simpleMessage("Tamaño del archivo"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Reenviar"),
"Friday": MessageLookupByLibrary.simpleMessage("Viernes"),
"From joining":
MessageLookupByLibrary.simpleMessage("Desde que se unió"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("Desde la invitación"),
"Group": MessageLookupByLibrary.simpleMessage("Grupo"),
"Group description":
MessageLookupByLibrary.simpleMessage("Descripción del grupo"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage(
"La descripción del grupo ha sido cambiada"),
"Group is public":
MessageLookupByLibrary.simpleMessage("El grupo es público"),
"Guests are forbidden": MessageLookupByLibrary.simpleMessage(
"Los visitantes están prohibidos"),
"Guests can join": MessageLookupByLibrary.simpleMessage(
"Los visitantes pueden unirse"),
"Help": MessageLookupByLibrary.simpleMessage("Ayuda"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"El servidor no es compatible"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("¿Cómo estás hoy?"),
"ID": MessageLookupByLibrary.simpleMessage("Identificación"),
"Identity": MessageLookupByLibrary.simpleMessage("Identidad"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Invitar contacto"),
"Invited": MessageLookupByLibrary.simpleMessage("Invitado"),
"Invited users only":
MessageLookupByLibrary.simpleMessage("Sólo usuarios invitados"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"Parece que no tienes servicios de Google en tu teléfono. ¡Esa es una buena decisión para tu privacidad! Para recibir notificaciones instantáneas en FluffyChat, recomendamos usar microG: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Echar del chat"),
"Last seen IP":
MessageLookupByLibrary.simpleMessage("Última dirección IP vista"),
"Leave": MessageLookupByLibrary.simpleMessage("Abandonar"),
"Left the chat":
MessageLookupByLibrary.simpleMessage("Abandonó el chat"),
"License": MessageLookupByLibrary.simpleMessage("Licencia"),
"Light": MessageLookupByLibrary.simpleMessage("Claro"),
"Load more...": MessageLookupByLibrary.simpleMessage("Mostrar más..."),
"Loading... Please wait": MessageLookupByLibrary.simpleMessage(
"Cargando... Por favor espere"),
"Login": MessageLookupByLibrary.simpleMessage("Iniciar sesión"),
"Logout": MessageLookupByLibrary.simpleMessage("Cerrar sesión"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Hacer un moderador/a"),
"Make an admin":
MessageLookupByLibrary.simpleMessage("Hacer un administrador/a"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Asegúrese de que el identificador es válido"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"El mensaje será eliminado para todos los participantes"),
"Moderator": MessageLookupByLibrary.simpleMessage("Moderador"),
"Monday": MessageLookupByLibrary.simpleMessage("Lunes"),
"Mute chat": MessageLookupByLibrary.simpleMessage("Silenciar chat"),
"New message in FluffyChat":
MessageLookupByLibrary.simpleMessage("Nuevo mensaje en FluffyChat"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Nuevo chat privado"),
"No emotes found. 😕":
MessageLookupByLibrary.simpleMessage("Ningún emote encontrado. 😕"),
"No permission":
MessageLookupByLibrary.simpleMessage("Sin autorización"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("Ninguna sala encontrada..."),
"None": MessageLookupByLibrary.simpleMessage("Ninguno"),
"Not supported in web": MessageLookupByLibrary.simpleMessage(
"No es compatible con la versión web"),
"Oops something went wrong...":
MessageLookupByLibrary.simpleMessage("Ups, algo salió mal..."),
"Open app to read messages": MessageLookupByLibrary.simpleMessage(
"Abrir la aplicación para leer los mensajes"),
"Open camera": MessageLookupByLibrary.simpleMessage("Abrir la cámara"),
"Participating user devices": MessageLookupByLibrary.simpleMessage(
"Dispositivos de usuario participantes"),
"Password": MessageLookupByLibrary.simpleMessage("Contraseña"),
"Pick image": MessageLookupByLibrary.simpleMessage("Elegir imagen"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Tenga en cuenta que necesita Pantalaimon para utilizar el cifrado de extremo a extremo por ahora."),
"Please choose a username": MessageLookupByLibrary.simpleMessage(
"Por favor, elija un nombre de usuario"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Por favor, ingrese un identificador matrix"),
"Please enter your password": MessageLookupByLibrary.simpleMessage(
"Por favor ingrese su contraseña"),
"Please enter your username": MessageLookupByLibrary.simpleMessage(
"Por favor ingrese su nombre de usuario"),
"Public Rooms": MessageLookupByLibrary.simpleMessage("Salas públicas"),
"Recording": MessageLookupByLibrary.simpleMessage("Grabando"),
"Reject": MessageLookupByLibrary.simpleMessage("Rechazar"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Volver a unirse"),
"Remove": MessageLookupByLibrary.simpleMessage("Eliminar"),
"Remove all other devices": MessageLookupByLibrary.simpleMessage(
"Eliminar todos los otros dispositivos"),
"Remove device":
MessageLookupByLibrary.simpleMessage("Eliminar dispositivo"),
"Remove exile":
MessageLookupByLibrary.simpleMessage("Eliminar la expulsión"),
"Remove message":
MessageLookupByLibrary.simpleMessage("Eliminar mensaje"),
"Render rich message content": MessageLookupByLibrary.simpleMessage(
"Mostrar el contenido con mensajes enriquecidos"),
"Reply": MessageLookupByLibrary.simpleMessage("Responder"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Solicitar permiso"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Solicitar poder leer mensajes antiguos"),
"Revoke all permissions":
MessageLookupByLibrary.simpleMessage("Revocar todos los permisos"),
"Room has been upgraded": MessageLookupByLibrary.simpleMessage(
"La sala ha subido de categoría"),
"Saturday": MessageLookupByLibrary.simpleMessage("Sábado"),
"Search for a chat":
MessageLookupByLibrary.simpleMessage("Buscar un chat"),
"Seen a long time ago":
MessageLookupByLibrary.simpleMessage("Visto hace mucho tiempo"),
"Send": MessageLookupByLibrary.simpleMessage("Enviar"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Enviar un mensaje"),
"Send file": MessageLookupByLibrary.simpleMessage("Enviar un archivo"),
"Send image": MessageLookupByLibrary.simpleMessage("Enviar una imagen"),
"Set a profile picture": MessageLookupByLibrary.simpleMessage(
"Establecer una foto de perfil"),
"Set group description": MessageLookupByLibrary.simpleMessage(
"Establecer descripción del grupo"),
"Set invitation link": MessageLookupByLibrary.simpleMessage(
"Establecer enlace de invitación"),
"Set status": MessageLookupByLibrary.simpleMessage("Establecer estado"),
"Settings": MessageLookupByLibrary.simpleMessage("Ajustes"),
"Share": MessageLookupByLibrary.simpleMessage("Compartir"),
"Sign up": MessageLookupByLibrary.simpleMessage("Registrarse"),
"Skip": MessageLookupByLibrary.simpleMessage("Omitir"),
"Source code": MessageLookupByLibrary.simpleMessage("Código fuente"),
"Start your first chat :-)":
MessageLookupByLibrary.simpleMessage("Comience su primer chat :-)"),
"Submit": MessageLookupByLibrary.simpleMessage("Enviar"),
"Sunday": MessageLookupByLibrary.simpleMessage("Domingo"),
"System": MessageLookupByLibrary.simpleMessage("Sistema"),
"Tap to show menu":
MessageLookupByLibrary.simpleMessage("Toca para mostrar el menú"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage("El cifrado se ha corrompido"),
"They Don\'t Match":
MessageLookupByLibrary.simpleMessage("No coinciden"),
"They Match": MessageLookupByLibrary.simpleMessage("Coinciden"),
"This room has been archived.": MessageLookupByLibrary.simpleMessage(
"Esta sala ha sido archivada."),
"Thursday": MessageLookupByLibrary.simpleMessage("Jueves"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Intentar enviar nuevamente"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Martes"),
"Unblock Device":
MessageLookupByLibrary.simpleMessage("Desbloquear dispositivo"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Dispositivo desconocido"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Algoritmo de cifrado desconocido"),
"Unmute chat":
MessageLookupByLibrary.simpleMessage("Dejar de silenciar el chat"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"¿Usar colores compatibles con AMOLED?"),
"Username": MessageLookupByLibrary.simpleMessage("Nombre de usuario"),
"Verify": MessageLookupByLibrary.simpleMessage("Verificar"),
"Verify User":
MessageLookupByLibrary.simpleMessage("Verificar usuario"),
"Video call": MessageLookupByLibrary.simpleMessage("Video llamada"),
"Visibility of the chat history": MessageLookupByLibrary.simpleMessage(
"Visibilidad del historial del chat"),
"Visible for all participants": MessageLookupByLibrary.simpleMessage(
"Visible para todos los participantes"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Visible para todo el mundo"),
"Voice message": MessageLookupByLibrary.simpleMessage("Mensaje de voz"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Fondo de pantalla"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Miércoles"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Bienvenido al mensajero instantáneo más tierno de la red Matrix."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Quién tiene permitido unirse al grupo"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Escribe un mensaje..."),
"Yes": MessageLookupByLibrary.simpleMessage(""),
"You": MessageLookupByLibrary.simpleMessage(""),
"You are invited to this chat":
MessageLookupByLibrary.simpleMessage("Estás invitado a este chat"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Ya no estás participando en este chat"),
"You cannot invite yourself": MessageLookupByLibrary.simpleMessage(
"No puedes invitarte a tí mismo"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Has sido vetado de este chat"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Ya no podrá deshabilitar el cifrado. ¿Estás seguro?"),
"Your own username":
MessageLookupByLibrary.simpleMessage("Tu nombre de usuario"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("alias"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"Ingrese su contraseña de almacenamiento segura (SSSS) o la clave de recuperación para almacenar en caché las claves."),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"Para poder confirmar a la otra persona, ingrese su contraseña de almacenamiento segura o la clave de recuperación."),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"Por favor, ingrese su contraseña de almacenamiento seguro (SSSS) o la clave de recuperación para verificar su sesión."),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys": MessageLookupByLibrary.simpleMessage(
"¡Las claves se han almacenado exitosamente!"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"Compare y asegúrese de que los siguientes emoji coincidan con los del otro dispositivo:"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"Compare y asegúrese de que los siguientes números coincidan con los del otro dispositivo:"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled": MessageLookupByLibrary.simpleMessage(
"La confirmación cruzada está deshabilitada"),
"crossSigningEnabled": MessageLookupByLibrary.simpleMessage(
"La confirmación cruzada está habilitada"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists":
MessageLookupByLibrary.simpleMessage("¡El emote ya existe!"),
"emoteInvalid": MessageLookupByLibrary.simpleMessage(
"¡El atajo del emote es inválido!"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"¡Debes elegir un atajo de emote y una imagen!"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Frase de contraseña o clave de recuperación incorrecta"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...":
MessageLookupByLibrary.simpleMessage("está escribiendo..."),
"isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(
"¿Es correcta la siguiente clave de dispositivo?"),
"joinedTheChat": m29,
"keysCached":
MessageLookupByLibrary.simpleMessage("Las claves están en caché"),
"keysMissing":
MessageLookupByLibrary.simpleMessage("Faltan las claves"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest": MessageLookupByLibrary.simpleMessage(
"¡Nueva solicitud de verificación!"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat actualmente no admite habilitar confirmación cruzada. Por favor habilítela desde Element."),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat actualmente no admite habilitar la Copia de seguridad de clave en línea. Por favor habilítela desde Element."),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("ok"),
"onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(
"La copia de seguridad de la clave en línea está deshabilitada"),
"onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(
"La copia de seguridad de la clave en línea está habilitada"),
"passphraseOrKey": MessageLookupByLibrary.simpleMessage(
"contraseña o clave de recuperación"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified":
MessageLookupByLibrary.simpleMessage("La sesión está verificada"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify": MessageLookupByLibrary.simpleMessage(
"Sesión desconocida, por favor verifíquela"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession": MessageLookupByLibrary.simpleMessage(
"¡Sesión verificada exitosamente!"),
"verifyManual":
MessageLookupByLibrary.simpleMessage("Verificar manualmente"),
"verifyStart":
MessageLookupByLibrary.simpleMessage("Comenzar verificación"),
"verifySuccess": MessageLookupByLibrary.simpleMessage(
"¡Has verificado exitosamente!"),
"verifyTitle":
MessageLookupByLibrary.simpleMessage("Verificando la otra cuenta"),
"waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(
"Esperando a que el socio acepte la solicitud..."),
"waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(
"Esperando a que el socio acepte los emojis..."),
"waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage(
"Esperando a que el socio acepte los números...")
};
}

View file

@ -1,620 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a fr locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'fr';
static m0(username) => "${username} a accepté l\'invitation";
static m1(username) => "${username} a activé le chiffrement de bout en bout";
static m60(username) =>
"Accepter cette demande de vérification de ${username} ?";
static m2(username, targetName) => "${username} a banni ${targetName}";
static m3(homeserver) => "Par défaut, vous serez connecté à ${homeserver}";
static m4(username) => "${username} a changé l\'image de la discussion";
static m5(username, description) =>
"${username} a changé la description de la discussion en : \'${description}\'";
static m6(username, chatname) =>
"${username} a renommé la discussion en : \'${chatname}\'";
static m7(username) =>
"${username} a changé les permissions de la discussion";
static m8(username, displayname) =>
"${username} s\'est renommé en : ${displayname}";
static m9(username) =>
"${username} a changé les règles d\'accès à la discussion pour les invités";
static m10(username, rules) =>
"${username} a changé les règles d\'accès à la discussion pour les invités en : ${rules}";
static m11(username) =>
"${username} a changé la visibilité de l\'historique de la discussion";
static m12(username, rules) =>
"${username} a changé la visibilité de l\'historique de la discussion en : ${rules}";
static m13(username) =>
"${username} a changé les règles d\'accès à la discussion";
static m14(username, joinRules) =>
"${username} a changé les règles d\'accès à la discussion en : ${joinRules}";
static m15(username) => "${username} a changé son image de profil";
static m16(username) => "${username} a changé les adresses du salon";
static m17(username) => "${username} a changé le lien d\'invitation";
static m18(error) => "Impossible de déchiffrer le message : ${error}";
static m19(count) => "${count} participant(s)";
static m20(username) => "${username} a créé la discussion";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${day}/${month}/${year}";
static m23(month, day) => "${day}/${month}";
static m24(displayname) => "Groupe avec ${displayname}";
static m25(username, targetName) =>
"${username} a retiré l\'invitation de ${targetName}";
static m26(groupName) => "Inviter un contact dans ${groupName}";
static m27(username, link) =>
"${username} vous a invité sur FluffyChat. \n1. Installez FluffyChat : http://fluffy.chat \n2. Inscrivez-vous ou connectez-vous \n3. Ouvrez le lien d\'invitation : ${link}";
static m28(username, targetName) => "${username} a invité ${targetName}";
static m29(username) => "${username} a rejoint la discussion";
static m30(username, targetName) => "${username} a expulsé ${targetName}";
static m31(username, targetName) =>
"${username} a expulsé et banni ${targetName}";
static m32(localizedTimeShort) =>
"Vu pour la dernière fois: ${localizedTimeShort}";
static m33(count) => "Charger ${count} participants de plus";
static m34(homeserver) => "Se connecter à ${homeserver}";
static m35(number) => "${number} selectionné(s)";
static m36(fileName) => "Lire ${fileName}";
static m37(username) => "${username} a supprimé un message";
static m38(username) => "${username} a refusé l\'invitation";
static m39(username) => "Supprimé par ${username}";
static m40(username) => "Vu par ${username}";
static m41(username, count) => "Vu par ${username} et ${count} autres";
static m42(username, username2) => "Vu par ${username} et ${username2}";
static m43(username) => "${username} a envoyé un fichier";
static m44(username) => "${username} a envoyé une image";
static m45(username) => "${username} a envoyé un sticker";
static m46(username) => "${username} a envoyé une vidéo";
static m47(username) => "${username} a envoyé un fichier audio";
static m48(username) => "${username} a partagé une localisation";
static m49(hours12, hours24, minutes, suffix) => "${hours24}:${minutes}";
static m50(username, targetName) => "${username} a dé-banni ${targetName}";
static m51(type) => "Événement de type inconnu \'${type}\'";
static m52(unreadCount) => "${unreadCount} discussions non lues";
static m53(unreadEvents) => "${unreadEvents} messages non lus";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} messages non lus dans ${unreadChats} discussions";
static m55(username, count) =>
"${username} et ${count} autres sont en train d\'écrire...";
static m56(username, username2) =>
"${username} et ${username2} sont en train d\'écrire...";
static m57(username) => "${username} est en train d\'écrire...";
static m58(username) => "${username} a quitté la discussion";
static m59(username, type) =>
"${username} a envoyé un événement de type ${type}";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(Optionnel) Nom du groupe"),
"About": MessageLookupByLibrary.simpleMessage("À propos"),
"Accept": MessageLookupByLibrary.simpleMessage("Accepter"),
"Account": MessageLookupByLibrary.simpleMessage("Compte"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Informations du compte"),
"Add a group description": MessageLookupByLibrary.simpleMessage(
"Ajouter une description au groupe"),
"Admin": MessageLookupByLibrary.simpleMessage("Administrateur"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("Vous avez déjà un compte ?"),
"Anyone can join": MessageLookupByLibrary.simpleMessage(
"Tout le monde peut rejoindre"),
"Archive": MessageLookupByLibrary.simpleMessage("Archiver"),
"Archived Room": MessageLookupByLibrary.simpleMessage("Salon achivé"),
"Are guest users allowed to join": MessageLookupByLibrary.simpleMessage(
"Est-ce que les invités peuvent rejoindre"),
"Are you sure?":
MessageLookupByLibrary.simpleMessage("Êtes-vous sûr ?"),
"Authentication":
MessageLookupByLibrary.simpleMessage("Authentification"),
"Avatar has been changed": MessageLookupByLibrary.simpleMessage(
"L\'image de profil a été changée"),
"Ban from chat":
MessageLookupByLibrary.simpleMessage("Bannir de la discussion"),
"Banned": MessageLookupByLibrary.simpleMessage("Banni"),
"Block Device":
MessageLookupByLibrary.simpleMessage("Bloquer l\'appareil"),
"Cancel": MessageLookupByLibrary.simpleMessage("Annuler"),
"Change the homeserver": MessageLookupByLibrary.simpleMessage(
"Changer le serveur d\'accueil"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Changer le nom du groupe"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Changer de serveur"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Changer d\'image de fond"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Changez votre style"),
"Changelog":
MessageLookupByLibrary.simpleMessage("Journal des changements"),
"Chat": MessageLookupByLibrary.simpleMessage("Discussion"),
"Chat details":
MessageLookupByLibrary.simpleMessage("Détails de la discussion"),
"Choose a strong password": MessageLookupByLibrary.simpleMessage(
"Choisissez un mot de passe fort"),
"Choose a username": MessageLookupByLibrary.simpleMessage(
"Choisissez un nom d\'utilisateur"),
"Close": MessageLookupByLibrary.simpleMessage("Fermer"),
"Confirm": MessageLookupByLibrary.simpleMessage("Confirmer"),
"Connect": MessageLookupByLibrary.simpleMessage("Se connecter"),
"Connection attempt failed": MessageLookupByLibrary.simpleMessage(
"Tentative de connexion echouée"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"Le contact a été invité au groupe"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Visionneuse de contenu"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Copié dans le presse-papier"),
"Copy": MessageLookupByLibrary.simpleMessage("Copier"),
"Could not set avatar": MessageLookupByLibrary.simpleMessage(
"Impossible de changer d\'image de profil"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"Impossible de changer de nom"),
"Create": MessageLookupByLibrary.simpleMessage("Créer"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Créer un compte"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Créer un nouveau groupe"),
"Currently active":
MessageLookupByLibrary.simpleMessage("Actif en ce moment"),
"Dark": MessageLookupByLibrary.simpleMessage("Sombre"),
"Delete": MessageLookupByLibrary.simpleMessage("Supprimer"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Supprimer le message"),
"Deny": MessageLookupByLibrary.simpleMessage("Refuser"),
"Device": MessageLookupByLibrary.simpleMessage("Périphérique"),
"Devices": MessageLookupByLibrary.simpleMessage("Périphériques"),
"Discard picture":
MessageLookupByLibrary.simpleMessage("Abandonner l\'image"),
"Displayname has been changed":
MessageLookupByLibrary.simpleMessage("Renommage effectué"),
"Donate": MessageLookupByLibrary.simpleMessage("Faire un don"),
"Download file":
MessageLookupByLibrary.simpleMessage("Télécharger le fichier"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Changer l\'instance Jitsi"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Changer de nom"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Paramètre des émoticônes"),
"Emote shortcode":
MessageLookupByLibrary.simpleMessage("Raccourci d\'émoticône"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Discussion vide"),
"Encryption": MessageLookupByLibrary.simpleMessage("Chiffrement"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Algorithme de chiffrement"),
"Encryption is not enabled": MessageLookupByLibrary.simpleMessage(
"Le chiffrement n\'est pas actif"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"Le chiffrement de bout en bout est actuellement en béta! Utilisez cette fonctionnalité à vos propres risques!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Paramètres du chiffrement de bout en bout"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Entrez un nom de groupe"),
"Enter a username": MessageLookupByLibrary.simpleMessage(
"Entrez un nom d\'utilisateur"),
"Enter your homeserver": MessageLookupByLibrary.simpleMessage(
"Renseignez votre serveur d\'accueil"),
"File name": MessageLookupByLibrary.simpleMessage("Nom du ficher"),
"File size": MessageLookupByLibrary.simpleMessage("Taille du fichier"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Transférer"),
"Friday": MessageLookupByLibrary.simpleMessage("Vendredi"),
"From joining": MessageLookupByLibrary.simpleMessage(
"À partir de l\'entrée dans le salon"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("À partir de l\'invitation"),
"Group": MessageLookupByLibrary.simpleMessage("Groupe"),
"Group description":
MessageLookupByLibrary.simpleMessage("Description du groupe"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage(
"La description du groupe a été changée"),
"Group is public":
MessageLookupByLibrary.simpleMessage("Le groupe est public"),
"Guests are forbidden": MessageLookupByLibrary.simpleMessage(
"Les invités ne peuvent pas rejoindre"),
"Guests can join": MessageLookupByLibrary.simpleMessage(
"Les invités peuvent rejoindre"),
"Help": MessageLookupByLibrary.simpleMessage("Aide"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"Le serveur d\'accueil n\'est pas compatible"),
"How are you today?": MessageLookupByLibrary.simpleMessage(
"Comment allez-vous aujourd\'hui ?"),
"ID": MessageLookupByLibrary.simpleMessage("Identifiant"),
"Identity": MessageLookupByLibrary.simpleMessage("Identité"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Inviter un contact"),
"Invited": MessageLookupByLibrary.simpleMessage("Invité"),
"Invited users only": MessageLookupByLibrary.simpleMessage(
"Uniquement les utilisateurs invités"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"On dirait que vous n\'avez pas installé les services Google sur votre téléphone. C\'est une bonne décision pour votre vie privée ! Pour recevoir les notifications de FluffyChat, nous vous recommendons d\'utiliser microG : https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Expulser de la discussion"),
"Last seen IP": MessageLookupByLibrary.simpleMessage(
"Dernière addresse IP utilisée"),
"Leave": MessageLookupByLibrary.simpleMessage("Partir"),
"Left the chat":
MessageLookupByLibrary.simpleMessage("A quitté la discussion"),
"License": MessageLookupByLibrary.simpleMessage("Licence"),
"Light": MessageLookupByLibrary.simpleMessage("Clair"),
"Load more...": MessageLookupByLibrary.simpleMessage("Charger plus..."),
"Loading... Please wait": MessageLookupByLibrary.simpleMessage(
"Chargement... Merci de patienter"),
"Login": MessageLookupByLibrary.simpleMessage("Connexion"),
"Logout": MessageLookupByLibrary.simpleMessage("Se déconnecter"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Promouvoir comme modérateur"),
"Make an admin": MessageLookupByLibrary.simpleMessage(
"Promouvoir comme administrateur"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Vérifiez que l\'identifiant est valide"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"Le message sera supprimé pour tous les participants"),
"Moderator": MessageLookupByLibrary.simpleMessage("Moderateur"),
"Monday": MessageLookupByLibrary.simpleMessage("Lundi"),
"Mute chat": MessageLookupByLibrary.simpleMessage(
"Mettre la discussion en sourdine"),
"New message in FluffyChat": MessageLookupByLibrary.simpleMessage(
"Nouveau message dans FluffyChat"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Nouvelle discussion privée"),
"No emotes found. 😕": MessageLookupByLibrary.simpleMessage(
"Aucune émoticône trouvée. 😕"),
"No permission":
MessageLookupByLibrary.simpleMessage("Aucune permission"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("Aucun salon trouvé..."),
"None": MessageLookupByLibrary.simpleMessage("Aucun"),
"Not supported in web": MessageLookupByLibrary.simpleMessage(
"Non supporté par l\'application web"),
"Oops something went wrong...": MessageLookupByLibrary.simpleMessage(
"Oups, quelque chose s\'est mal passé..."),
"Open app to read messages": MessageLookupByLibrary.simpleMessage(
"Ouvrez l\'application pour lire le message"),
"Open camera":
MessageLookupByLibrary.simpleMessage("Ouvrir l\'appareil photo"),
"Participating user devices":
MessageLookupByLibrary.simpleMessage("Périphériques participants"),
"Password": MessageLookupByLibrary.simpleMessage("Mot de passe"),
"Pick image": MessageLookupByLibrary.simpleMessage("Choisir une image"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Vous devez installer Pantalaimon pour utiliser le chiffrement de bout en bout pour l\'instant."),
"Please choose a username": MessageLookupByLibrary.simpleMessage(
"Choisissez un nom d\'utilisateur"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Renseignez un identifiant Matrix"),
"Please enter your password": MessageLookupByLibrary.simpleMessage(
"Renseignez votre mot de passe"),
"Please enter your username": MessageLookupByLibrary.simpleMessage(
"Renseignez votre nom d\'utilisateur"),
"Public Rooms": MessageLookupByLibrary.simpleMessage("Salons publics"),
"Recording": MessageLookupByLibrary.simpleMessage("Enregistrement"),
"Reject": MessageLookupByLibrary.simpleMessage("Refuser"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Rejoindre de nouveau"),
"Remove": MessageLookupByLibrary.simpleMessage("Supprimer"),
"Remove all other devices": MessageLookupByLibrary.simpleMessage(
"Supprimer tous les autres périphériques"),
"Remove device":
MessageLookupByLibrary.simpleMessage("Supprimer le périphérique"),
"Remove exile":
MessageLookupByLibrary.simpleMessage("Retirer le bannissement"),
"Remove message":
MessageLookupByLibrary.simpleMessage("Supprimer le message"),
"Render rich message content": MessageLookupByLibrary.simpleMessage(
"Afficher les contenus riches des messages"),
"Reply": MessageLookupByLibrary.simpleMessage("Répondre"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Demander la permission"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Demander à lire les anciens messages"),
"Revoke all permissions": MessageLookupByLibrary.simpleMessage(
"Révoquer toutes les permissions"),
"Room has been upgraded":
MessageLookupByLibrary.simpleMessage("Le salon a été mis à niveau"),
"Saturday": MessageLookupByLibrary.simpleMessage("Samedi"),
"Search for a chat":
MessageLookupByLibrary.simpleMessage("Rechercher une discussion"),
"Seen a long time ago": MessageLookupByLibrary.simpleMessage(
"Vu pour la dernière fois il y a longtemps"),
"Send": MessageLookupByLibrary.simpleMessage("Envoyer"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Envoyer un message"),
"Send file": MessageLookupByLibrary.simpleMessage("Envoyer un fichier"),
"Send image": MessageLookupByLibrary.simpleMessage("Envoyer une image"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("Définir une image de profil"),
"Set group description": MessageLookupByLibrary.simpleMessage(
"Définir une description du groupe"),
"Set invitation link":
MessageLookupByLibrary.simpleMessage("Créer un lien d\'invitation"),
"Set status": MessageLookupByLibrary.simpleMessage("Définir un statut"),
"Settings": MessageLookupByLibrary.simpleMessage("Paramètres"),
"Share": MessageLookupByLibrary.simpleMessage("Partager"),
"Sign up": MessageLookupByLibrary.simpleMessage("S\'inscrire"),
"Skip": MessageLookupByLibrary.simpleMessage("Ignorer"),
"Source code": MessageLookupByLibrary.simpleMessage("Code source"),
"Start your first chat :-)": MessageLookupByLibrary.simpleMessage(
"Démarrez votre première discussion :-)"),
"Submit": MessageLookupByLibrary.simpleMessage("Soumettre"),
"Sunday": MessageLookupByLibrary.simpleMessage("Dimanche"),
"System": MessageLookupByLibrary.simpleMessage("Système"),
"Tap to show menu": MessageLookupByLibrary.simpleMessage(
"Tappez pour afficher le menu"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage(
"Le chiffrement a été corrompu"),
"They Don\'t Match":
MessageLookupByLibrary.simpleMessage("Elles ne correspondent pas"),
"They Match":
MessageLookupByLibrary.simpleMessage("Elles correspondent"),
"This room has been archived.":
MessageLookupByLibrary.simpleMessage("Ce salon a été archivé."),
"Thursday": MessageLookupByLibrary.simpleMessage("Jeudi"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Retenter l\'envoi"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Mardi"),
"Unblock Device":
MessageLookupByLibrary.simpleMessage("Débloquer l\'appareil"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Périphérique inconnu"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Algorithme de chiffrement inconnu"),
"Unmute chat":
MessageLookupByLibrary.simpleMessage("Retirer la sourdine"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"Utiliser des couleurs compatibles Amoled ?"),
"Username": MessageLookupByLibrary.simpleMessage("Nom d\'utilisateur"),
"Verify": MessageLookupByLibrary.simpleMessage("Vérifier"),
"Verify User": MessageLookupByLibrary.simpleMessage(
"Vérifier l\'utilisateur/trice"),
"Video call": MessageLookupByLibrary.simpleMessage("Appel vidéo"),
"Visibility of the chat history": MessageLookupByLibrary.simpleMessage(
"Visibilité de l\'historique de la discussion"),
"Visible for all participants": MessageLookupByLibrary.simpleMessage(
"Visible pour tous les participants"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Visible pour tout le monde"),
"Voice message": MessageLookupByLibrary.simpleMessage("Message vocal"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Image de fond"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Mercredi"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Bienvenue dans la messagerie la plus mignonne du réseau Matrix."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Qui est autorisé à rejoindre ce groupe"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Écrivez un message..."),
"Yes": MessageLookupByLibrary.simpleMessage("Oui"),
"You": MessageLookupByLibrary.simpleMessage("Vous"),
"You are invited to this chat": MessageLookupByLibrary.simpleMessage(
"Vous êtes invité à cette discussion"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Vous ne participez plus à cette discussion"),
"You cannot invite yourself": MessageLookupByLibrary.simpleMessage(
"Vous ne pouvez pas vous inviter vous-même"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Vous avez été banni de cette discussion"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Vous ne pourrez plus désactiver le chiffrement. Êtez-vous sûr ?"),
"Your own username": MessageLookupByLibrary.simpleMessage(
"Votre propre nom d\'utilisateur"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("adresse"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"Veuillez saisir votre phrase de passe stockée de manière sécurisée ou votre clé de récupération pour mettre les clés en cache."),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"Pour pouvoir faire signer l\'autre personne, veuillez entrer votre phrase de passe stockée de manière sécurisée ou votre clé de récupération."),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"Veuillez saisir votre phrase de passe stockée de manière sécurisée ou votre clé de récupération pour vérifier votre session."),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys": MessageLookupByLibrary.simpleMessage(
"Clés mises en cache avec succès !"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"Comparez et assurez-vous que les emojis suivants correspondent à ceux de l\'autre appareil :"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"Comparez et assurez-vous que les chiffres suivants correspondent à ceux de l\'autre appareil :"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled": MessageLookupByLibrary.simpleMessage(
"La signature croisée est désactivée"),
"crossSigningEnabled": MessageLookupByLibrary.simpleMessage(
"La signature croisée est activée"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists": MessageLookupByLibrary.simpleMessage(
"Cette émoticône existe déjà !"),
"emoteInvalid": MessageLookupByLibrary.simpleMessage(
"Raccourci d\'émoticône invalide !"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"Vous devez sélectionner un raccourci d\'émoticône et une image !"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Phrase de passe ou clé de récupération incorrecte"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...":
MessageLookupByLibrary.simpleMessage("est en train d\'écrire..."),
"isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(
"La clé de l\'appareil ci-dessous est-elle correcte ?"),
"joinedTheChat": m29,
"keysCached": MessageLookupByLibrary.simpleMessage(
"Les clés sont mises en cache"),
"keysMissing":
MessageLookupByLibrary.simpleMessage("Les clés sont manquantes"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest": MessageLookupByLibrary.simpleMessage(
"Nouvelle demande de vérification !"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat ne permet pas actuellement d\'activer la signature croisée. Veuillez l\'activer à partir de Element."),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat ne prend pas actuellement en charge l\'activation de la sauvegarde des clés en ligne. Veuillez l\'activer à partir de Element."),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("ok"),
"onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(
"La sauvegarde en ligne des clés est désactivée"),
"onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(
"La sauvegarde en ligne des clés est activée"),
"passphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Phrase de passe ou clé de récupération"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified":
MessageLookupByLibrary.simpleMessage("La session est vérifiée"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify": MessageLookupByLibrary.simpleMessage(
"Session inconnue, veuillez vérifier"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession": MessageLookupByLibrary.simpleMessage(
"Session vérifiée avec succès !"),
"verifyManual":
MessageLookupByLibrary.simpleMessage("Vérifier manuellement"),
"verifyStart":
MessageLookupByLibrary.simpleMessage("Commencer la vérification"),
"verifySuccess": MessageLookupByLibrary.simpleMessage(
"Vous avez vérifié avec succès !"),
"verifyTitle": MessageLookupByLibrary.simpleMessage(
"Vérification de l\'autre compte"),
"waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(
"En attente de la vérification de la demande par le partenaire..."),
"waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(
"En attente de l\'acceptation de l\'émoji par le partenaire..."),
"waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage(
"En attente de l\'acceptation des nombres par le partenaire...")
};
}

View file

@ -1,606 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a gl locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'gl';
static m0(username) => "${username} aceptou o convite";
static m1(username) => "${username} activou o cifrado extremo-a-extremo";
static m60(username) =>
"¿Aceptar a solicitude de verificación de ${username}?";
static m2(username, targetName) => "${username} vetou a ${targetName}";
static m3(homeserver) => "Por omisión vas conectar con ${homeserver}";
static m4(username) => "${username} cambiou o avatar do chat";
static m5(username, description) =>
"${username} mudou a descrición da conversa a: \'${description}\'";
static m6(username, chatname) =>
"${username} mudou o nome da conversa a: \'${chatname}\'";
static m7(username) => "${username} mudou os permisos da conversa";
static m8(username, displayname) =>
"${username} cambiou o nome público a: ${displayname}";
static m9(username) =>
"${username} mudou as regras de acceso para convidadas";
static m10(username, rules) =>
"${username} mudou as regras de acceso para convidadas a: ${rules}";
static m11(username) => "${username} mudou a visibilidade do historial";
static m12(username, rules) =>
"${username} mudou a visibilidade do historial a: ${rules}";
static m13(username) => "${username} mudou as regras de acceso";
static m14(username, joinRules) =>
"${username} mudou as regras de acceso a: ${joinRules}";
static m15(username) => "${username} mudou o avatar do perfil";
static m16(username) => "${username} mudou os alias da sala";
static m17(username) => "${username} mudou a ligazón de convite";
static m18(error) => "Non se descifrou a mensaxe: ${error}";
static m19(count) => "${count} participantes";
static m20(username) => "${username} creou a conversa";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${day}-${month}-${year}";
static m23(month, day) => "${day}-${month}";
static m24(displayname) => "Grupo con ${displayname}";
static m25(username, targetName) =>
"${username} retirou o convite para ${targetName}";
static m26(groupName) => "Convidar contacto a ${groupName}";
static m27(username, link) =>
"${username} convidoute a FluffyChat.\n1. instala FluffyChat: http://fluffy.chat \n2. Rexístrate ou conéctate\n3. Abre a ligazón do convite: ${link}";
static m28(username, targetName) => "${username} convidou a ${targetName}";
static m29(username) => "${username} uníuse ó chat";
static m30(username, targetName) => "${username} expulsou a ${targetName}";
static m31(username, targetName) =>
"${username} expulsou e vetou a ${targetName}";
static m32(localizedTimeShort) => "Última actividade: ${localizedTimeShort}";
static m33(count) => "Cargar ${count} participantes máis";
static m34(homeserver) => "Conectar con ${homeserver}";
static m35(number) => "${number} seleccionados";
static m36(fileName) => "Reproducir ${fileName}";
static m37(username) => "${username} publicou un evento";
static m38(username) => "${username} rexeitou o convite";
static m39(username) => "Eliminado por ${username}";
static m40(username) => "Visto por ${username}";
static m41(username, count) => "Visto por ${username} e ${count} outras";
static m42(username, username2) => "Visto por ${username} e ${username2}";
static m43(username) => "${username} enviou un ficheiro";
static m44(username) => "${username} enviou unha imaxe";
static m45(username) => "${username} enviou un adhesivo";
static m46(username) => "${username} enviou un vídeo";
static m47(username) => "${username} enviou un audio";
static m48(username) => "${username} compartiu a localización";
static m49(hours12, hours24, minutes, suffix) =>
"${hours12}:${minutes} ${suffix}";
static m50(username, targetName) =>
"${username} retirou o veto a ${targetName}";
static m51(type) => "Evento descoñecido \'${type}\'";
static m52(unreadCount) => "${unreadCount} chats non lidos";
static m53(unreadEvents) => "${unreadEvents} mensaxes non lidas";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} mensaxes non lidas en ${unreadChats} conversas";
static m55(username, count) =>
"${username} e ${count} máis están escribindo...";
static m56(username, username2) =>
"${username} e ${username2} están escribindo...";
static m57(username) => "${username} está escribindo...";
static m58(username) => "${username} deixou a conversa";
static m59(username, type) => "${username} enviou un evento {type]";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(Optativo) Nome do grupo"),
"About": MessageLookupByLibrary.simpleMessage("Acerca de"),
"Accept": MessageLookupByLibrary.simpleMessage("Aceptar"),
"Account": MessageLookupByLibrary.simpleMessage("Conta"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Información da conta"),
"Add a group description": MessageLookupByLibrary.simpleMessage(
"Engade a descrición do grupo"),
"Admin": MessageLookupByLibrary.simpleMessage("Admin"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("¿xa tes unha conta?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Calquera pode unirse"),
"Archive": MessageLookupByLibrary.simpleMessage("Arquivo"),
"Archived Room": MessageLookupByLibrary.simpleMessage("Sala arquivada"),
"Are guest users allowed to join": MessageLookupByLibrary.simpleMessage(
"Teñen permitido as convidadas o acceso"),
"Are you sure?": MessageLookupByLibrary.simpleMessage("¿estás certo?"),
"Authentication": MessageLookupByLibrary.simpleMessage("Autenticación"),
"Avatar has been changed":
MessageLookupByLibrary.simpleMessage("O avatar cambiou"),
"Ban from chat":
MessageLookupByLibrary.simpleMessage("Expulsar da conversa"),
"Banned": MessageLookupByLibrary.simpleMessage("Vetada"),
"Block Device":
MessageLookupByLibrary.simpleMessage("Bloquear dispositivo"),
"Cancel": MessageLookupByLibrary.simpleMessage("Cancelar"),
"Change the homeserver":
MessageLookupByLibrary.simpleMessage("Mudar de servidor de inicio"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Mudar o nome do grupo"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Mudar de servidor"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Mudar fondo do chat"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Cambiar o estilo"),
"Changelog":
MessageLookupByLibrary.simpleMessage("Rexistro de cambios"),
"Chat": MessageLookupByLibrary.simpleMessage("Chat"),
"Chat details":
MessageLookupByLibrary.simpleMessage("Detalles do chat"),
"Choose a strong password": MessageLookupByLibrary.simpleMessage(
"Escolle un contrasinal forte"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("Escolle un nome de usuaria"),
"Close": MessageLookupByLibrary.simpleMessage("Pechar"),
"Confirm": MessageLookupByLibrary.simpleMessage("Confirmar"),
"Connect": MessageLookupByLibrary.simpleMessage("Conectar"),
"Connection attempt failed": MessageLookupByLibrary.simpleMessage(
"Fallou o intento de conexión"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"O contacto foi convidado ó grupo"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Visor de contido"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Copiado ó portapapeis"),
"Copy": MessageLookupByLibrary.simpleMessage("Copiar"),
"Could not set avatar":
MessageLookupByLibrary.simpleMessage("Non se estableceu o avatar"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"Non se estableceu o nome público"),
"Create": MessageLookupByLibrary.simpleMessage("Crear"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Crear unha conta"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Crear novo grupo"),
"Currently active":
MessageLookupByLibrary.simpleMessage("Actualmente activo"),
"Dark": MessageLookupByLibrary.simpleMessage("Escuro"),
"Delete": MessageLookupByLibrary.simpleMessage("Eliminar"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Eliminar mensaxe"),
"Deny": MessageLookupByLibrary.simpleMessage("Denegar"),
"Device": MessageLookupByLibrary.simpleMessage("Dispositivo"),
"Devices": MessageLookupByLibrary.simpleMessage("Dispositivos"),
"Discard picture":
MessageLookupByLibrary.simpleMessage("Desbotar imaxe"),
"Displayname has been changed":
MessageLookupByLibrary.simpleMessage("O nome público mudou"),
"Donate": MessageLookupByLibrary.simpleMessage("Doar"),
"Download file":
MessageLookupByLibrary.simpleMessage("Descargar ficheiro"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Editar instancia Jitsi"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Editar nome público"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Axustes de Emote"),
"Emote shortcode":
MessageLookupByLibrary.simpleMessage("Atallo de Emote"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Chat baleiro"),
"Encryption": MessageLookupByLibrary.simpleMessage("Cifrado"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Algoritmo do cifrado"),
"Encryption is not enabled":
MessageLookupByLibrary.simpleMessage("Cifrado desactivado"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"O cifrado extremo-a-extremo está en Beta! Úsao baixo a túa responsabilidade!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Axustes do cifrado extremo-a-extremo"),
"Enter a group name": MessageLookupByLibrary.simpleMessage(
"Escribe un nome para o grupo"),
"Enter a username":
MessageLookupByLibrary.simpleMessage("Escribe un nome de usuaria"),
"Enter your homeserver": MessageLookupByLibrary.simpleMessage(
"Escribe o teu servidor de inicio"),
"File name": MessageLookupByLibrary.simpleMessage("Nome do ficheiro"),
"File size": MessageLookupByLibrary.simpleMessage("Tamaño do ficheiro"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Reenviar"),
"Friday": MessageLookupByLibrary.simpleMessage("Venres"),
"From joining":
MessageLookupByLibrary.simpleMessage("Desde que se una"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("Desde o convite"),
"Group": MessageLookupByLibrary.simpleMessage("Grupo"),
"Group description":
MessageLookupByLibrary.simpleMessage("Descrición do grupo"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage("Mudou a descrición do grupo"),
"Group is public":
MessageLookupByLibrary.simpleMessage("O grupo é público"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("Non se permiten convidadas"),
"Guests can join":
MessageLookupByLibrary.simpleMessage("Permítense convidadas"),
"Help": MessageLookupByLibrary.simpleMessage("Axuda"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"Servidor de inicio non compatible"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("¿Que tal estás hoxe?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("Identidade"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Convidar contacto"),
"Invited": MessageLookupByLibrary.simpleMessage("Convidado"),
"Invited users only":
MessageLookupByLibrary.simpleMessage("Só usuarias convidadas"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"Semella que non tes os servizos de google no teu dispositivo. Ben feito! a túa privacidade agradécecho! Para recibir notificacións push en FluffyChat recomendamos usar microG: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Expulsar da conversa"),
"Last seen IP": MessageLookupByLibrary.simpleMessage("Última IP vista"),
"Leave": MessageLookupByLibrary.simpleMessage("Saír"),
"Left the chat":
MessageLookupByLibrary.simpleMessage("Deixar a conversa"),
"License": MessageLookupByLibrary.simpleMessage("Licenza"),
"Light": MessageLookupByLibrary.simpleMessage("Claro"),
"Load more...": MessageLookupByLibrary.simpleMessage("Cargar máis..."),
"Loading... Please wait":
MessageLookupByLibrary.simpleMessage("Cargando... Agarda"),
"Login": MessageLookupByLibrary.simpleMessage("Conexión"),
"Logout": MessageLookupByLibrary.simpleMessage("Desconectar"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Converter en moderadora"),
"Make an admin":
MessageLookupByLibrary.simpleMessage("Converter en administradora"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Asegúrate de que o identificador é válido"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"A mensaxe eliminarase para todas as participantes"),
"Moderator": MessageLookupByLibrary.simpleMessage("Moderadora"),
"Monday": MessageLookupByLibrary.simpleMessage("Luns"),
"Mute chat": MessageLookupByLibrary.simpleMessage("Acalar conversa"),
"New message in FluffyChat":
MessageLookupByLibrary.simpleMessage("Nova mensaxe en FluffyChat"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Nova conversa privada"),
"No emotes found. 😕":
MessageLookupByLibrary.simpleMessage("Non hai emotes. 😕"),
"No permission": MessageLookupByLibrary.simpleMessage("Sen permiso"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("Non se atoparon salas..."),
"None": MessageLookupByLibrary.simpleMessage("Ningún"),
"Not supported in web":
MessageLookupByLibrary.simpleMessage("Non soportado na web"),
"Oops something went wrong...":
MessageLookupByLibrary.simpleMessage("Ooooi, algo fallou..."),
"Open app to read messages":
MessageLookupByLibrary.simpleMessage("Abrir a app e ler mensaxes"),
"Open camera": MessageLookupByLibrary.simpleMessage("Abrir cámara"),
"Participating user devices": MessageLookupByLibrary.simpleMessage(
"Dispositivos das usuarias participantes"),
"Password": MessageLookupByLibrary.simpleMessage("Contrasinal"),
"Pick image":
MessageLookupByLibrary.simpleMessage("Escolle unha imaxe"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Ten en conta que polo de agora precisas Pantalaimon para o cifrado extremo-a-extremo."),
"Please choose a username":
MessageLookupByLibrary.simpleMessage("Escolle un nome de usuaria"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Escribe un identificador matrix"),
"Please enter your password":
MessageLookupByLibrary.simpleMessage("Escribe o teu contrasinal"),
"Please enter your username": MessageLookupByLibrary.simpleMessage(
"Escribe o teu nome de usuaria"),
"Public Rooms": MessageLookupByLibrary.simpleMessage("Salas públicas"),
"Recording": MessageLookupByLibrary.simpleMessage("Gravando"),
"Reject": MessageLookupByLibrary.simpleMessage("Rexeitar"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Volta a unirte"),
"Remove": MessageLookupByLibrary.simpleMessage("Eliminar"),
"Remove all other devices": MessageLookupByLibrary.simpleMessage(
"Quitar todos os outros dispositivos"),
"Remove device":
MessageLookupByLibrary.simpleMessage("Quitar dispositivo"),
"Remove exile": MessageLookupByLibrary.simpleMessage("Quitar o veto"),
"Remove message":
MessageLookupByLibrary.simpleMessage("Eliminar mensaxe"),
"Render rich message content": MessageLookupByLibrary.simpleMessage(
"Mostrar contido enriquecido da mensaxe"),
"Reply": MessageLookupByLibrary.simpleMessage("Responder"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Solicitar permiso"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Solicitar ler mensaxes antigas"),
"Revoke all permissions":
MessageLookupByLibrary.simpleMessage("Revogar tódolos permisos"),
"Room has been upgraded":
MessageLookupByLibrary.simpleMessage("A sala foi actualizada"),
"Saturday": MessageLookupByLibrary.simpleMessage("Sábado"),
"Search for a chat":
MessageLookupByLibrary.simpleMessage("Buscar un chat"),
"Seen a long time ago":
MessageLookupByLibrary.simpleMessage("Hai moito que non aparece"),
"Send": MessageLookupByLibrary.simpleMessage("Enviar"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Enviar unha mensaxe"),
"Send file": MessageLookupByLibrary.simpleMessage("Enviar ficheiro"),
"Send image": MessageLookupByLibrary.simpleMessage("Enviar imaxe"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("Establecer foto do perfil"),
"Set group description": MessageLookupByLibrary.simpleMessage(
"Establecer descrición do grupo"),
"Set invitation link": MessageLookupByLibrary.simpleMessage(
"Establecer ligazón do convite"),
"Set status": MessageLookupByLibrary.simpleMessage("Establecer estado"),
"Settings": MessageLookupByLibrary.simpleMessage("Axustes"),
"Share": MessageLookupByLibrary.simpleMessage("Compartir"),
"Sign up": MessageLookupByLibrary.simpleMessage("Rexistro"),
"Skip": MessageLookupByLibrary.simpleMessage("Saltar"),
"Source code": MessageLookupByLibrary.simpleMessage("Código fonte"),
"Start your first chat :-)": MessageLookupByLibrary.simpleMessage(
"Abre a primeira conversa :-)"),
"Submit": MessageLookupByLibrary.simpleMessage("Enviar"),
"Sunday": MessageLookupByLibrary.simpleMessage("Domingo"),
"System": MessageLookupByLibrary.simpleMessage("Sistema"),
"Tap to show menu":
MessageLookupByLibrary.simpleMessage("Toca para mostrar menú"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage("O cifrado está corrompido"),
"They Don\'t Match":
MessageLookupByLibrary.simpleMessage("Non concordan"),
"They Match": MessageLookupByLibrary.simpleMessage("Concordan"),
"This room has been archived.":
MessageLookupByLibrary.simpleMessage("A sala foi arquivada."),
"Thursday": MessageLookupByLibrary.simpleMessage("Xoves"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Inténtao outra vez"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Martes"),
"Unblock Device":
MessageLookupByLibrary.simpleMessage("Desbloquear dispositivo"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Dispositivo descoñecido"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Algoritmo de cifrado descoñecido"),
"Unmute chat": MessageLookupByLibrary.simpleMessage("Reactivar chat"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"¿Usar cores compatibles con Amoled?"),
"Username": MessageLookupByLibrary.simpleMessage("Nome de usuaria"),
"Verify": MessageLookupByLibrary.simpleMessage("Verificar"),
"Verify User":
MessageLookupByLibrary.simpleMessage("Verificar usuaria"),
"Video call": MessageLookupByLibrary.simpleMessage("Chamada de vídeo"),
"Visibility of the chat history": MessageLookupByLibrary.simpleMessage(
"Visibilidade do historial da conversa"),
"Visible for all participants": MessageLookupByLibrary.simpleMessage(
"Visible para todas as participantes"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Visible para todas"),
"Voice message": MessageLookupByLibrary.simpleMessage("Mensaxe de voz"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Fondo da conversa"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Mércores"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Benvida a mensaxería instantánea más cuquiña da rede matrix."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Quen se pode unir a este grupo"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Escribe unha mensaxe..."),
"Yes": MessageLookupByLibrary.simpleMessage("Si"),
"You": MessageLookupByLibrary.simpleMessage("Ti"),
"You are invited to this chat":
MessageLookupByLibrary.simpleMessage("Estás convidada a este chat"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Xa non participas desta conversa"),
"You cannot invite yourself":
MessageLookupByLibrary.simpleMessage("Non podes autoconvidarte"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Foches vetada nesta conversa"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Non poderás desactivar o cifrado posteriormente, ¿estás certo?"),
"Your own username":
MessageLookupByLibrary.simpleMessage("O teu nome de usuaria"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("alias"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"Escribe a frase de paso de seguridade ou chave de recuperación para almacenar as chaves."),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"Para poder conectar a outra persoa, escribe a túa frase de paso ou chave de recuperación."),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"Escribe frase de paso de almacenaxe segura ou chave de recuperación para verificar a túa sesión."),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys": MessageLookupByLibrary.simpleMessage(
"Almacenaches as chaves correctamente!"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"Comparar e asegurarse de que estas emoticonas concordan no outro dispositivo:"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"Compara e asegúrate de que os seguintes números concordan cos do outro dispositivo:"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled": MessageLookupByLibrary.simpleMessage(
"A Sinatura-Cruzada está desactivada"),
"crossSigningEnabled":
MessageLookupByLibrary.simpleMessage("Sinatura-Cruzada activada"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists":
MessageLookupByLibrary.simpleMessage("Xa existe ese emote!"),
"emoteInvalid": MessageLookupByLibrary.simpleMessage(
"Atallo do emote non é válido!"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"Escribe un atallo e asocialle unha imaxe!"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Frase de paso ou chave de recuperación incorrecta"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...":
MessageLookupByLibrary.simpleMessage("está escribindo..."),
"isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(
"¿É correcta esta chave do dispositivo?"),
"joinedTheChat": m29,
"keysCached":
MessageLookupByLibrary.simpleMessage("Chaves almacenadas"),
"keysMissing": MessageLookupByLibrary.simpleMessage("Faltan as chaves"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest": MessageLookupByLibrary.simpleMessage(
"Nova solicitude de verificación!"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"Polo momento FluffyChat non soporta a activación da Sinatura-Cruzada. Actívaa desde Element."),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"Actualmente Fluffychat non soporta a activación da Copia En Liña das Chaves. Actívaa desde Element."),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("OK"),
"onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(
"Copia de apoio En liña das Chaves desactivada"),
"onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(
"Copia de Apoio das Chaves activada"),
"passphraseOrKey": MessageLookupByLibrary.simpleMessage(
"frase de paso ou chave de recuperación"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified":
MessageLookupByLibrary.simpleMessage("Sesión verificada"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify": MessageLookupByLibrary.simpleMessage(
"Sesión descoñecida, por favor verifícaa"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession": MessageLookupByLibrary.simpleMessage(
"Sesión verificada correctamente!"),
"verifyManual":
MessageLookupByLibrary.simpleMessage("Verificar manualmente"),
"verifyStart":
MessageLookupByLibrary.simpleMessage("Comezar verificación"),
"verifySuccess":
MessageLookupByLibrary.simpleMessage("Verificaches correctamente!"),
"verifyTitle":
MessageLookupByLibrary.simpleMessage("Verificando a outra conta"),
"waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(
"Agardando a que a outra parte acepte a solicitude..."),
"waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(
"Agardando a que a outra parte acepte as emoticonas..."),
"waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage(
"Agardando a que a outra parte acepte os números...")
};
}

View file

@ -1,599 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a hr locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'hr';
static m0(username) => "${username} je prihvatio/la poziv";
static m1(username) => "${username} je aktivirao/la obostrano šifriranje";
static m60(username) =>
"Prihvatiti ovaj zahtjev za potvrđivanje od ${username}?";
static m2(username, targetName) =>
"${username} je isključio/la ${targetName}";
static m3(homeserver) => "Standardno ćeš biti povezan/a s ${homeserver}";
static m4(username) => "${username} je promijenio/la avatar chata";
static m5(username, description) =>
"${username} je promijenio/la opis chata u: „${description}";
static m6(username, chatname) =>
"${username} je promijenio/la ime chata u: „${chatname}";
static m7(username) => "${username} je promijenio/la dozvole chata";
static m8(username, displayname) =>
"${username} je promijenio/la prikazano ime u: ${displayname}";
static m9(username) =>
"${username} je promijenio/la pravila pristupa za goste";
static m10(username, rules) =>
"${username} je promijenio/la pravila pristupa za goste u: ${rules}";
static m11(username) => "${username} je promijenio/la vidljivost kronologije";
static m12(username, rules) =>
"${username} je promijenio/la vidljivost kronologije u: ${rules}";
static m13(username) => "${username} je promijenio/la pravila pridruživanja";
static m14(username, joinRules) =>
"${username} je promijenio/la pravila pridruživanja u: ${joinRules}";
static m15(username) => "${username} je promijenio/la avatar profila";
static m16(username) => "${username} je promijenio/la pseudonime soba";
static m17(username) => "${username} je promijenio/la poveznicu poziva";
static m18(error) => "Neuspjelo dešifriranje poruke: ${error}";
static m19(count) => "${count} sudionika";
static m20(username) => "${username} je stvorio/la chat";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${day}. ${month}. ${year}.";
static m23(month, day) => "${day}. ${month}.";
static m24(displayname) => "Grupa s ${displayname}";
static m25(username, targetName) =>
"${username} je povukao/la poziv za ${targetName}";
static m26(groupName) => "Pozovi kontakt u ${groupName}";
static m27(username, link) =>
"${username} te je pozvao/la u FluffyChat. \n1. Instaliraj FluffyChat: http://fluffy.chat \n2. Registriraj ili prijavi se \n3. Otvori poveznicu poziva: ${link}";
static m28(username, targetName) => "${username} je pozvao/la ${targetName}";
static m29(username) => "${username} se pridružio/la chatu";
static m30(username, targetName) => "${username} je izbacio/la ${targetName}";
static m31(username, targetName) =>
"${username} je izbacio/la i isključio/la ${targetName}";
static m32(localizedTimeShort) => "Zadnja aktivnost: ${localizedTimeShort}";
static m33(count) => "Učitaj još ${count} sudionika";
static m34(homeserver) => "Prijavi se na ${homeserver}";
static m35(number) => "${number} odabrano";
static m36(fileName) => "Sviraj ${fileName}";
static m37(username) => "${username} je preuredio/la događaj";
static m38(username) => "${username} je odbio/la poziv";
static m39(username) => "Uklonjeno od ${username}";
static m40(username) => "Viđeno od ${username}";
static m41(username, count) =>
"Viđeno od ${username} i još ${count} korisnika";
static m42(username, username2) => "Viđeno od ${username} i ${username2}";
static m43(username) => "${username} ja poslao/la datoteku";
static m44(username) => "${username} ja poslao/la sliku";
static m45(username) => "${username} je poslao/la naljepnicu";
static m46(username) => "${username} ja poslao/la video";
static m47(username) => "${username} ja poslao/la audio";
static m48(username) => "${username} je dijelio/la mjesto";
static m49(hours12, hours24, minutes, suffix) => "${hours24}:${minutes}";
static m50(username, targetName) =>
"${username} je ponovo uključio/la ${targetName}";
static m51(type) => "Nepoznata vrsta događaja „${type}";
static m52(unreadCount) => "${unreadCount} nepročitana chata";
static m53(unreadEvents) => "${unreadEvents} nepročitane poruke";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} nepročitane poruke u ${unreadChats} chata";
static m55(username, count) => "${username} i još ${count} korisnika pišu …";
static m56(username, username2) => "${username} i ${username2} pišu …";
static m57(username) => "${username} piše …";
static m58(username) => "${username} je napustio/la chat";
static m59(username, type) => "${username} ja poslao/la ${type} događaj";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(Opcionalno) Ime grupe"),
"About": MessageLookupByLibrary.simpleMessage("Informacije"),
"Accept": MessageLookupByLibrary.simpleMessage("Prihvati"),
"Account": MessageLookupByLibrary.simpleMessage("Račun"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Podaci računa"),
"Add a group description":
MessageLookupByLibrary.simpleMessage("Dodaj opis grupe"),
"Admin": MessageLookupByLibrary.simpleMessage("Administrator"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("Već imaš račun?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Svatko se može pridružiti"),
"Archive": MessageLookupByLibrary.simpleMessage("Arhiva"),
"Archived Room":
MessageLookupByLibrary.simpleMessage("Arhivirana soba"),
"Are guest users allowed to join": MessageLookupByLibrary.simpleMessage(
"Smiju li se gosti pridružiti grupi"),
"Are you sure?": MessageLookupByLibrary.simpleMessage("Sigurno?"),
"Authentication":
MessageLookupByLibrary.simpleMessage("Autentifikacija"),
"Avatar has been changed":
MessageLookupByLibrary.simpleMessage("Avatar je promijenjen"),
"Ban from chat":
MessageLookupByLibrary.simpleMessage("Isključi iz chata"),
"Banned": MessageLookupByLibrary.simpleMessage("Isključen"),
"Block Device": MessageLookupByLibrary.simpleMessage("Blokiraj uređaj"),
"Cancel": MessageLookupByLibrary.simpleMessage("Odustani"),
"Change the homeserver": MessageLookupByLibrary.simpleMessage(
"Promijeni domaćeg poslužitelja"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Promijeni ime grupe"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Promijeni poslužitelja"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Promijeni sliku pozadine"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Promijeni svoj stil"),
"Changelog": MessageLookupByLibrary.simpleMessage("Zapis promjena"),
"Chat": MessageLookupByLibrary.simpleMessage("Chat"),
"Chat details": MessageLookupByLibrary.simpleMessage("Detalji chata"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("Odaberi snažnu lozinku"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("Odaberi korisničko ime"),
"Close": MessageLookupByLibrary.simpleMessage("Zatvori"),
"Confirm": MessageLookupByLibrary.simpleMessage("Potvrdi"),
"Connect": MessageLookupByLibrary.simpleMessage("Spoji"),
"Connection attempt failed":
MessageLookupByLibrary.simpleMessage("Neuspio pokušaj povezivanja"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage("Kontakt je pozvan u grupu"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Prikazivač sadržaja"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Kopirano u međuspremnik"),
"Copy": MessageLookupByLibrary.simpleMessage("Kopiraj"),
"Could not set avatar": MessageLookupByLibrary.simpleMessage(
"Neuspjelo postavljanje avatara"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"Neuspjelo postavljanje prikaznog imena"),
"Create": MessageLookupByLibrary.simpleMessage("Stvori"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Stvori račun sada"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Stvori novu grupu"),
"Currently active":
MessageLookupByLibrary.simpleMessage("Trenutačno aktivni"),
"Dark": MessageLookupByLibrary.simpleMessage("Tamna"),
"Delete": MessageLookupByLibrary.simpleMessage("Izbriži"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Izbriži poruku"),
"Deny": MessageLookupByLibrary.simpleMessage("Odbij"),
"Device": MessageLookupByLibrary.simpleMessage("Uređaj"),
"Devices": MessageLookupByLibrary.simpleMessage("Uređaji"),
"Discard picture": MessageLookupByLibrary.simpleMessage("Odbaci sliku"),
"Displayname has been changed": MessageLookupByLibrary.simpleMessage(
"Prikazno ime je promijenjeno"),
"Donate": MessageLookupByLibrary.simpleMessage("Doniraj"),
"Download file":
MessageLookupByLibrary.simpleMessage("Preuzmi datoteku"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Uredi Jitsi primjerak"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Uredi prikazano ime"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Postavke emojija"),
"Emote shortcode":
MessageLookupByLibrary.simpleMessage("Kratica emota"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Prazan chat"),
"Encryption": MessageLookupByLibrary.simpleMessage("Šifriranje"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Algoritam šifriranja"),
"Encryption is not enabled":
MessageLookupByLibrary.simpleMessage("Šifriranje nije aktivirano"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"Obostrano šifriranje je trenutačno u beta stanju! Koriti na vlastitu odgovornost!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Postavke obostranog šifriranja"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Upiši ime grupe"),
"Enter a username":
MessageLookupByLibrary.simpleMessage("Upiši korisničko ime"),
"Enter your homeserver": MessageLookupByLibrary.simpleMessage(
"Upiši svog domaćeg poslužitelja"),
"File name": MessageLookupByLibrary.simpleMessage("Ime datoteke"),
"File size": MessageLookupByLibrary.simpleMessage("Veličina datoteke"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Proslijedi"),
"Friday": MessageLookupByLibrary.simpleMessage("Petak"),
"From joining":
MessageLookupByLibrary.simpleMessage("Od pridruživanja"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("Od poziva"),
"Group": MessageLookupByLibrary.simpleMessage("Grupiraj"),
"Group description": MessageLookupByLibrary.simpleMessage("Opis grupe"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage("Opis grupe je promijenjen"),
"Group is public":
MessageLookupByLibrary.simpleMessage("Grupa je javna"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("Gosti su zabranjeni"),
"Guests can join":
MessageLookupByLibrary.simpleMessage("Gosti se mogu pridružiti"),
"Help": MessageLookupByLibrary.simpleMessage("Pomoć"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"Domaći poslužitelj nije kompatibilan"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("Kako si danas?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("Identitet"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Pozovi kontakt"),
"Invited": MessageLookupByLibrary.simpleMessage("Pozvan/a"),
"Invited users only":
MessageLookupByLibrary.simpleMessage("Samo pozvani korisnici"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"Čini se da na mobitelu nemaš google usluge. To je dobra odluka za tvoju privatnost! Za primanje push obavijesti u FluffyChatu preporučujemo upotrebu microG-a: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Izbaci iz chata"),
"Last seen IP":
MessageLookupByLibrary.simpleMessage("Zadnji viđeni IP"),
"Leave": MessageLookupByLibrary.simpleMessage("Napusti"),
"Left the chat":
MessageLookupByLibrary.simpleMessage("Napustio/la je chat"),
"License": MessageLookupByLibrary.simpleMessage("Licenca"),
"Light": MessageLookupByLibrary.simpleMessage("Svjetla"),
"Load more...": MessageLookupByLibrary.simpleMessage("Učitaj više …"),
"Loading... Please wait":
MessageLookupByLibrary.simpleMessage("Učitava se … Pričekaj"),
"Login": MessageLookupByLibrary.simpleMessage("Prijava"),
"Logout": MessageLookupByLibrary.simpleMessage("Odjava"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Postavi kao voditelja"),
"Make an admin":
MessageLookupByLibrary.simpleMessage("Postavi kao administratora"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Provjeri je li identifikator ispravan"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"Poruke će se ukloniti za sve sudionike"),
"Moderator": MessageLookupByLibrary.simpleMessage("Voditelj"),
"Monday": MessageLookupByLibrary.simpleMessage("Ponedjeljak"),
"Mute chat":
MessageLookupByLibrary.simpleMessage("Isključi zvuk chata"),
"New message in FluffyChat":
MessageLookupByLibrary.simpleMessage("Nova poruka u FluffyChatu"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Novi privatni chat"),
"No emotes found. 😕":
MessageLookupByLibrary.simpleMessage("Nema emota. 😕"),
"No permission": MessageLookupByLibrary.simpleMessage("Bez dozvole"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("Nema pronađenih soba …"),
"None": MessageLookupByLibrary.simpleMessage("Ništa"),
"Not supported in web":
MessageLookupByLibrary.simpleMessage("Nije podržano u internetu"),
"Oops something went wrong...": MessageLookupByLibrary.simpleMessage(
"Ups, došlo je do neke greške …"),
"Open app to read messages": MessageLookupByLibrary.simpleMessage(
"Za čitanje poruka, otvori program"),
"Open camera": MessageLookupByLibrary.simpleMessage("Otvori kameru"),
"Participating user devices": MessageLookupByLibrary.simpleMessage(
"Sudjelujući korisnički uređaji"),
"Password": MessageLookupByLibrary.simpleMessage("Lozinka"),
"Pick image": MessageLookupByLibrary.simpleMessage("Odaberi sliku"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Za sada trebaš Pantalaimon za obostrano šifriranje."),
"Please choose a username":
MessageLookupByLibrary.simpleMessage("Odaberi korisničko ime"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage("Upiši identifikator matrice"),
"Please enter your password":
MessageLookupByLibrary.simpleMessage("Upiši svoju lozinku"),
"Please enter your username":
MessageLookupByLibrary.simpleMessage("Upiši svoje korisničko ime"),
"Public Rooms": MessageLookupByLibrary.simpleMessage("Javne sobe"),
"Recording": MessageLookupByLibrary.simpleMessage("Snimanje"),
"Reject": MessageLookupByLibrary.simpleMessage("Odbij"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Ponovo se pridruži"),
"Remove": MessageLookupByLibrary.simpleMessage("Ukloni"),
"Remove all other devices":
MessageLookupByLibrary.simpleMessage("Ukloni sve druge uređaje"),
"Remove device": MessageLookupByLibrary.simpleMessage("Ukloni uređaj"),
"Remove exile":
MessageLookupByLibrary.simpleMessage("Ukloni izbacivanje"),
"Remove message": MessageLookupByLibrary.simpleMessage("Ukloni poruku"),
"Render rich message content": MessageLookupByLibrary.simpleMessage(
"Prikaži formatirani sadržaj poruke"),
"Reply": MessageLookupByLibrary.simpleMessage("Odgovori"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Zatraži dozvolu"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Zahtjev za čitanje starijih poruka"),
"Revoke all permissions":
MessageLookupByLibrary.simpleMessage("Opozovi sve dozvole"),
"Room has been upgraded":
MessageLookupByLibrary.simpleMessage("Ova soba je nadograđena"),
"Saturday": MessageLookupByLibrary.simpleMessage("Subota"),
"Search for a chat": MessageLookupByLibrary.simpleMessage("Traži chat"),
"Seen a long time ago":
MessageLookupByLibrary.simpleMessage("Viđeno prije dugo vremena"),
"Send": MessageLookupByLibrary.simpleMessage("Pošalji"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Pošalji poruku"),
"Send file": MessageLookupByLibrary.simpleMessage("Pošalji datoteku"),
"Send image": MessageLookupByLibrary.simpleMessage("Pošalji sliku"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("Postavi sliku profila"),
"Set group description":
MessageLookupByLibrary.simpleMessage("Postavi opis grupe"),
"Set invitation link": MessageLookupByLibrary.simpleMessage(
"Pošalji poveznicu za pozivnicu"),
"Set status": MessageLookupByLibrary.simpleMessage("Postavi stanje"),
"Settings": MessageLookupByLibrary.simpleMessage("Postavke"),
"Share": MessageLookupByLibrary.simpleMessage("Dijeli"),
"Sign up": MessageLookupByLibrary.simpleMessage("Prijavi se"),
"Skip": MessageLookupByLibrary.simpleMessage("Preskoči"),
"Source code": MessageLookupByLibrary.simpleMessage("Izvorni kȏd"),
"Start your first chat :-)":
MessageLookupByLibrary.simpleMessage("Počni svoj prvi chat :-)"),
"Submit": MessageLookupByLibrary.simpleMessage("Pošalji"),
"Sunday": MessageLookupByLibrary.simpleMessage("Nedjelja"),
"System": MessageLookupByLibrary.simpleMessage("Sustav"),
"Tap to show menu":
MessageLookupByLibrary.simpleMessage("Dodirni za prikaz izbornika"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage("Šifriranje je oštećeno"),
"They Don\'t Match":
MessageLookupByLibrary.simpleMessage("Ne poklapaju se"),
"They Match": MessageLookupByLibrary.simpleMessage("Poklapaju se"),
"This room has been archived.":
MessageLookupByLibrary.simpleMessage("Ova soba je arhivirana."),
"Thursday": MessageLookupByLibrary.simpleMessage("Četvrtak"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Pokušaj ponovo poslati"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Utorak"),
"Unblock Device":
MessageLookupByLibrary.simpleMessage("Deblokiraj uređaj"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Nepoznat uređaj"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Nepoznat algoritam šifriranja"),
"Unmute chat":
MessageLookupByLibrary.simpleMessage("Uključi zvuk chata"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"Koristiti Amoled kompatibilne boje?"),
"Username": MessageLookupByLibrary.simpleMessage("Korisničko ime"),
"Verify": MessageLookupByLibrary.simpleMessage("Provjeri"),
"Verify User":
MessageLookupByLibrary.simpleMessage("Provjeri korisnika"),
"Video call": MessageLookupByLibrary.simpleMessage("Video poziv"),
"Visibility of the chat history": MessageLookupByLibrary.simpleMessage(
"Vidljivost kronologije chata"),
"Visible for all participants":
MessageLookupByLibrary.simpleMessage("Vidljivo za sve sudionike"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Vidljivo za sve"),
"Voice message":
MessageLookupByLibrary.simpleMessage("Glasovna poruka"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Slika pozadine"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Srijeda"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Lijep pozdrav u najslađi program za čavrljanje u matrix-mreži."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Tko se smije pridružiti grupi"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Napiši poruku …"),
"Yes": MessageLookupByLibrary.simpleMessage("Da"),
"You": MessageLookupByLibrary.simpleMessage("Ti"),
"You are invited to this chat":
MessageLookupByLibrary.simpleMessage("Pozvan/a si u ovaj chat"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Više ne sudjeluješ u ovom chatu"),
"You cannot invite yourself":
MessageLookupByLibrary.simpleMessage("Sebe ne možeš pozvati"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Isključen/a si iz ovog chata"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Više nećeš moći deaktivirati šifriranje. Sigurno?"),
"Your own username":
MessageLookupByLibrary.simpleMessage("Tvoje korisničko ime"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("pseudonim"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"Upiši svoju sigurnosnu lozinku ili ključ za obnavljanje, kako bi se ključevi spremili u predmemoriju."),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"Za potpisivanje druge osobe, upiši svoju sigurnosnu lozinku ili ključ za obnavljanje."),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"Za potvrđivanje tvoje sesije, upiši svoju sigurnosnu lozinku ili ključ za obnavljanje."),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys": MessageLookupByLibrary.simpleMessage(
"Uspješno međuspremljeni ključevi!"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"Usporedi i provjeri, poklapaju li se sljedeći emojiji s onima drugog uređaja:"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"Usporedi i provjeri, poklapaju li se sljedeći brojevi s onima drugog uređaja:"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled": MessageLookupByLibrary.simpleMessage(
"Unakrsno potpisivanje je deaktivirano"),
"crossSigningEnabled": MessageLookupByLibrary.simpleMessage(
"Unakrsno potpisivanje je aktivirano"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists":
MessageLookupByLibrary.simpleMessage("Emot već postoji!"),
"emoteInvalid":
MessageLookupByLibrary.simpleMessage("Neispravna kratica emota!"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"Moraš odabrati jednu kraticu emota i sliku!"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Neispravna lozinka ili ključ za obnavljanje"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...": MessageLookupByLibrary.simpleMessage("piše …"),
"isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(
"Je li sljedeći ključ uređaja ispravan?"),
"joinedTheChat": m29,
"keysCached": MessageLookupByLibrary.simpleMessage(
"Ključevi su spremljeni u predmemoriji"),
"keysMissing":
MessageLookupByLibrary.simpleMessage("Nedostaju ključevi"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest":
MessageLookupByLibrary.simpleMessage("Novi zahtjev za provjeru!"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat trenutačno ne podržava unakrsno potpisivanje. Aktiviraj je pomoću Element-a."),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat trenutačno ne podržava online sigurnosnu kopiju ključeva. Aktiviraj je pomoću Element-a."),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("u redu"),
"onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(
"Online sigurnosna kopija ključeva je deaktivirana"),
"onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(
"Online sigurnosna kopija ključeva je aktivirana"),
"passphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Lozinka ili ključ za obnavljanje"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified":
MessageLookupByLibrary.simpleMessage("Sesija je provjerena"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify":
MessageLookupByLibrary.simpleMessage("Nepoznata sesija, provjeri"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession":
MessageLookupByLibrary.simpleMessage("Uspješno provjerena sesija!"),
"verifyManual": MessageLookupByLibrary.simpleMessage("Provjeri ručno"),
"verifyStart": MessageLookupByLibrary.simpleMessage("Pokreni provjeru"),
"verifySuccess":
MessageLookupByLibrary.simpleMessage("Uspješno si provjerio/la!"),
"verifyTitle":
MessageLookupByLibrary.simpleMessage("Provjeravanje drugog računa"),
"waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(
"Čekanje na partnera, da prihvati zahtjeva …"),
"waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(
"Čekanje na partnera, da prihvati emoji …"),
"waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage(
"Čekanje na partnera, da prihvati brojeve …")
};
}

View file

@ -1,611 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a hu locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'hu';
static m0(username) => "${username} elfogadta a meghívást";
static m1(username) =>
"${username} aktiválta a végpontól-végpontig titkosítást";
static m60(username) => "Elfogadod ${username} hitelesítési kérelmét?";
static m2(username, targetName) => "${username} kitiltotta ${targetName}-t";
static m3(homeserver) => "Alapértelmezésben ${homeserver}-hoz csatlakozol";
static m4(username) => "${username} módosította a csevegés képét";
static m5(username, description) =>
"${username} módosította a csevegés leírását erre: \'${description}\'";
static m6(username, chatname) =>
"${username} módosította a csevegés nevét erre: \'${chatname}\'";
static m7(username) => "${username} módosította a csevegési enegedélyeket";
static m8(username, displayname) =>
"${username} módosította a megjenelítési nevét erre: ${displayname}";
static m9(username) =>
"${username} módosította a vendégek hozzáférési jogait";
static m10(username, rules) =>
"${username} módosította a vendégek hozzáférési jogait, így: ${rules}";
static m11(username) =>
"${username} módosította a múltbéli események láthatóságát";
static m12(username, rules) =>
"${username} módosította a múltbéli események láthatóságát, így: ${rules}";
static m13(username) => "${username} módosított a csatlakozási szabályokat";
static m14(username, joinRules) =>
"${username} módosította a csatlakozási szabályokat, így: ${joinRules}";
static m15(username) => "${username} módosította a profil képét";
static m16(username) => "${username} módosítottaa szoba álnevét";
static m17(username) => "${username} módosította a meghívó linket";
static m18(error) =>
"Nem sikerült visszafejteni a titkosított üzenetet: ${error}";
static m19(count) => "${count} résztvevő";
static m20(username) => "${username} létrehozta a csevegést";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${year}-${month}-${day}";
static m23(month, day) => "${month}-${day}";
static m24(displayname) => "Csoport ${displayname}-vel";
static m25(username, targetName) =>
"${username} visszavonta ${targetName} meghívását";
static m26(groupName) => "Ismerős meghívása a ${groupName} csoportba";
static m27(username, link) =>
"${username} meghívott a FluffyChatre. \n1. FluffyChat telepítése: http://fluffy.chat \n2. Jelentkezz be vagy regisztrálj. \n3. Nyisd meg a meghívó linket: ${link}";
static m28(username, targetName) => "${username} meghívta ${targetName}-t";
static m29(username) => "${username} csatalakozott a csevegéshez";
static m30(username, targetName) => "${username} kirúgta ${targetName}-t";
static m31(username, targetName) =>
"${username} kirúgta és kitiltotta ${targetName}-t";
static m32(localizedTimeShort) => "Utoljára aktív: ${localizedTimeShort}";
static m33(count) => "További ${count} résztvevő betöltése";
static m34(homeserver) => "Bejelentkezés ${homeserver} Matrix szerverre";
static m35(number) => "${number} kijelölve";
static m36(fileName) => "${fileName} lejátszása";
static m37(username) => "${username} visszavont egy eseményt";
static m38(username) => "${username} elutasította a meghívást";
static m39(username) => "Törölve ${username} által";
static m40(username) => "${username} látta";
static m41(username, count) =>
"${username} és ${count} másik résztvevő látta";
static m42(username, username2) => "${username} és ${username2} látta";
static m43(username) => "${username} fájlt küldött";
static m44(username) => "${username} képet küldött";
static m45(username) => "${username} matricát küldött";
static m46(username) => "${username} videót küldött";
static m47(username) => "${username} hangüzenetet küldött";
static m48(username) => "${username} megosztotta a pozícióját";
static m49(hours12, hours24, minutes, suffix) => "${hours24}:${minutes}";
static m50(username, targetName) =>
"${username} feloldotta ${targetName} kitiltását";
static m51(type) => "Ismeretlen esemény \'${type}\'";
static m52(unreadCount) => "${unreadCount} olvasatlan üzenet";
static m53(unreadEvents) => "${unreadEvents} olvasatlan üzenet";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} olvastlan üzenet van ${unreadChats}-ban";
static m55(username, count) =>
"${username} és ${count} másik résztvevő gépel...";
static m56(username, username2) => "${username} és ${username2} gépel...";
static m57(username) => "${username} gépel...";
static m58(username) => "${username} elhagyta a csevegést";
static m59(username, type) => "${username} ${type} eseményt küldött";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(Nem kötelező) Csoport név"),
"About": MessageLookupByLibrary.simpleMessage("Névjegy"),
"Accept": MessageLookupByLibrary.simpleMessage("Elfogad"),
"Account": MessageLookupByLibrary.simpleMessage("Fiók"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Fiók információk"),
"Add a group description":
MessageLookupByLibrary.simpleMessage("Csoport leírás hozzáadása"),
"Admin": MessageLookupByLibrary.simpleMessage("Admin"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("Van már fiókod?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Bárki csatlakozhat"),
"Archive": MessageLookupByLibrary.simpleMessage("Archív"),
"Archived Room":
MessageLookupByLibrary.simpleMessage("Archivált szoba"),
"Are guest users allowed to join": MessageLookupByLibrary.simpleMessage(
"Csatlakozhatnak vendég felhasználók"),
"Are you sure?": MessageLookupByLibrary.simpleMessage("Biztos?"),
"Authentication": MessageLookupByLibrary.simpleMessage("Hitelesítés"),
"Avatar has been changed":
MessageLookupByLibrary.simpleMessage("Az avatar megváltozott"),
"Ban from chat":
MessageLookupByLibrary.simpleMessage("Csevegésből kitiltás"),
"Banned": MessageLookupByLibrary.simpleMessage("Kitiltva"),
"Block Device":
MessageLookupByLibrary.simpleMessage("Eszköz blokkolása"),
"Cancel": MessageLookupByLibrary.simpleMessage("Mégsem"),
"Change the homeserver":
MessageLookupByLibrary.simpleMessage("Matrix szerver váltás"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Csoport nevének módosítása"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Szerver módosítás"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Háttér módosítása"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Stílus módosítása"),
"Changelog": MessageLookupByLibrary.simpleMessage("Változás napló"),
"Chat": MessageLookupByLibrary.simpleMessage("Csevegés"),
"Chat details":
MessageLookupByLibrary.simpleMessage("Csevegés részletei"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("Válassz egy erős jelszót"),
"Choose a username": MessageLookupByLibrary.simpleMessage(
"Válassz egy felhasználónevet"),
"Close": MessageLookupByLibrary.simpleMessage("Bezárás"),
"Confirm": MessageLookupByLibrary.simpleMessage("Megerősítés"),
"Connect": MessageLookupByLibrary.simpleMessage("Csatlakozás"),
"Connection attempt failed": MessageLookupByLibrary.simpleMessage(
"Csatlakozási kísérlet meghiusult"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"Meghívtad ismerősödet a csoportba"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Tartalom nézegető"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Vágólapra másolva"),
"Copy": MessageLookupByLibrary.simpleMessage("Másolás"),
"Could not set avatar": MessageLookupByLibrary.simpleMessage(
"Nem sikerült beállítani a képet"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"Nem sikerült beállítani a megjelenítési nevet"),
"Create": MessageLookupByLibrary.simpleMessage("Létrehozás"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Új fiók létrehozása"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Új csoport létrehozása"),
"Currently active":
MessageLookupByLibrary.simpleMessage("Jelenleg aktív"),
"Dark": MessageLookupByLibrary.simpleMessage("Sötét"),
"Delete": MessageLookupByLibrary.simpleMessage("Törlés"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Üzenet törlése"),
"Deny": MessageLookupByLibrary.simpleMessage("Elutasítás"),
"Device": MessageLookupByLibrary.simpleMessage("Eszköz"),
"Devices": MessageLookupByLibrary.simpleMessage("Eszközök"),
"Discard picture": MessageLookupByLibrary.simpleMessage("Kép elvetése"),
"Displayname has been changed": MessageLookupByLibrary.simpleMessage(
"Megjelenítési név megváltozott"),
"Donate": MessageLookupByLibrary.simpleMessage("Támogatom"),
"Download file": MessageLookupByLibrary.simpleMessage("File letöltése"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Jitsi példány módosítása"),
"Edit displayname": MessageLookupByLibrary.simpleMessage(
"Megjelenítési név módosítása"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Hangulatjel beállítások"),
"Emote shortcode":
MessageLookupByLibrary.simpleMessage("Rövid kód a hangulatjelhez"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Üres csevegés"),
"Encryption": MessageLookupByLibrary.simpleMessage("Titkosítás"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Titkosítási algoritmus"),
"Encryption is not enabled": MessageLookupByLibrary.simpleMessage(
"Titkosítás nincs engedélyezve"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"Végpontól-végpontig titkosítás egyelőre béta! Csak saját felelősségre!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Végpontól-végpontig titkosítás beállításai"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Adj meg egy csoport nevet"),
"Enter a username": MessageLookupByLibrary.simpleMessage(
"Adj meg egy felhasználónevet"),
"Enter your homeserver": MessageLookupByLibrary.simpleMessage(
"Add meg a Matrix szervered nevét"),
"File name": MessageLookupByLibrary.simpleMessage("Fájl név"),
"File size": MessageLookupByLibrary.simpleMessage("Fájl méret"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Továbbítás"),
"Friday": MessageLookupByLibrary.simpleMessage("Péntek"),
"From joining": MessageLookupByLibrary.simpleMessage("Belépés óta"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("Meghívás óta"),
"Group": MessageLookupByLibrary.simpleMessage("Csoport"),
"Group description":
MessageLookupByLibrary.simpleMessage("Csoport leírás"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage(
"Csoport leírása megváltozott"),
"Group is public":
MessageLookupByLibrary.simpleMessage("A csoport publikus"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("Vendégeknek tilos a belépés"),
"Guests can join":
MessageLookupByLibrary.simpleMessage("Vendégek csatlakozhatnak"),
"Help": MessageLookupByLibrary.simpleMessage("Segítség"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"Ez a Matrix szerver nem kompatibilis"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("Hogy vagy?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("Azonosság"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Ismerős meghívása"),
"Invited": MessageLookupByLibrary.simpleMessage("Meghívott"),
"Invited users only":
MessageLookupByLibrary.simpleMessage("Csak meghívottak"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"Úgy tűnik ügyelsz a magánszférádra és nincsenek google szolgáltatások telepítve. Hogy így is kapj azonnali értesítéseket javasoljuk a microG-t: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Csevegésből kirúgás"),
"Last seen IP":
MessageLookupByLibrary.simpleMessage("Utoljára látott IP"),
"Leave": MessageLookupByLibrary.simpleMessage("Csevegés elhagyása"),
"Left the chat":
MessageLookupByLibrary.simpleMessage("Elhagyta a csevegést"),
"License": MessageLookupByLibrary.simpleMessage("Licenc"),
"Light": MessageLookupByLibrary.simpleMessage("Világos"),
"Load more...":
MessageLookupByLibrary.simpleMessage("Továbbiak betöltése..."),
"Loading... Please wait":
MessageLookupByLibrary.simpleMessage("Betöltés... Kérlek várj"),
"Login": MessageLookupByLibrary.simpleMessage("Bejelentkezés"),
"Logout": MessageLookupByLibrary.simpleMessage("Kijelentkezés"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Kinevezés moderátorrá"),
"Make an admin":
MessageLookupByLibrary.simpleMessage("Kinevezés adminná"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Bizonyosodj meg az azonosító helyességéről"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"Az üzenet minden résztvevő számára törlődni fog"),
"Moderator": MessageLookupByLibrary.simpleMessage("Moderátor"),
"Monday": MessageLookupByLibrary.simpleMessage("Hétfő"),
"Mute chat": MessageLookupByLibrary.simpleMessage("Csevegés némítása"),
"New message in FluffyChat":
MessageLookupByLibrary.simpleMessage("Új üzenet a FluffyChaten"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Új privát csevegés"),
"No emotes found. 😕":
MessageLookupByLibrary.simpleMessage("Nincsenek hangulatjelek. 😕"),
"No permission":
MessageLookupByLibrary.simpleMessage("Nincsenek engedélyek"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("Nem találtam szobákat..."),
"None": MessageLookupByLibrary.simpleMessage("Nincs"),
"Not supported in web":
MessageLookupByLibrary.simpleMessage("Nem támogatott a weben"),
"Oops something went wrong...": MessageLookupByLibrary.simpleMessage(
"Hoppá, valami baj történt..."),
"Open app to read messages": MessageLookupByLibrary.simpleMessage(
"App megnyitása az üzenetek elolvasásához"),
"Open camera":
MessageLookupByLibrary.simpleMessage("Kamera megnyitása"),
"Participating user devices": MessageLookupByLibrary.simpleMessage(
"Résztvevő felhasználók eszközei"),
"Password": MessageLookupByLibrary.simpleMessage("Jelszó"),
"Pick image": MessageLookupByLibrary.simpleMessage("Válassz egy képet"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Tájékoztatlak, hogy egyelőre szükséged van a Pantalaimon-ra, hogy a végponttól-végpontig titkosítást hasnzáld."),
"Please choose a username": MessageLookupByLibrary.simpleMessage(
"Válassz egy felhasználónevet"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Írj be egy Matrix azonosítót"),
"Please enter your password":
MessageLookupByLibrary.simpleMessage("Add meg a jelszavad"),
"Please enter your username": MessageLookupByLibrary.simpleMessage(
"Add meg a felhasználónevedet"),
"Public Rooms": MessageLookupByLibrary.simpleMessage("Publikus szoba"),
"Recording": MessageLookupByLibrary.simpleMessage("Felvétel"),
"Reject": MessageLookupByLibrary.simpleMessage("Visszautasít"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Újracsatlakozás"),
"Remove": MessageLookupByLibrary.simpleMessage("Eltávolítás"),
"Remove all other devices": MessageLookupByLibrary.simpleMessage(
"Minden más eszköz eltávolítása"),
"Remove device":
MessageLookupByLibrary.simpleMessage("Eszköz eltávolítása"),
"Remove exile":
MessageLookupByLibrary.simpleMessage("Kitiltás feloldása"),
"Remove message":
MessageLookupByLibrary.simpleMessage("Üzenet eltávolítása"),
"Render rich message content": MessageLookupByLibrary.simpleMessage(
"Formázott üzenetek megjelenítése"),
"Reply": MessageLookupByLibrary.simpleMessage("Válasz"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Jogosultság igénylése"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Korábbi üzenetekhez való hozzáférés igénylése"),
"Revoke all permissions": MessageLookupByLibrary.simpleMessage(
"Minden jogosultság megvonása"),
"Room has been upgraded":
MessageLookupByLibrary.simpleMessage("Szoba frissítve lett"),
"Saturday": MessageLookupByLibrary.simpleMessage("Szombat"),
"Search for a chat":
MessageLookupByLibrary.simpleMessage("Csevegés keresése"),
"Seen a long time ago":
MessageLookupByLibrary.simpleMessage("Már régen látta"),
"Send": MessageLookupByLibrary.simpleMessage("Küldés"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Üzenet küldése"),
"Send file": MessageLookupByLibrary.simpleMessage("Fájl küldése"),
"Send image": MessageLookupByLibrary.simpleMessage("Kép küldése"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("Profilkép beállítása"),
"Set group description":
MessageLookupByLibrary.simpleMessage("Csoport leírás beállítása"),
"Set invitation link":
MessageLookupByLibrary.simpleMessage("Meghívó link beállítása"),
"Set status":
MessageLookupByLibrary.simpleMessage("Állapot beállítása"),
"Settings": MessageLookupByLibrary.simpleMessage("Beállítások"),
"Share": MessageLookupByLibrary.simpleMessage("Megosztás"),
"Sign up": MessageLookupByLibrary.simpleMessage("Felíratkozás"),
"Skip": MessageLookupByLibrary.simpleMessage("Kihagy"),
"Source code": MessageLookupByLibrary.simpleMessage("Forráskód"),
"Start your first chat :-)":
MessageLookupByLibrary.simpleMessage("Kezdj el csevegni :-)"),
"Submit": MessageLookupByLibrary.simpleMessage("Mehet"),
"Sunday": MessageLookupByLibrary.simpleMessage("Vasárnap"),
"System": MessageLookupByLibrary.simpleMessage("Rendszer"),
"Tap to show menu": MessageLookupByLibrary.simpleMessage(
"Érintsd meg a menü megnyitásához"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage(
"A titkosítás sérült és megbízhatatlan"),
"They Don\'t Match":
MessageLookupByLibrary.simpleMessage("Nem egyeznek"),
"They Match": MessageLookupByLibrary.simpleMessage("Megegyeznek"),
"This room has been archived.":
MessageLookupByLibrary.simpleMessage("Ez a szoba archiválva lett."),
"Thursday": MessageLookupByLibrary.simpleMessage("Csütörtök"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Próbáld újraküldeni"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Kedd"),
"Unblock Device": MessageLookupByLibrary.simpleMessage(
"Eszköz blokkolásának megszüntetése"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Ismeretlen eszköz"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Ismeretlen titkosítási algoritmus"),
"Unmute chat":
MessageLookupByLibrary.simpleMessage("Csevegés felhangosítása"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"AmoLED kompatibilis színek használata?"),
"Username": MessageLookupByLibrary.simpleMessage("Felhasználónév"),
"Verify": MessageLookupByLibrary.simpleMessage("Hitelesít"),
"Verify User":
MessageLookupByLibrary.simpleMessage("Felhasználó hitelesítése"),
"Video call": MessageLookupByLibrary.simpleMessage("Videó hívás"),
"Visibility of the chat history": MessageLookupByLibrary.simpleMessage(
"Csevegési előzmény láthatósága"),
"Visible for all participants": MessageLookupByLibrary.simpleMessage(
"Minden résztvevő számára látható"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Bárki számára látható"),
"Voice message": MessageLookupByLibrary.simpleMessage("Hang üzenet"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Háttér"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Szerda"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Üdv a legcukibb üzenetküldő alkalmazásban az egész Matrixon!"),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Ki csatlakozhat a csoporthoz"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Írj egy üzenetet..."),
"Yes": MessageLookupByLibrary.simpleMessage("Igen"),
"You": MessageLookupByLibrary.simpleMessage("Te"),
"You are invited to this chat":
MessageLookupByLibrary.simpleMessage("Meghívtak ebbe a csevegésbe"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Nem veszel részt ebben a csevegésben"),
"You cannot invite yourself":
MessageLookupByLibrary.simpleMessage("Nem tudod meghívni magadat"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Kitiltottak ebből a csevegésből"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Többé nem tudod kikapcsolni a titkosítás. Biztosan folytatod?"),
"Your own username":
MessageLookupByLibrary.simpleMessage("A saját felhasználóneved"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("álnév"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"Add meg a biztonságos tárolóhoz tartozó vagy a visszaállítási jelszavadat, hogy betöltsük a kulcsaidat."),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"A másik személy igazolásához, kérlek add meg jelszavadat vagy visszaállítási kulcsodat."),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"Add meg a biztonságos tárolóhoz tartozó vagy a visszaállítási jelszavadat, a munkamenet hitelesítéséhez."),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys": MessageLookupByLibrary.simpleMessage(
"Sikeresen betöltöttük a kulcsokat!"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"Hasonlítsd össze a hangulatjeleket a másik eszközön lévőkkel:"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"Hasonlítsd össze a számokat a másik eszközön lévőkkel:"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled":
MessageLookupByLibrary.simpleMessage("Kereszt-Aláírás kikapcsolva"),
"crossSigningEnabled":
MessageLookupByLibrary.simpleMessage("Kereszt-Aláírás bekapcsolva"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists":
MessageLookupByLibrary.simpleMessage("A hangulatjel már létezik!"),
"emoteInvalid":
MessageLookupByLibrary.simpleMessage("Érvénytelen rövid kód!"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"A hangulatjelhez válassz egy képet és egy rövid kód"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Hibás jelszó vagy visszaállítási kulcs"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...": MessageLookupByLibrary.simpleMessage("gépel..."),
"isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(
"Helyes az alábbi eszköz kulcs?"),
"joinedTheChat": m29,
"keysCached": MessageLookupByLibrary.simpleMessage("Kulcsok betöltve"),
"keysMissing":
MessageLookupByLibrary.simpleMessage("Kulcsok hiányoznak"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest":
MessageLookupByLibrary.simpleMessage("Új hitelesítési kérelem!"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"FluffyChat jelenleg nem támogatja a Kereszt-Aláírás bekapcsolását. Kérlek engedélyezd Riot-ból."),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"FluffyChat jelenleg nem támogatja az Online Kulcs Archívumot (backup). Kérlek engedélyezd Riot-ból."),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("ok"),
"onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(
"Online Kulcs Archívum letiltva"),
"onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(
"Online Kulcs Archívum engedélyezve"),
"passphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Jelszó vagy visszaállítási kulcs"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified":
MessageLookupByLibrary.simpleMessage("Munkamenet hitelesítve"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify": MessageLookupByLibrary.simpleMessage(
"Ismeretlen munkamenet, kérlek hitelesítsd"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession": MessageLookupByLibrary.simpleMessage(
"Sikeresen hitelesítetted a munkamenetedet!"),
"verifyManual":
MessageLookupByLibrary.simpleMessage("Kézi hitelesítés"),
"verifyStart":
MessageLookupByLibrary.simpleMessage("Hitelesítés megkezdése"),
"verifySuccess":
MessageLookupByLibrary.simpleMessage("Sikeresen hitelesítettél!"),
"verifyTitle":
MessageLookupByLibrary.simpleMessage("Másik fiók hitelesítése"),
"waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(
"Várakozás partnerre, amíg elfogadja a kérést..."),
"waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(
"Várakozás partnere, amíg elfogadja a hangulatjeleket..."),
"waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage(
"Várakozás partnere, amíg elfogadja a számokat...")
};
}

View file

@ -1,538 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a ja locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'ja';
static m0(username) => "${username} が招待を承諾しました";
static m1(username) => "${username} がエンドツーエンド暗号化を有効にしました";
static m60(username) => "${username} の検証リクエストを承認しますか?";
static m2(username, targetName) => "${username}${targetName}をBANしました";
static m3(homeserver) => "デフォルトで${homeserver}に接続されます";
static m4(username) => "${username}がチャットアバターを変更しました";
static m5(username, description) =>
"${username}がチャットの説明を「${description}」に変更しました";
static m6(username, chatname) => "${username}がチャットの名前を「${chatname}」に変更しました";
static m7(username) => "${username}がチャットの権限を変更しました";
static m8(username, displayname) => "${username}が表示名を「${displayname}」に変更しました";
static m9(username) => "${username}がゲストのアクセスルールを変更しました";
static m10(username, rules) => "${username}がゲストのアクセスルールを${rules}に変更しました";
static m11(username) => "${username}が履歴の表示設定を変更しました";
static m12(username, rules) => "${username}が履歴の表示設定を${rules}に変更しました";
static m13(username) => "${username}が参加ルールを変更しました";
static m14(username, joinRules) => "${username}が参加ルールを${joinRules}に変更しました";
static m15(username) => "${username}がプロフィールのアバターを変更しました";
static m16(username) => "${username}が部屋のエイリアスを変更しました";
static m17(username) => "${username}が招待リンクを変更しました";
static m18(error) => "メッセージを解読できませんでした: ${error}";
static m19(count) => "${count}名の参加者";
static m20(username) => "${username}がチャットを作成しました";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${year}-${month}-${day}";
static m23(month, day) => "${month}-${day}";
static m24(displayname) => "${displayname}とグループを作成する";
static m25(username, targetName) => "${targetName}の招待を${username}が取り下げました";
static m26(groupName) => "連絡先から${groupName}に招待する";
static m27(username, link) =>
"${username}がFluffyChatにあなたを招待しました. \n1. FluffyChatをインストールしてください: http://fluffy.chat \n2. 新しくアカウントを作成するかサインインしてください\n3. 招待リンクを開いてください: ${link}";
static m28(username, targetName) => "${username}${targetName}を招待しました";
static m29(username) => "${username}がチャットに参加しました";
static m30(username, targetName) => "${username}${targetName}をキックしました";
static m31(username, targetName) => "${username}${targetName}をキックしBANしました";
static m32(localizedTimeShort) => "最終アクティブ: ${localizedTimeShort}";
static m33(count) => "あと${count}名参加者を読み込む";
static m34(homeserver) => "${homeserver}にログインする";
static m35(number) => "${number}選択されています";
static m36(fileName) => "${fileName}を再生する";
static m37(username) => "${username}がイベントを編集しました";
static m38(username) => "${username}は招待を拒否しました";
static m39(username) => "${username}によって削除されました";
static m40(username) => "${username}が既読";
static m41(username, count) => "${username}と他${count}名が既読";
static m42(username, username2) => "${username}${username2}が既読";
static m43(username) => "${username}はファイルを送信しました";
static m44(username) => "${username}は画像を送信しました";
static m45(username) => "${username}はステッカーを送信しました";
static m46(username) => "${username}は動画を送信しました";
static m47(username) => "${username}は音声を送信しました";
static m48(username) => "${username}は現在地を共有しました";
static m49(hours12, hours24, minutes, suffix) =>
"${hours24}:${minutes} ${suffix}";
static m50(username, targetName) => "${username}${targetName}のBANを解除しました";
static m51(type) => "未知のイベント\'${type}\'";
static m52(unreadCount) => "${unreadCount}の未読メッセージ";
static m53(unreadEvents) => "${unreadEvents}件の未読メッセージ";
static m54(unreadEvents, unreadChats) =>
"${unreadChats}${unreadEvents}件の未読メッセージ";
static m55(username, count) => "${username}と他${count}名が入力しています...";
static m56(username, username2) => "${username}${username2}が入力しています...";
static m57(username) => "${username}が入力しています...";
static m58(username) => "${username}は退室しました";
static m59(username, type) => "${username}${type}イベントを送信しました";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(任意)グループ名"),
"About": MessageLookupByLibrary.simpleMessage("このアプリについて"),
"Accept": MessageLookupByLibrary.simpleMessage("承諾する"),
"Account": MessageLookupByLibrary.simpleMessage("アカウント"),
"Account informations": MessageLookupByLibrary.simpleMessage("アカウント情報"),
"Add a group description":
MessageLookupByLibrary.simpleMessage("グループの説明を追加する"),
"Admin": MessageLookupByLibrary.simpleMessage("管理者"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("アカウントをすでにお持ちですか?"),
"Anyone can join": MessageLookupByLibrary.simpleMessage("誰でも参加できます"),
"Archive": MessageLookupByLibrary.simpleMessage("アーカイブ"),
"Archived Room": MessageLookupByLibrary.simpleMessage("アーカイブされた部屋"),
"Are guest users allowed to join":
MessageLookupByLibrary.simpleMessage("ゲストユーザーの参加を許可する"),
"Are you sure?": MessageLookupByLibrary.simpleMessage("これでよろしいですか?"),
"Authentication": MessageLookupByLibrary.simpleMessage("認証"),
"Avatar has been changed":
MessageLookupByLibrary.simpleMessage("アバターが変更されました"),
"Ban from chat": MessageLookupByLibrary.simpleMessage("チャットからBANする"),
"Banned": MessageLookupByLibrary.simpleMessage("BANされています"),
"Block Device": MessageLookupByLibrary.simpleMessage("デバイスをブロックする"),
"Cancel": MessageLookupByLibrary.simpleMessage("キャンセル"),
"Change the homeserver":
MessageLookupByLibrary.simpleMessage("ホームサーバーの変更"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("グループの名前を変更する"),
"Change the server": MessageLookupByLibrary.simpleMessage("サーバーを変更する"),
"Change wallpaper": MessageLookupByLibrary.simpleMessage("壁紙を変更する"),
"Change your style": MessageLookupByLibrary.simpleMessage("スタイルを変更する"),
"Changelog": MessageLookupByLibrary.simpleMessage("変更履歴"),
"Chat": MessageLookupByLibrary.simpleMessage("チャット"),
"Chat details": MessageLookupByLibrary.simpleMessage("チャットの詳細"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("強いパスワードを選択してください"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("ユーザー名を選択してください"),
"Close": MessageLookupByLibrary.simpleMessage("閉じる"),
"Confirm": MessageLookupByLibrary.simpleMessage("確認しました"),
"Connect": MessageLookupByLibrary.simpleMessage("接続"),
"Connection attempt failed":
MessageLookupByLibrary.simpleMessage("接続が失敗しました"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage("連絡先に登録された人が招待されました"),
"Content viewer": MessageLookupByLibrary.simpleMessage("コンテンツビューアー"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("クリップボードにコピーされました"),
"Copy": MessageLookupByLibrary.simpleMessage("コピー"),
"Could not set avatar":
MessageLookupByLibrary.simpleMessage("アバターをセットできませんでした"),
"Could not set displayname":
MessageLookupByLibrary.simpleMessage("表示名をセットできませんでした"),
"Create": MessageLookupByLibrary.simpleMessage("作成"),
"Create account now":
MessageLookupByLibrary.simpleMessage("アカウントを作成する"),
"Create new group":
MessageLookupByLibrary.simpleMessage("新しいグループを作成する"),
"Currently active": MessageLookupByLibrary.simpleMessage("現在アクティブです"),
"Dark": MessageLookupByLibrary.simpleMessage("ダーク"),
"Delete": MessageLookupByLibrary.simpleMessage("削除"),
"Delete message": MessageLookupByLibrary.simpleMessage("メッセージの削除"),
"Deny": MessageLookupByLibrary.simpleMessage("拒否"),
"Device": MessageLookupByLibrary.simpleMessage("デバイス"),
"Devices": MessageLookupByLibrary.simpleMessage("デバイス"),
"Discard picture": MessageLookupByLibrary.simpleMessage("画像を無視する"),
"Displayname has been changed":
MessageLookupByLibrary.simpleMessage("表示名が変更されました"),
"Donate": MessageLookupByLibrary.simpleMessage("寄付する"),
"Download file": MessageLookupByLibrary.simpleMessage("ファイルのダウンロード"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Jitsiインスタンスを編集する"),
"Edit displayname": MessageLookupByLibrary.simpleMessage("表示名を編集"),
"Emote Settings": MessageLookupByLibrary.simpleMessage("Emote設定"),
"Emote shortcode": MessageLookupByLibrary.simpleMessage("Emoteショートコード"),
"Empty chat": MessageLookupByLibrary.simpleMessage("空のチャット"),
"Encryption": MessageLookupByLibrary.simpleMessage("暗号化"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("暗号化アルゴリズム"),
"Encryption is not enabled":
MessageLookupByLibrary.simpleMessage("暗号化されていません"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"エンドツーエンド暗号化は現在ベータ版です!これは自分自身の責任で行ってください!"),
"End-to-end encryption settings":
MessageLookupByLibrary.simpleMessage("エンドツーエンド暗号化設定"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("グループ名を入力してください"),
"Enter a username":
MessageLookupByLibrary.simpleMessage("ユーザー名を入力してください"),
"Enter your homeserver":
MessageLookupByLibrary.simpleMessage("ホームサーバーを入力してください"),
"File name": MessageLookupByLibrary.simpleMessage("ファイル名"),
"File size": MessageLookupByLibrary.simpleMessage("ファイルサイズ"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("進む"),
"Friday": MessageLookupByLibrary.simpleMessage("金曜日"),
"From joining": MessageLookupByLibrary.simpleMessage("参加から"),
"From the invitation": MessageLookupByLibrary.simpleMessage("招待から"),
"Group": MessageLookupByLibrary.simpleMessage("グループ"),
"Group description": MessageLookupByLibrary.simpleMessage("グループの説明"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage("グループの説明が変更されました"),
"Group is public":
MessageLookupByLibrary.simpleMessage("グループは公開されています"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("ゲストは許可されていません"),
"Guests can join": MessageLookupByLibrary.simpleMessage("ゲストが許可されています"),
"Help": MessageLookupByLibrary.simpleMessage("ヘルプ"),
"Homeserver is not compatible":
MessageLookupByLibrary.simpleMessage("このホームサーバーは互換性がありません"),
"How are you today?": MessageLookupByLibrary.simpleMessage("お元気ですか?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("アイデンティティ"),
"Invite contact": MessageLookupByLibrary.simpleMessage("連絡先から招待する"),
"Invited": MessageLookupByLibrary.simpleMessage("招待されました"),
"Invited users only":
MessageLookupByLibrary.simpleMessage("招待されたユーザーのみ"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"あなたのスマホにはグーグルサービスがないようですね。プライバシーを保護するための良い選択ですPush通知を受け取るにはmicroGを使うことを推奨しています: https://microg.org/"),
"Kick from chat": MessageLookupByLibrary.simpleMessage("チャットからキックする"),
"Last seen IP": MessageLookupByLibrary.simpleMessage("最終IP"),
"Leave": MessageLookupByLibrary.simpleMessage("退室する"),
"Left the chat": MessageLookupByLibrary.simpleMessage("退室しました"),
"License": MessageLookupByLibrary.simpleMessage("ライセンス"),
"Light": MessageLookupByLibrary.simpleMessage("ライト"),
"Load more...": MessageLookupByLibrary.simpleMessage("更に読み込む..."),
"Loading... Please wait":
MessageLookupByLibrary.simpleMessage("読み込み中...お待ちください。"),
"Login": MessageLookupByLibrary.simpleMessage("ログイン"),
"Logout": MessageLookupByLibrary.simpleMessage("ログアウト"),
"Make a moderator": MessageLookupByLibrary.simpleMessage("モデレータを作成する"),
"Make an admin": MessageLookupByLibrary.simpleMessage("管理者を作成する"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage("識別子が正しいか確認してください"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage("メッセージはすべての参加者から消去されます"),
"Moderator": MessageLookupByLibrary.simpleMessage("モデレータ"),
"Monday": MessageLookupByLibrary.simpleMessage("月曜日"),
"Mute chat": MessageLookupByLibrary.simpleMessage("チャットのミュート"),
"New message in FluffyChat":
MessageLookupByLibrary.simpleMessage("FluffyChatに新しいメッセージがあります"),
"New private chat":
MessageLookupByLibrary.simpleMessage("新しいプライベートチャット"),
"No emotes found. 😕":
MessageLookupByLibrary.simpleMessage("Emoteは見つかりませんでした😕"),
"No permission": MessageLookupByLibrary.simpleMessage("権限がありません"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("部屋は見つかりませんでした..."),
"None": MessageLookupByLibrary.simpleMessage("なし"),
"Not supported in web":
MessageLookupByLibrary.simpleMessage("ウェブではサポートされていません"),
"Oops something went wrong...":
MessageLookupByLibrary.simpleMessage("おっと、何かがうまくいきませんでした..."),
"Open app to read messages":
MessageLookupByLibrary.simpleMessage("アプリを開いてメッセージを確認してください"),
"Open camera": MessageLookupByLibrary.simpleMessage("カメラを開く"),
"Participating user devices":
MessageLookupByLibrary.simpleMessage("ユーザーの使用しているデバイス"),
"Password": MessageLookupByLibrary.simpleMessage("パスワード"),
"Pick image": MessageLookupByLibrary.simpleMessage("画像を選択してください"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"現時点では、エンドツーエンドの暗号化を使用するにはPantalaimonが必要であることに注意してください。"),
"Please choose a username":
MessageLookupByLibrary.simpleMessage("ユーザー名を選択してください"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage("Matrix識別子を入力してください"),
"Please enter your password":
MessageLookupByLibrary.simpleMessage("パスワードを入力してください"),
"Please enter your username":
MessageLookupByLibrary.simpleMessage("ユーザー名を入力してください"),
"Public Rooms": MessageLookupByLibrary.simpleMessage("公開された部屋"),
"Recording": MessageLookupByLibrary.simpleMessage("録音中"),
"Reject": MessageLookupByLibrary.simpleMessage("拒否"),
"Rejoin": MessageLookupByLibrary.simpleMessage("再参加"),
"Remove": MessageLookupByLibrary.simpleMessage("消去"),
"Remove all other devices":
MessageLookupByLibrary.simpleMessage("他のデバイスをすべて削除"),
"Remove device": MessageLookupByLibrary.simpleMessage("デバイスの削除"),
"Remove exile": MessageLookupByLibrary.simpleMessage("追放を取り消し"),
"Remove message": MessageLookupByLibrary.simpleMessage("メッセージを削除"),
"Render rich message content":
MessageLookupByLibrary.simpleMessage("リッチメッセージをレンダリングする"),
"Reply": MessageLookupByLibrary.simpleMessage("返信"),
"Request permission": MessageLookupByLibrary.simpleMessage("権限を要求する"),
"Request to read older messages":
MessageLookupByLibrary.simpleMessage("過去のメッセージを読む権限を要求する"),
"Revoke all permissions":
MessageLookupByLibrary.simpleMessage("すべての権限を取り消す"),
"Room has been upgraded":
MessageLookupByLibrary.simpleMessage("部屋はアップグレードされました"),
"Saturday": MessageLookupByLibrary.simpleMessage("土曜日"),
"Search for a chat": MessageLookupByLibrary.simpleMessage("チャットを検索する"),
"Seen a long time ago":
MessageLookupByLibrary.simpleMessage("ずいぶん前に既読"),
"Send": MessageLookupByLibrary.simpleMessage("送信"),
"Send a message": MessageLookupByLibrary.simpleMessage("メッセージを送信"),
"Send file": MessageLookupByLibrary.simpleMessage("ファイルを送信"),
"Send image": MessageLookupByLibrary.simpleMessage("画像の送信"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("プロフィール画像を設定する"),
"Set group description":
MessageLookupByLibrary.simpleMessage("グループの説明を設定する"),
"Set invitation link":
MessageLookupByLibrary.simpleMessage("招待リンクを設定する"),
"Set status": MessageLookupByLibrary.simpleMessage("ステータスの設定"),
"Settings": MessageLookupByLibrary.simpleMessage("設定"),
"Share": MessageLookupByLibrary.simpleMessage("共有"),
"Sign up": MessageLookupByLibrary.simpleMessage("サインアップ"),
"Skip": MessageLookupByLibrary.simpleMessage("スキップ"),
"Source code": MessageLookupByLibrary.simpleMessage("ソースコード"),
"Start your first chat :-)":
MessageLookupByLibrary.simpleMessage("初めてのチャットを開始してください(^_^)"),
"Submit": MessageLookupByLibrary.simpleMessage("送信"),
"Sunday": MessageLookupByLibrary.simpleMessage("日曜日"),
"System": MessageLookupByLibrary.simpleMessage("システム"),
"Tap to show menu":
MessageLookupByLibrary.simpleMessage("メニューを表示するにはタップしてください"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage("暗号が破損しています"),
"They Don\'t Match": MessageLookupByLibrary.simpleMessage("違います"),
"They Match": MessageLookupByLibrary.simpleMessage("一致しています"),
"This room has been archived.":
MessageLookupByLibrary.simpleMessage("この部屋はアーカイブされています"),
"Thursday": MessageLookupByLibrary.simpleMessage("木曜日"),
"Try to send again": MessageLookupByLibrary.simpleMessage("送信し直してみる"),
"Tuesday": MessageLookupByLibrary.simpleMessage("火曜日"),
"Unblock Device": MessageLookupByLibrary.simpleMessage("デバイスをブロック解除する"),
"Unknown device": MessageLookupByLibrary.simpleMessage("未知デバイス"),
"Unknown encryption algorithm":
MessageLookupByLibrary.simpleMessage("未知の暗号化アルゴリズム"),
"Unmute chat": MessageLookupByLibrary.simpleMessage("チャットをミュート解除する"),
"Use Amoled compatible colors?":
MessageLookupByLibrary.simpleMessage("有機EL(Amoled)対応の色にしますか?"),
"Username": MessageLookupByLibrary.simpleMessage("ユーザー名"),
"Verify": MessageLookupByLibrary.simpleMessage("確認"),
"Verify User": MessageLookupByLibrary.simpleMessage("ユーザーの認証"),
"Video call": MessageLookupByLibrary.simpleMessage("音声通話"),
"Visibility of the chat history":
MessageLookupByLibrary.simpleMessage("チャット履歴の表示"),
"Visible for all participants":
MessageLookupByLibrary.simpleMessage("すべての参加者が閲覧可能です"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("すべての人が閲覧可能です"),
"Voice message": MessageLookupByLibrary.simpleMessage("ボイスメッセージ"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("壁紙"),
"Wednesday": MessageLookupByLibrary.simpleMessage("水曜日"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Matrixネットワークで一番かわいいチャットアプリへようこそ"),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage("誰がこのチャットに入れますか"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("メッセージを入力してください..."),
"Yes": MessageLookupByLibrary.simpleMessage("はい"),
"You": MessageLookupByLibrary.simpleMessage("あなた"),
"You are invited to this chat":
MessageLookupByLibrary.simpleMessage("チャットに招待されています"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage("あなたはもうこのチャットの参加者ではありません"),
"You cannot invite yourself":
MessageLookupByLibrary.simpleMessage("自分自身を招待することはできません"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage("チャットからBANされてしまいました"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"一度暗号化を有効にするともとに戻せません。よろしいですか?"),
"Your own username": MessageLookupByLibrary.simpleMessage("あなたのユーザー名"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("エイリアス"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"鍵をキャッシュするためにはパスフレーズやリカバリーキーを入力してください。"),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"他の人を署名するためにはパスフレーズやリカバリーキーを入力してください。"),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"セッションを検証するためにはパスフレーズやリカバリーキーを入力してください。"),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys": MessageLookupByLibrary.simpleMessage("鍵のキャッシュに成功しました!"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"表示されている絵文字が他のデバイスで表示されているものと一致するか確認してください"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"表示されている数字が他のデバイスで表示されているものと一致するか確認してください"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled":
MessageLookupByLibrary.simpleMessage("相互署名は使えません"),
"crossSigningEnabled":
MessageLookupByLibrary.simpleMessage("相互署名が使えます"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists": MessageLookupByLibrary.simpleMessage("Emoteはすでに存在します"),
"emoteInvalid": MessageLookupByLibrary.simpleMessage("不正なEmoteショートコード"),
"emoteWarnNeedToPick":
MessageLookupByLibrary.simpleMessage("Emoteショートコードと画像を選択してください"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey":
MessageLookupByLibrary.simpleMessage("パスフレーズかリカバリーキーが間違っています"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...": MessageLookupByLibrary.simpleMessage("が入力しています..."),
"isDeviceKeyCorrect":
MessageLookupByLibrary.simpleMessage("このデバイスキーは正しいですか?"),
"joinedTheChat": m29,
"keysCached": MessageLookupByLibrary.simpleMessage("鍵はキャッシュされたいます"),
"keysMissing": MessageLookupByLibrary.simpleMessage("鍵がありません"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest":
MessageLookupByLibrary.simpleMessage("新しい認証リクエスト"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"FluffyChatは現在相互署名機能をサポートしていません。Elementから有効化してください。"),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"FluffyChatは現在鍵のオンラインバックアップの有効化をサポートしていません。Elementから有効化してください。"),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("OK"),
"onlineKeyBackupDisabled":
MessageLookupByLibrary.simpleMessage("オンライン鍵バックアップは使用されていません"),
"onlineKeyBackupEnabled":
MessageLookupByLibrary.simpleMessage("オンライン鍵バックアップは使用されています"),
"passphraseOrKey":
MessageLookupByLibrary.simpleMessage("パスフレーズかリカバリーキー"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified": MessageLookupByLibrary.simpleMessage("セッションは確認済みです"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify":
MessageLookupByLibrary.simpleMessage("未知のセッションです。確認してください。"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession":
MessageLookupByLibrary.simpleMessage("セッションの確認ができました!"),
"verifyManual": MessageLookupByLibrary.simpleMessage("手動で確認"),
"verifyStart": MessageLookupByLibrary.simpleMessage("確認を始める"),
"verifySuccess": MessageLookupByLibrary.simpleMessage("確認が完了しました!"),
"verifyTitle": MessageLookupByLibrary.simpleMessage("他のアカウントを確認中"),
"waitingPartnerAcceptRequest":
MessageLookupByLibrary.simpleMessage("パートナーのリクエスト承諾待ちです"),
"waitingPartnerEmoji":
MessageLookupByLibrary.simpleMessage("パートナーの絵文字承諾待ちです..."),
"waitingPartnerNumbers":
MessageLookupByLibrary.simpleMessage("パートナーの数字承諾待ちです")
};
}

View file

@ -1,592 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a messages locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'messages';
static m0(username) => "${username} accepted the invitation";
static m1(username) => "${username} activated end to end encryption";
static m60(username) => "Accept this verification request from ${username}?";
static m2(username, targetName) => "${username} banned ${targetName}";
static m3(homeserver) => "By default you will be connected to ${homeserver}";
static m4(username) => "${username} changed the chat avatar";
static m5(username, description) =>
"${username} changed the chat description to: \'${description}\'";
static m6(username, chatname) =>
"${username} changed the chat name to: \'${chatname}\'";
static m7(username) => "${username} changed the chat permissions";
static m8(username, displayname) =>
"${username} changed the displayname to: ${displayname}";
static m9(username) => "${username} changed the guest access rules";
static m10(username, rules) =>
"${username} changed the guest access rules to: ${rules}";
static m11(username) => "${username} changed the history visibility";
static m12(username, rules) =>
"${username} changed the history visibility to: ${rules}";
static m13(username) => "${username} changed the join rules";
static m14(username, joinRules) =>
"${username} changed the join rules to: ${joinRules}";
static m15(username) => "${username} changed their avatar";
static m16(username) => "${username} changed the room aliases";
static m17(username) => "${username} changed the invitation link";
static m18(error) => "Could not decrypt message: ${error}";
static m19(count) => "${count} participants";
static m20(username) => "${username} created the chat";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${year}-${month}-${day}";
static m23(month, day) => "${month}-${day}";
static m24(displayname) => "Group with ${displayname}";
static m25(username, targetName) =>
"${username} has withdrawn the invitation for ${targetName}";
static m26(groupName) => "Invite contact to ${groupName}";
static m27(username, link) =>
"${username} invited you to FluffyChat. \n1. Install FluffyChat: http://fluffy.chat \n2. Sign up or sign in \n3. Open the invite link: ${link}";
static m28(username, targetName) => "${username} invited ${targetName}";
static m29(username) => "${username} joined the chat";
static m30(username, targetName) => "${username} kicked ${targetName}";
static m31(username, targetName) =>
"${username} kicked and banned ${targetName}";
static m32(localizedTimeShort) => "Last active: ${localizedTimeShort}";
static m33(count) => "Load ${count} more participants";
static m34(homeserver) => "Log in to ${homeserver}";
static m35(number) => "${number} selected";
static m36(fileName) => "Play ${fileName}";
static m37(username) => "${username} redacted an event";
static m38(username) => "${username} rejected the invitation";
static m39(username) => "Removed by ${username}";
static m40(username) => "Seen by ${username}";
static m41(username, count) => "Seen by ${username} and ${count} others";
static m42(username, username2) => "Seen by ${username} and ${username2}";
static m43(username) => "${username} sent a file";
static m44(username) => "${username} sent a picture";
static m45(username) => "${username} sent a sticker";
static m46(username) => "${username} sent a video";
static m47(username) => "${username} sent an audio";
static m48(username) => "${username} shared the location";
static m49(hours12, hours24, minutes, suffix) =>
"${hours12}:${minutes} ${suffix}";
static m50(username, targetName) => "${username} unbanned ${targetName}";
static m51(type) => "Unknown event \'${type}\'";
static m52(unreadCount) => "${unreadCount} unread chats";
static m53(unreadEvents) => "${unreadEvents} unread messages";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} unread messages in ${unreadChats} chats";
static m55(username, count) =>
"${username} and ${count} others are typing...";
static m56(username, username2) =>
"${username} and ${username2} are typing...";
static m57(username) => "${username} is typing...";
static m58(username) => "${username} left the chat";
static m59(username, type) => "${username} sent a ${type} event";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(Optional) Group name"),
"About": MessageLookupByLibrary.simpleMessage("About"),
"Accept": MessageLookupByLibrary.simpleMessage("Accept"),
"Account": MessageLookupByLibrary.simpleMessage("Account"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Account informations"),
"Add a group description":
MessageLookupByLibrary.simpleMessage("Add a group description"),
"Admin": MessageLookupByLibrary.simpleMessage("Admin"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("Already have an account?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Anyone can join"),
"Archive": MessageLookupByLibrary.simpleMessage("Archive"),
"Archived Room": MessageLookupByLibrary.simpleMessage("Archived Room"),
"Are guest users allowed to join": MessageLookupByLibrary.simpleMessage(
"Are guest users allowed to join"),
"Are you sure?": MessageLookupByLibrary.simpleMessage("Are you sure?"),
"Authentication":
MessageLookupByLibrary.simpleMessage("Authentication"),
"Avatar has been changed":
MessageLookupByLibrary.simpleMessage("Avatar has been changed"),
"Ban from chat": MessageLookupByLibrary.simpleMessage("Ban from chat"),
"Banned": MessageLookupByLibrary.simpleMessage("Banned"),
"Block Device": MessageLookupByLibrary.simpleMessage("Block Device"),
"Cancel": MessageLookupByLibrary.simpleMessage("Cancel"),
"Change the homeserver":
MessageLookupByLibrary.simpleMessage("Change the homeserver"),
"Change the name of the group": MessageLookupByLibrary.simpleMessage(
"Change the name of the group"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Change the server"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Change wallpaper"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Change your style"),
"Changelog": MessageLookupByLibrary.simpleMessage("Changelog"),
"Chat": MessageLookupByLibrary.simpleMessage("Chat"),
"Chat details": MessageLookupByLibrary.simpleMessage("Chat details"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("Choose a strong password"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("Choose a username"),
"Close": MessageLookupByLibrary.simpleMessage("Close"),
"Confirm": MessageLookupByLibrary.simpleMessage("Confirm"),
"Connect": MessageLookupByLibrary.simpleMessage("Connect"),
"Connection attempt failed":
MessageLookupByLibrary.simpleMessage("Connection attempt failed"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"Contact has been invited to the group"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Content viewer"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Copied to clipboard"),
"Copy": MessageLookupByLibrary.simpleMessage("Copy"),
"Could not set avatar":
MessageLookupByLibrary.simpleMessage("Could not set avatar"),
"Could not set displayname":
MessageLookupByLibrary.simpleMessage("Could not set displayname"),
"Create": MessageLookupByLibrary.simpleMessage("Create"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Create account now"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Create new group"),
"Currently active":
MessageLookupByLibrary.simpleMessage("Currently active"),
"Dark": MessageLookupByLibrary.simpleMessage("Dark"),
"Delete": MessageLookupByLibrary.simpleMessage("Delete"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Delete message"),
"Deny": MessageLookupByLibrary.simpleMessage("Deny"),
"Device": MessageLookupByLibrary.simpleMessage("Device"),
"Devices": MessageLookupByLibrary.simpleMessage("Devices"),
"Discard picture":
MessageLookupByLibrary.simpleMessage("Discard picture"),
"Displayname has been changed": MessageLookupByLibrary.simpleMessage(
"Displayname has been changed"),
"Donate": MessageLookupByLibrary.simpleMessage("Donate"),
"Download file": MessageLookupByLibrary.simpleMessage("Download file"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Edit Jitsi instance"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Edit displayname"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Emote Settings"),
"Emote shortcode":
MessageLookupByLibrary.simpleMessage("Emote shortcode"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Empty chat"),
"Encryption": MessageLookupByLibrary.simpleMessage("Encryption"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Encryption algorithm"),
"Encryption is not enabled":
MessageLookupByLibrary.simpleMessage("Encryption is not enabled"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"End to end encryption is currently in Beta! Use at your own risk!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"End-to-end encryption settings"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Enter a group name"),
"Enter a username":
MessageLookupByLibrary.simpleMessage("Enter a username"),
"Enter your homeserver":
MessageLookupByLibrary.simpleMessage("Enter your homeserver"),
"File name": MessageLookupByLibrary.simpleMessage("File name"),
"File size": MessageLookupByLibrary.simpleMessage("File size"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Forward"),
"Friday": MessageLookupByLibrary.simpleMessage("Friday"),
"From joining": MessageLookupByLibrary.simpleMessage("From joining"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("From the invitation"),
"Group": MessageLookupByLibrary.simpleMessage("Group"),
"Group description":
MessageLookupByLibrary.simpleMessage("Group description"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage(
"Group description has been changed"),
"Group is public":
MessageLookupByLibrary.simpleMessage("Group is public"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("Guests are forbidden"),
"Guests can join":
MessageLookupByLibrary.simpleMessage("Guests can join"),
"Help": MessageLookupByLibrary.simpleMessage("Help"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"Homeserver is not compatible"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("How are you today?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("Identity"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Invite contact"),
"Invited": MessageLookupByLibrary.simpleMessage("Invited"),
"Invited users only":
MessageLookupByLibrary.simpleMessage("Invited users only"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Kick from chat"),
"Last seen IP": MessageLookupByLibrary.simpleMessage("Last seen IP"),
"Leave": MessageLookupByLibrary.simpleMessage("Leave"),
"Left the chat": MessageLookupByLibrary.simpleMessage("Left the chat"),
"License": MessageLookupByLibrary.simpleMessage("License"),
"Light": MessageLookupByLibrary.simpleMessage("Light"),
"Load more...": MessageLookupByLibrary.simpleMessage("Load more..."),
"Loading... Please wait":
MessageLookupByLibrary.simpleMessage("Loading... Please wait"),
"Login": MessageLookupByLibrary.simpleMessage("Login"),
"Logout": MessageLookupByLibrary.simpleMessage("Logout"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Make a moderator"),
"Make an admin": MessageLookupByLibrary.simpleMessage("Make an admin"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Make sure the identifier is valid"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"Message will be removed for all participants"),
"Moderator": MessageLookupByLibrary.simpleMessage("Moderator"),
"Monday": MessageLookupByLibrary.simpleMessage("Monday"),
"Mute chat": MessageLookupByLibrary.simpleMessage("Mute chat"),
"New message in FluffyChat":
MessageLookupByLibrary.simpleMessage("New message in FluffyChat"),
"New private chat":
MessageLookupByLibrary.simpleMessage("New private chat"),
"No emotes found. 😕":
MessageLookupByLibrary.simpleMessage("No emotes found. 😕"),
"No permission": MessageLookupByLibrary.simpleMessage("No permission"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("No rooms found..."),
"None": MessageLookupByLibrary.simpleMessage("None"),
"Not supported in web":
MessageLookupByLibrary.simpleMessage("Not supported in web"),
"Oops something went wrong...": MessageLookupByLibrary.simpleMessage(
"Oops something went wrong..."),
"Open app to read messages":
MessageLookupByLibrary.simpleMessage("Open app to read messages"),
"Open camera": MessageLookupByLibrary.simpleMessage("Open camera"),
"Participating user devices":
MessageLookupByLibrary.simpleMessage("Participating user devices"),
"Password": MessageLookupByLibrary.simpleMessage("Password"),
"Pick image": MessageLookupByLibrary.simpleMessage("Pick image"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Please be aware that you need Pantalaimon to use end-to-end encryption for now."),
"Please choose a username":
MessageLookupByLibrary.simpleMessage("Please choose a username"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Please enter a matrix identifier"),
"Please enter your password":
MessageLookupByLibrary.simpleMessage("Please enter your password"),
"Please enter your username":
MessageLookupByLibrary.simpleMessage("Please enter your username"),
"Public Rooms": MessageLookupByLibrary.simpleMessage("Public Rooms"),
"Recording": MessageLookupByLibrary.simpleMessage("Recording"),
"Reject": MessageLookupByLibrary.simpleMessage("Reject"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Rejoin"),
"Remove": MessageLookupByLibrary.simpleMessage("Remove"),
"Remove all other devices":
MessageLookupByLibrary.simpleMessage("Remove all other devices"),
"Remove device": MessageLookupByLibrary.simpleMessage("Remove device"),
"Remove exile": MessageLookupByLibrary.simpleMessage("Remove exile"),
"Remove message":
MessageLookupByLibrary.simpleMessage("Remove message"),
"Render rich message content":
MessageLookupByLibrary.simpleMessage("Render rich message content"),
"Reply": MessageLookupByLibrary.simpleMessage("Reply"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Request permission"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Request to read older messages"),
"Revoke all permissions":
MessageLookupByLibrary.simpleMessage("Revoke all permissions"),
"Room has been upgraded":
MessageLookupByLibrary.simpleMessage("Room has been upgraded"),
"Saturday": MessageLookupByLibrary.simpleMessage("Saturday"),
"Search for a chat":
MessageLookupByLibrary.simpleMessage("Search for a chat"),
"Seen a long time ago":
MessageLookupByLibrary.simpleMessage("Seen a long time ago"),
"Send": MessageLookupByLibrary.simpleMessage("Send"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Send a message"),
"Send file": MessageLookupByLibrary.simpleMessage("Send file"),
"Send image": MessageLookupByLibrary.simpleMessage("Send image"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("Set a profile picture"),
"Set group description":
MessageLookupByLibrary.simpleMessage("Set group description"),
"Set invitation link":
MessageLookupByLibrary.simpleMessage("Set invitation link"),
"Set status": MessageLookupByLibrary.simpleMessage("Set status"),
"Settings": MessageLookupByLibrary.simpleMessage("Settings"),
"Share": MessageLookupByLibrary.simpleMessage("Share"),
"Sign up": MessageLookupByLibrary.simpleMessage("Sign up"),
"Skip": MessageLookupByLibrary.simpleMessage("Skip"),
"Source code": MessageLookupByLibrary.simpleMessage("Source code"),
"Start your first chat :-)":
MessageLookupByLibrary.simpleMessage("Start your first chat :-)"),
"Submit": MessageLookupByLibrary.simpleMessage("Submit"),
"Sunday": MessageLookupByLibrary.simpleMessage("Sunday"),
"System": MessageLookupByLibrary.simpleMessage("System"),
"Tap to show menu":
MessageLookupByLibrary.simpleMessage("Tap to show menu"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage(
"The encryption has been corrupted"),
"They Don\'t Match":
MessageLookupByLibrary.simpleMessage("They Don\'t Match"),
"They Match": MessageLookupByLibrary.simpleMessage("They Match"),
"This room has been archived.": MessageLookupByLibrary.simpleMessage(
"This room has been archived."),
"Thursday": MessageLookupByLibrary.simpleMessage("Thursday"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Try to send again"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Tuesday"),
"Unblock Device":
MessageLookupByLibrary.simpleMessage("Unblock Device"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Unknown device"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Unknown encryption algorithm"),
"Unmute chat": MessageLookupByLibrary.simpleMessage("Unmute chat"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"Use Amoled compatible colors?"),
"Username": MessageLookupByLibrary.simpleMessage("Username"),
"Verify": MessageLookupByLibrary.simpleMessage("Verify"),
"Verify User": MessageLookupByLibrary.simpleMessage("Verify User"),
"Video call": MessageLookupByLibrary.simpleMessage("Video call"),
"Visibility of the chat history": MessageLookupByLibrary.simpleMessage(
"Visibility of the chat history"),
"Visible for all participants": MessageLookupByLibrary.simpleMessage(
"Visible for all participants"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Visible for everyone"),
"Voice message": MessageLookupByLibrary.simpleMessage("Voice message"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Wallpaper"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Wednesday"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Welcome to the cutest instant messenger in the matrix network."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Who is allowed to join this group"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Write a message..."),
"Yes": MessageLookupByLibrary.simpleMessage("Yes"),
"You": MessageLookupByLibrary.simpleMessage("You"),
"You are invited to this chat": MessageLookupByLibrary.simpleMessage(
"You are invited to this chat"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"You are no longer participating in this chat"),
"You cannot invite yourself":
MessageLookupByLibrary.simpleMessage("You cannot invite yourself"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"You have been banned from this chat"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"You won\'t be able to disable the encryption anymore. Are you sure?"),
"Your own username":
MessageLookupByLibrary.simpleMessage("Your own username"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("alias"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"Please enter your secure store passphrase or recovery key to cache the keys."),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"To be able to sign the other person, please enter your secure store passphrase or recovery key."),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"Please enter your secure store passphrase or recovery key to verify your session."),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys":
MessageLookupByLibrary.simpleMessage("Successfully cached keys!"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"Compare and make sure the following emoji match those of the other device:"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"Compare and make sure the following numbers match those of the other device:"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled":
MessageLookupByLibrary.simpleMessage("Cross-Signing is disabled"),
"crossSigningEnabled":
MessageLookupByLibrary.simpleMessage("Cross-Signing is enabled"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists":
MessageLookupByLibrary.simpleMessage("Emote already exists!"),
"emoteInvalid":
MessageLookupByLibrary.simpleMessage("Invalid emote shortcode!"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"You need to pick an emote shortcode and an image!"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Incorrect passphrase or recovery key"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...": MessageLookupByLibrary.simpleMessage("is typing..."),
"isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(
"Is the following device key correct?"),
"joinedTheChat": m29,
"keysCached": MessageLookupByLibrary.simpleMessage("Keys are cached"),
"keysMissing": MessageLookupByLibrary.simpleMessage("Keys are missing"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest":
MessageLookupByLibrary.simpleMessage("New verification request!"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat currently does not support enabling Cross-Signing. Please enable it from within Element."),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat currently does not support enabling Online Key Backup. Please enable it from within Element."),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("ok"),
"onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(
"Online Key Backup is disabled"),
"onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(
"Online Key Backup is enabled"),
"passphraseOrKey":
MessageLookupByLibrary.simpleMessage("passphrase or recovery key"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified":
MessageLookupByLibrary.simpleMessage("Session is verified"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify": MessageLookupByLibrary.simpleMessage(
"Unknown session, please verify"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession": MessageLookupByLibrary.simpleMessage(
"Successfully verified session!"),
"verifyManual": MessageLookupByLibrary.simpleMessage("Verify Manually"),
"verifyStart":
MessageLookupByLibrary.simpleMessage("Start Verification"),
"verifySuccess":
MessageLookupByLibrary.simpleMessage("You successfully verified!"),
"verifyTitle":
MessageLookupByLibrary.simpleMessage("Verifying other account"),
"waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(
"Waiting for partner to accept the request..."),
"waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(
"Waiting for partner to accept the emoji..."),
"waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage(
"Waiting for partner to accept the numbers...")
};
}

View file

@ -1,503 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a pl locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'pl';
static m0(username) => "${username} zaakceptował/-a zaproszenie";
static m1(username) => "${username} aktywował/-a szyfrowanie end-to-end";
static m2(username, targetName) => "${username} zbanował/-a ${targetName}";
static m3(homeserver) => "Domyślnie łączy się z ${homeserver}";
static m4(username) => "${username} zmienił/-a zdjęcie profilowe";
static m5(username, description) =>
"${username} zmienił/-a opis czatu na: \'${description}\'";
static m6(username, chatname) =>
"${username} zmienił/-a nick na: \'${chatname}\'";
static m7(username) => "${username} zmienił/-a uprawnienia czatu";
static m8(username, displayname) =>
"${username} zmienił/-a wyświetlany nick na: ${displayname}";
static m9(username) => "${username} zmienił/-a zasady dostępu dla gości";
static m10(username, rules) =>
"${username} zmienił/-a zasady dostępu dla gości na: ${rules}";
static m11(username) => "${username} zmienił/-a widoczność historii";
static m12(username, rules) =>
"${username} zmienił/-a widoczność historii na: ${rules}";
static m13(username) => "${username} zmienił/-a zasady wejścia";
static m14(username, joinRules) =>
"${username} zmienił/-a zasady wejścia na: ${joinRules}";
static m15(username) => "${username} zmienił/-a zdjęcie profilowe";
static m16(username) => "${username} zmienił/-a skrót pokoju";
static m17(username) =>
"${username} zmienił/-a link do zaproszenia do pokoju";
static m18(error) => "Nie można odszyfrować wiadomości: ${error}";
static m19(count) => "${count} uczestników";
static m20(username) => "${username} stworzył/-a czat";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${day}-${month}-${year}";
static m23(month, day) => "${month}-${day}";
static m24(displayname) => "Grupa z ${displayname}";
static m25(username, targetName) =>
"${username} wycofał/-a zaproszenie dla ${targetName}";
static m26(groupName) => "Zaproś kontakty do ${groupName}";
static m27(username, link) =>
"${username} zaprosił/-a cię do FluffyChat. \n1. Zainstaluj FluffyChat: http://fluffy.chat \n2. Zarejestuj się lub zaloguj \n3. Otwórz link zaproszenia: ${link}";
static m28(username, targetName) => "${username} zaprosił/-a ${targetName}";
static m29(username) => "${username} dołączył/-a do czatu";
static m30(username, targetName) => "${username} wyrzucił/-a ${targetName}";
static m31(username, targetName) =>
"${username} wyrzucił/-a i zbanował/-a ${targetName}";
static m32(localizedTimeShort) => "Ostatnio widziano: ${localizedTimeShort}";
static m33(count) => "Załaduj ${count} uczestników więcej";
static m34(homeserver) => "Zaloguj się do ${homeserver}";
static m35(number) => "${number} wybrany";
static m36(fileName) => "Otwórz ${fileName}";
static m37(username) => "${username} stworzył/-a wydarzenie";
static m38(username) => "${username} odrzucił/-a zaproszenie";
static m39(username) => "Usunięta przez ${username}";
static m40(username) => "Zobaczone przez ${username}";
static m41(username, count) =>
"Zobaczone przez ${username} oraz ${count} innych";
static m42(username, username2) =>
"Zobaczone przez ${username} oraz ${username2}";
static m43(username) => "${username} wysłał/-a plik";
static m44(username) => "${username} wysłał/-a obraz";
static m45(username) => "${username} wysłał/-a naklejkę";
static m46(username) => "${username} wysłał/-a wideo";
static m47(username) => "${username} wysłał/-a plik audio";
static m48(username) => "${username} udostępnił/-a lokalizacje";
static m49(hours12, hours24, minutes, suffix) => "${hours24}:${minutes}";
static m50(username, targetName) => "${username} odbanował/-a ${targetName}";
static m51(type) => "Nieznane zdarzenie \'${type}\'";
static m52(unreadCount) => "${unreadCount} nieprzeczytanych czatów";
static m53(unreadEvents) => "${unreadEvents} nieprzeczytanych wiadomości";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} nieprzeczytanych wiadomości w ${unreadChats} czatach";
static m55(username, count) => "${username} oraz ${count} innych pisze...";
static m56(username, username2) => "${username} oraz ${username2} piszą...";
static m57(username) => "${username} pisze...";
static m58(username) => "${username} opuścił/-a czat";
static m59(username, type) => "${username} wysłał/-a wydarzenie ${type}";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(Opcjonalnie) Nazwa grupy"),
"About": MessageLookupByLibrary.simpleMessage("O nas"),
"Account": MessageLookupByLibrary.simpleMessage("Konto"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Informacje o koncie"),
"Add a group description":
MessageLookupByLibrary.simpleMessage("Dodaj opis grupy"),
"Admin": MessageLookupByLibrary.simpleMessage("Admin"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("Masz już konto?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Każdy może dołączyć"),
"Archive": MessageLookupByLibrary.simpleMessage("Archiwum"),
"Archived Room":
MessageLookupByLibrary.simpleMessage("Zarchiwizowane pokoje"),
"Are guest users allowed to join": MessageLookupByLibrary.simpleMessage(
"Czy użytkownicy-goście mogą dołączyć"),
"Are you sure?":
MessageLookupByLibrary.simpleMessage("Jesteś pewny/-a?"),
"Authentication": MessageLookupByLibrary.simpleMessage("Autoryzacja"),
"Avatar has been changed": MessageLookupByLibrary.simpleMessage(
"Zdjęcie profilowe zostało zmienione"),
"Ban from chat": MessageLookupByLibrary.simpleMessage("Ban na czacie"),
"Banned": MessageLookupByLibrary.simpleMessage("Zbanowany/-a"),
"Cancel": MessageLookupByLibrary.simpleMessage("Anuluj"),
"Change the homeserver":
MessageLookupByLibrary.simpleMessage("Zmień serwer domyślny"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Zmień nazwę grupy"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Zmień tapetę"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Zmień tapetę"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Zmień swój styl"),
"Changelog": MessageLookupByLibrary.simpleMessage("Dziennik zmian"),
"Chat details": MessageLookupByLibrary.simpleMessage("Szczegóły czatu"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("Wybierz silne hasło"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("Wybierz nick"),
"Close": MessageLookupByLibrary.simpleMessage("Zamknij"),
"Confirm": MessageLookupByLibrary.simpleMessage("Potwierdź"),
"Connect": MessageLookupByLibrary.simpleMessage("Połącz"),
"Connection attempt failed": MessageLookupByLibrary.simpleMessage(
"Próba połączenia nie powiodła się"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"Kontakt został zaproszony do grupy"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Przeglądarka treści"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Skopiowano do schowka"),
"Copy": MessageLookupByLibrary.simpleMessage("Kopiuj"),
"Could not set avatar": MessageLookupByLibrary.simpleMessage(
"Nie można ustawić zdjęcia profilowego"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"Nie można ustawić wyświetlanego nicku"),
"Create": MessageLookupByLibrary.simpleMessage("Stwórz"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Stwórz konto teraz"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Stwórz nową grupę"),
"Dark": MessageLookupByLibrary.simpleMessage("Ciemny"),
"Delete": MessageLookupByLibrary.simpleMessage("Usuń"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Usuń wiadomość"),
"Deny": MessageLookupByLibrary.simpleMessage("Odrzuć"),
"Device": MessageLookupByLibrary.simpleMessage("Urządzenie"),
"Devices": MessageLookupByLibrary.simpleMessage("Urządzenia"),
"Discard picture":
MessageLookupByLibrary.simpleMessage("Odrzuć zdjęcie"),
"Displayname has been changed": MessageLookupByLibrary.simpleMessage(
"Wyświetlany nick został zmieniony"),
"Donate": MessageLookupByLibrary.simpleMessage("Wsparcie"),
"Download file": MessageLookupByLibrary.simpleMessage("Pobierz plik"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Edytuj instancje Jitsi"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Edytuj wyświetlany nick"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Pusty czat"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Algorytm szyfrowania"),
"Encryption is not enabled": MessageLookupByLibrary.simpleMessage(
"Szyfrowanie nie jest włączone"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"Szyfrowanie end-to-end jest obecnie w fazie beta! Używaj na własne ryzyko!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Ustawienia szyfrowania end-to-end"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Wpisz nazwę grupy"),
"Enter a username": MessageLookupByLibrary.simpleMessage("Wpisz nick"),
"Enter your homeserver":
MessageLookupByLibrary.simpleMessage("Wpisz swój serwer domowy"),
"File name": MessageLookupByLibrary.simpleMessage("Nazwa pliku"),
"File size": MessageLookupByLibrary.simpleMessage("Rozmiar pliku"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Przekaż"),
"Friday": MessageLookupByLibrary.simpleMessage("Piątek"),
"From joining": MessageLookupByLibrary.simpleMessage("Od dołączenia"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("Od zaproszenia"),
"Group": MessageLookupByLibrary.simpleMessage("Grupa"),
"Group description": MessageLookupByLibrary.simpleMessage("Opis grupy"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage("Opis grupy został zmieniony"),
"Group is public":
MessageLookupByLibrary.simpleMessage("Grupa jest publiczna"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("Goście są zabronieni"),
"Guests can join":
MessageLookupByLibrary.simpleMessage("Goście mogą dołączyć"),
"Help": MessageLookupByLibrary.simpleMessage("Pomoc"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"Serwer domowy nie jest kompatybilny"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("Jak się masz dziś?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("Tożsamość"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Zaproś kontakty"),
"Invited": MessageLookupByLibrary.simpleMessage("Zaproszono"),
"Invited users only": MessageLookupByLibrary.simpleMessage(
"Tylko zaproszeni użytkownicy"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"Wygląda na to, że nie masz usług Google w swoim telefonie. To dobra decyzja dla twojej prywatności! Aby otrzymywać powiadomienia wysyłane w FluffyChat, zalecamy korzystanie z microG: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Wyrzuć z czatu"),
"Last seen IP":
MessageLookupByLibrary.simpleMessage("Ostatnie widziane IP"),
"Leave": MessageLookupByLibrary.simpleMessage("wyjdź"),
"Left the chat":
MessageLookupByLibrary.simpleMessage("Opuścił/-a czat"),
"License": MessageLookupByLibrary.simpleMessage("Licencja"),
"Light": MessageLookupByLibrary.simpleMessage("Jasny"),
"Loading... Please wait":
MessageLookupByLibrary.simpleMessage("Ładowanie... Proszę czekąć"),
"Login": MessageLookupByLibrary.simpleMessage("Zaloguj"),
"Logout": MessageLookupByLibrary.simpleMessage("Wyloguj"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Uczyń moderatorem"),
"Make an admin": MessageLookupByLibrary.simpleMessage("Uczyń adminem"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Upewnij się, że identyfikator jest prawidłowy"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"Wiadomość zostanie usunięta dla wszystkich użytkowników"),
"Moderator": MessageLookupByLibrary.simpleMessage("Moderator"),
"Monday": MessageLookupByLibrary.simpleMessage("Poniedziałek"),
"Mute chat": MessageLookupByLibrary.simpleMessage("Wycisz czat"),
"New message in FluffyChat":
MessageLookupByLibrary.simpleMessage("Nowa wiadomość w FluffyChat"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Nowy prywatny czat"),
"No permission": MessageLookupByLibrary.simpleMessage("Brak uprawnień"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("Nie znaleziono pokoi..."),
"None": MessageLookupByLibrary.simpleMessage("Brak"),
"Not supported in web":
MessageLookupByLibrary.simpleMessage("Nie obsługiwane w sieci"),
"Oops something went wrong...":
MessageLookupByLibrary.simpleMessage("Ups! Coś poszło nie tak..."),
"Open app to read messages": MessageLookupByLibrary.simpleMessage(
"Otwórz aplikację by odczytać wiadomości"),
"Open camera": MessageLookupByLibrary.simpleMessage("Otwarta kamera"),
"Participating user devices":
MessageLookupByLibrary.simpleMessage("Urządzenia użytkowników"),
"Password": MessageLookupByLibrary.simpleMessage("Hasło"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Należy pamiętać, że Pantalaimon wymaga na razie szyfrowania end-to-end."),
"Please choose a username":
MessageLookupByLibrary.simpleMessage("Wybierz nick"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Wprowadź proszę identyfikator matrix"),
"Please enter your password":
MessageLookupByLibrary.simpleMessage("Wpisz swoje hasło"),
"Please enter your username":
MessageLookupByLibrary.simpleMessage("Wpisz swój nick"),
"Public Rooms":
MessageLookupByLibrary.simpleMessage("Publiczne pokoje"),
"Recording": MessageLookupByLibrary.simpleMessage("Nagranie"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Dołącz ponownie"),
"Remove": MessageLookupByLibrary.simpleMessage("Usuń"),
"Remove all other devices": MessageLookupByLibrary.simpleMessage(
"Usuń wszystkie inne urządzenia"),
"Remove device":
MessageLookupByLibrary.simpleMessage("Usuń urządzenie"),
"Remove exile": MessageLookupByLibrary.simpleMessage("Usuń blokadę"),
"Remove message":
MessageLookupByLibrary.simpleMessage("Usuń wiadomość"),
"Reply": MessageLookupByLibrary.simpleMessage("Odpisz"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Prośba o pozwolenie"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Poproś o przeczytanie starszych wiadomości"),
"Revoke all permissions": MessageLookupByLibrary.simpleMessage(
"Odwołaj wszystkie uprawnienia"),
"Saturday": MessageLookupByLibrary.simpleMessage("Sobota"),
"Search for a chat":
MessageLookupByLibrary.simpleMessage("Przeszukaj czat"),
"Send": MessageLookupByLibrary.simpleMessage("Wyślij"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Wyślij wiadomość"),
"Send file": MessageLookupByLibrary.simpleMessage("Wyślij plik"),
"Send image": MessageLookupByLibrary.simpleMessage("Wyślij obraz"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("Ustaw zdjęcie profilowe"),
"Set group description":
MessageLookupByLibrary.simpleMessage("Ustaw opis grupy"),
"Set invitation link":
MessageLookupByLibrary.simpleMessage("Ustaw link zaproszeniowy"),
"Set status": MessageLookupByLibrary.simpleMessage("Ustaw status"),
"Settings": MessageLookupByLibrary.simpleMessage("Ustawienia"),
"Share": MessageLookupByLibrary.simpleMessage("Udostępnij"),
"Sign up": MessageLookupByLibrary.simpleMessage("Zarejesturuj się"),
"Source code": MessageLookupByLibrary.simpleMessage("Kod żródłowy"),
"Start your first chat :-)": MessageLookupByLibrary.simpleMessage(
"Rozpocznij swój pierwszy czat :-)"),
"Sunday": MessageLookupByLibrary.simpleMessage("Niedziela"),
"System": MessageLookupByLibrary.simpleMessage("System"),
"Tap to show menu":
MessageLookupByLibrary.simpleMessage("Kliknij by zobaczyć menu"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage(
"Szyfrowanie zostało uszkodzone"),
"This room has been archived.": MessageLookupByLibrary.simpleMessage(
"Ten pokój został przeniesiony do archiwum."),
"Thursday": MessageLookupByLibrary.simpleMessage("Czwartek"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Spróbuj wysłać ponownie"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Wtorek"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Nieznane urządzenie"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Nieznany algorytm szyfrowania"),
"Unmute chat":
MessageLookupByLibrary.simpleMessage("Wyłącz wyciszenie"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"Użyć kolorów kompatybilnych z ekranami Amoled?"),
"Username": MessageLookupByLibrary.simpleMessage("Nick"),
"Verify": MessageLookupByLibrary.simpleMessage("zweryfikuj"),
"Video call": MessageLookupByLibrary.simpleMessage("Rozmowa wideo"),
"Visibility of the chat history":
MessageLookupByLibrary.simpleMessage("Widoczność historii czatu"),
"Visible for all participants": MessageLookupByLibrary.simpleMessage(
"Widoczny dla wszystkich użytkowników"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Widoczny dla każdego"),
"Voice message":
MessageLookupByLibrary.simpleMessage("Wiadomość głosowa"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Tapeta"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Środa"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Witamy w najładniejszym komunikatorze w sieci matrix."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Kto może dołączyć do tej grupy"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Pisze wiadomość..."),
"Yes": MessageLookupByLibrary.simpleMessage("Tak"),
"You": MessageLookupByLibrary.simpleMessage("Ty"),
"You are invited to this chat": MessageLookupByLibrary.simpleMessage(
"Dostałeś/-aś zaproszenie do tego czatu"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Nie uczestniczysz już w tym czacie"),
"You cannot invite yourself":
MessageLookupByLibrary.simpleMessage("Nie możesz zaprosić siebie"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Zostałeś zbanowany na tym czacie"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Nie będziesz już mógł wyłączyć szyfrowania. Jesteś pewny?"),
"Your own username": MessageLookupByLibrary.simpleMessage("Twój nick"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("alias"),
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...": MessageLookupByLibrary.simpleMessage("pisze..."),
"joinedTheChat": m29,
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"numberSelected": m35,
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59
};
}

View file

@ -1,603 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a ru locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'ru';
static m0(username) => "${username} принял(а) приглашение";
static m1(username) => "${username} активировал(а) сквозное шифрование";
static m60(username) => "Принять этот запрос подтверждения от ${username}?";
static m2(username, targetName) => "${username} забанил(а) ${targetName}";
static m3(homeserver) => "По умолчанию вы будете подключены к ${homeserver}";
static m4(username) => "${username} изменил(а) аватар чата";
static m5(username, description) =>
"${username} изменил(а) описание чата на: \'${description}\'";
static m6(username, chatname) =>
"${username} изменил(а) имя чата на: \'${chatname}\'";
static m7(username) => "${username} изменил(а) права чата";
static m8(username, displayname) =>
"${username} изменил(а) отображаемое имя на: ${displayname}";
static m9(username) => "${username} изменил(а) правила гостевого доступа";
static m10(username, rules) =>
"${username} изменил(а) правила гостевого доступа на: ${rules}";
static m11(username) => "${username} изменил(а) видимость истории";
static m12(username, rules) =>
"${username} изменил(а) видимость истории на: ${rules}";
static m13(username) => "${username} изменил(а) правила присоединения";
static m14(username, joinRules) =>
"${username} изменил(а) правила присоединения на: ${joinRules}";
static m15(username) => "${username} сменил(а) аватар профиля";
static m16(username) => "${username} изменил(а) псевдонимы комнаты";
static m17(username) => "${username} изменил(а) ссылку приглашения";
static m18(error) => "Не удалось расшифровать сообщение: ${error}";
static m19(count) => "${count} участника(-ов)";
static m20(username) => "${username} создал(а) чат";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${day}. ${month}. ${year}";
static m23(month, day) => "${day}. ${month}";
static m24(displayname) => "Группа с ${displayname}";
static m25(username, targetName) =>
"${username} отозвал(а) приглашение для ${targetName}";
static m26(groupName) => "Пригласить контакт в ${groupName}";
static m27(username, link) =>
"${username} пригласил(а) вас в FluffyChat. \n1. Установите FluffyChat: http://fluffy.chat \n2. Зарегистрируйтесь или войдите \n3. Откройте ссылку приглашения: ${link}";
static m28(username, targetName) => "${username} пригласил(а) ${targetName}";
static m29(username) => "${username} присоединился(-ась) к чату";
static m30(username, targetName) => "${username} исключил(а) ${targetName}";
static m31(username, targetName) =>
"${username} исключил(а) и забанил(а) ${targetName}";
static m32(localizedTimeShort) =>
"Последнее посещение: ${localizedTimeShort}";
static m33(count) => "Загрузить еще ${count} участников";
static m34(homeserver) => "Войти в ${homeserver}";
static m35(number) => "${number} выбрано";
static m36(fileName) => "Играть ${fileName}";
static m37(username) => "${username} отредактировал(а) событие";
static m38(username) => "${username} отклонил(а) приглашение";
static m39(username) => "Удалено пользователем ${username}";
static m40(username) => "Просмотрено пользователем ${username}";
static m41(username, count) =>
"Просмотрено пользователями ${username} и ${count} другими";
static m42(username, username2) =>
"Просмотрено пользователями ${username} и ${username2}";
static m43(username) => "${username} отправил(а) файл";
static m44(username) => "${username} отправил(а) картинку";
static m45(username) => "${username} отправил(а) стикер";
static m46(username) => "${username} отправил(а) видео";
static m47(username) => "${username} отправил(а) аудио";
static m48(username) => "${username} поделился(-ась) местоположением";
static m49(hours12, hours24, minutes, suffix) => "${hours24}:${minutes}";
static m50(username, targetName) => "${username} разбанил(а) ${targetName}";
static m51(type) => "Неизвестное событие \'${type}\'";
static m52(unreadCount) => "${unreadCount} непрочитанных чатов";
static m53(unreadEvents) => "${unreadEvents} непрочитанных сообщений";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} непрочитанных сообщений в ${unreadChats} чатах";
static m55(username, count) =>
"${username} и ${count} других участников печатают...";
static m56(username, username2) => "${username} и ${username2} печатают...";
static m57(username) => "${username} печатает...";
static m58(username) => "${username} покинул(а) чат";
static m59(username, type) => "${username} отправил(а) событие типа ${type}";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name": MessageLookupByLibrary.simpleMessage(
"(Необязательно) Название группы"),
"About": MessageLookupByLibrary.simpleMessage("О приложении"),
"Accept": MessageLookupByLibrary.simpleMessage("Принять"),
"Account": MessageLookupByLibrary.simpleMessage("Учётная запись"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Сведения об учётной записи"),
"Add a group description":
MessageLookupByLibrary.simpleMessage("Добавить описание группы"),
"Admin": MessageLookupByLibrary.simpleMessage("Админ"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("Уже есть учётная запись?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Каждый может присоединиться"),
"Archive": MessageLookupByLibrary.simpleMessage("Архив"),
"Archived Room":
MessageLookupByLibrary.simpleMessage("Архивированная комната"),
"Are guest users allowed to join": MessageLookupByLibrary.simpleMessage(
"Разрешено ли гостям присоединяться"),
"Are you sure?": MessageLookupByLibrary.simpleMessage("Вы уверены?"),
"Authentication":
MessageLookupByLibrary.simpleMessage("Аутентификация"),
"Avatar has been changed":
MessageLookupByLibrary.simpleMessage("Аватар был изменен"),
"Ban from chat": MessageLookupByLibrary.simpleMessage("Бан чата"),
"Banned": MessageLookupByLibrary.simpleMessage("Забанен"),
"Block Device":
MessageLookupByLibrary.simpleMessage("Заблокировать устройство"),
"Cancel": MessageLookupByLibrary.simpleMessage("Отмена"),
"Change the homeserver":
MessageLookupByLibrary.simpleMessage("Изменить домашний сервер"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Изменить название группы"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Сменить сервер"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Сменить обои"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Изменить свой стиль"),
"Changelog": MessageLookupByLibrary.simpleMessage("Изменения"),
"Chat": MessageLookupByLibrary.simpleMessage("Чат"),
"Chat details": MessageLookupByLibrary.simpleMessage("Детали чата"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("Выберите надёжный пароль"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("Выберете имя пользователя"),
"Close": MessageLookupByLibrary.simpleMessage("Закрыть"),
"Confirm": MessageLookupByLibrary.simpleMessage("Подтвердить"),
"Connect": MessageLookupByLibrary.simpleMessage("Присоединиться"),
"Connection attempt failed": MessageLookupByLibrary.simpleMessage(
"Попытка подключения не удалась"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"Контакт был приглашен в группу"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Просмотр содержимого"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Скопировано в буфер обмена"),
"Copy": MessageLookupByLibrary.simpleMessage("Скопировать"),
"Could not set avatar": MessageLookupByLibrary.simpleMessage(
"Не удалось установить аватар"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"Не удалось установить отображаемое имя"),
"Create": MessageLookupByLibrary.simpleMessage("Создать"),
"Create account now": MessageLookupByLibrary.simpleMessage(
"Создать учётную запись сейчас"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Создать новую группу"),
"Currently active":
MessageLookupByLibrary.simpleMessage("В настоящее время активен"),
"Dark": MessageLookupByLibrary.simpleMessage("Тёмный"),
"Delete": MessageLookupByLibrary.simpleMessage("Удалить"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Удалить сообщение"),
"Deny": MessageLookupByLibrary.simpleMessage("Отклонить"),
"Device": MessageLookupByLibrary.simpleMessage("Устройство"),
"Devices": MessageLookupByLibrary.simpleMessage("Устройства"),
"Discard picture":
MessageLookupByLibrary.simpleMessage("Сбросить картинку"),
"Displayname has been changed": MessageLookupByLibrary.simpleMessage(
"Отображаемое имя было изменено"),
"Donate": MessageLookupByLibrary.simpleMessage("Пожертвовать"),
"Download file": MessageLookupByLibrary.simpleMessage("Скачать файл"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Изменить экземпляр Jitsi"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Изменить отображаемое имя"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Настройки смайликов"),
"Emote shortcode":
MessageLookupByLibrary.simpleMessage("Краткий код для смайлика"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Пустой чат"),
"Encryption": MessageLookupByLibrary.simpleMessage("Шифрование"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Алгоритм шифрования"),
"Encryption is not enabled":
MessageLookupByLibrary.simpleMessage("Шифрование не включено"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"Сквозное шифрование в настоящее время в бета-версии! Используйте на свой риск!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Сквозные настройки шифрования"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Введите название группы"),
"Enter a username":
MessageLookupByLibrary.simpleMessage("Введите имя пользователя"),
"Enter your homeserver":
MessageLookupByLibrary.simpleMessage("Введите ваш домашний сервер"),
"File name": MessageLookupByLibrary.simpleMessage("Имя файла"),
"File size": MessageLookupByLibrary.simpleMessage("Размер файла"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Переслать"),
"Friday": MessageLookupByLibrary.simpleMessage("Пятница"),
"From joining":
MessageLookupByLibrary.simpleMessage("С момента присоединения"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("С момента приглашения"),
"Group": MessageLookupByLibrary.simpleMessage("Группа"),
"Group description":
MessageLookupByLibrary.simpleMessage("Описание группы"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage(
"Описание группы было изменено"),
"Group is public":
MessageLookupByLibrary.simpleMessage("Публичная группа"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("Гости запрещены"),
"Guests can join":
MessageLookupByLibrary.simpleMessage("Гости могут присоединиться"),
"Help": MessageLookupByLibrary.simpleMessage("Помощь"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"Домашний сервер не совместим"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("Как у вас сегодня дела?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("Идентификация"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Пригласить контакт"),
"Invited": MessageLookupByLibrary.simpleMessage("Приглашён"),
"Invited users only": MessageLookupByLibrary.simpleMessage(
"Только приглашённым пользователям"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"Похоже, у вас нет служб Google на вашем телефоне. Это хорошее решение для вашей конфиденциальности! Для получения push-уведомлений в FluffyChat мы рекомендуем использовать microG: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Исключить из чата"),
"Last seen IP":
MessageLookupByLibrary.simpleMessage("Последний увиденный IP"),
"Leave": MessageLookupByLibrary.simpleMessage("Покинуть"),
"Left the chat": MessageLookupByLibrary.simpleMessage("Покинуть чат"),
"License": MessageLookupByLibrary.simpleMessage("Лицензия"),
"Light": MessageLookupByLibrary.simpleMessage("Светлый"),
"Load more...":
MessageLookupByLibrary.simpleMessage("Загрузить больше..."),
"Loading... Please wait": MessageLookupByLibrary.simpleMessage(
"Загрузка... Пожалуйста подождите"),
"Login": MessageLookupByLibrary.simpleMessage("Вход"),
"Logout": MessageLookupByLibrary.simpleMessage("Выйти"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Сделать модератором"),
"Make an admin":
MessageLookupByLibrary.simpleMessage("Сделать админом"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Убедитесь, что идентификатор действителен"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"Сообщение будет удалено для всех участников"),
"Moderator": MessageLookupByLibrary.simpleMessage("Модератор"),
"Monday": MessageLookupByLibrary.simpleMessage("Понедельник"),
"Mute chat": MessageLookupByLibrary.simpleMessage("Замутить чат"),
"New message in FluffyChat": MessageLookupByLibrary.simpleMessage(
"Новое сообщение в FluffyChat"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Новый приватный чат"),
"No emotes found. 😕":
MessageLookupByLibrary.simpleMessage("Смайликов не найдено. 😕"),
"No permission": MessageLookupByLibrary.simpleMessage("Нет разрешений"),
"No rooms found...":
MessageLookupByLibrary.simpleMessage("Комнаты не найдены..."),
"None": MessageLookupByLibrary.simpleMessage("Ничего"),
"Not supported in web": MessageLookupByLibrary.simpleMessage(
"Не поддерживается в веб-версии"),
"Oops something went wrong...":
MessageLookupByLibrary.simpleMessage("Упс! Что-то пошло не так..."),
"Open app to read messages": MessageLookupByLibrary.simpleMessage(
"Откройте приложение для чтения сообщений"),
"Open camera": MessageLookupByLibrary.simpleMessage("Открыть камеру"),
"Participating user devices":
MessageLookupByLibrary.simpleMessage("Участвующие устройства"),
"Password": MessageLookupByLibrary.simpleMessage("Пароль"),
"Pick image": MessageLookupByLibrary.simpleMessage("Выбрать картинку"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Помните, что вам нужен Pantalaimon для использования сквозного шифрования."),
"Please choose a username": MessageLookupByLibrary.simpleMessage(
"Пожалуйста, выберите имя пользователя"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Пожалуйста, введите matrix идентификатор"),
"Please enter your password": MessageLookupByLibrary.simpleMessage(
"Пожалуйста введите ваш пароль"),
"Please enter your username": MessageLookupByLibrary.simpleMessage(
"Пожалуйста, введите имя пользователя"),
"Public Rooms":
MessageLookupByLibrary.simpleMessage("Публичные комнаты"),
"Recording": MessageLookupByLibrary.simpleMessage("Запись"),
"Reject": MessageLookupByLibrary.simpleMessage("Отклонить"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Перезайти"),
"Remove": MessageLookupByLibrary.simpleMessage("Удалить"),
"Remove all other devices": MessageLookupByLibrary.simpleMessage(
"Удалить все другие устройства"),
"Remove device":
MessageLookupByLibrary.simpleMessage("Удалить устройство"),
"Remove exile": MessageLookupByLibrary.simpleMessage("Удалить ссылку"),
"Remove message":
MessageLookupByLibrary.simpleMessage("Удалить сообщение"),
"Render rich message content": MessageLookupByLibrary.simpleMessage(
"Показать отформатированные сообщения"),
"Reply": MessageLookupByLibrary.simpleMessage("Ответить"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Запросить разрешение"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Запросить доступ к предыдущим сообщениям"),
"Revoke all permissions":
MessageLookupByLibrary.simpleMessage("Отменить все разрешения"),
"Room has been upgraded":
MessageLookupByLibrary.simpleMessage("Комната обновлена"),
"Saturday": MessageLookupByLibrary.simpleMessage("Суббота"),
"Search for a chat": MessageLookupByLibrary.simpleMessage("Поиск чата"),
"Seen a long time ago":
MessageLookupByLibrary.simpleMessage("Просматривали давно"),
"Send": MessageLookupByLibrary.simpleMessage("Отправить"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Отправить сообщение"),
"Send file": MessageLookupByLibrary.simpleMessage("Отправить файл"),
"Send image":
MessageLookupByLibrary.simpleMessage("Отправить картинку"),
"Set a profile picture": MessageLookupByLibrary.simpleMessage(
"Установить изображение профиля"),
"Set group description":
MessageLookupByLibrary.simpleMessage("Задать описание группы"),
"Set invitation link": MessageLookupByLibrary.simpleMessage(
"Установить ссылку для приглашения"),
"Set status": MessageLookupByLibrary.simpleMessage("Задать статус"),
"Settings": MessageLookupByLibrary.simpleMessage("Настройки"),
"Share": MessageLookupByLibrary.simpleMessage("Поделиться"),
"Sign up": MessageLookupByLibrary.simpleMessage("Зарегистрироваться"),
"Skip": MessageLookupByLibrary.simpleMessage("Пропустить"),
"Source code": MessageLookupByLibrary.simpleMessage("Исходный код"),
"Start your first chat :-)":
MessageLookupByLibrary.simpleMessage("Начни свой первый чат :-)"),
"Submit": MessageLookupByLibrary.simpleMessage("Отправить"),
"Sunday": MessageLookupByLibrary.simpleMessage("Воскресенье"),
"System": MessageLookupByLibrary.simpleMessage("Системный"),
"Tap to show menu": MessageLookupByLibrary.simpleMessage(
"Нажмите, чтобы показать меню"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage("Шифрование было повреждено"),
"They Don\'t Match":
MessageLookupByLibrary.simpleMessage("Они не совпадают"),
"They Match": MessageLookupByLibrary.simpleMessage("Они совпадают"),
"This room has been archived.": MessageLookupByLibrary.simpleMessage(
"Эта комната была заархивирована."),
"Thursday": MessageLookupByLibrary.simpleMessage("Четверг"),
"Try to send again": MessageLookupByLibrary.simpleMessage(
"Попробуйте отправить еще раз"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Вторник"),
"Unblock Device":
MessageLookupByLibrary.simpleMessage("Разблокировать устройство"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Неизвестное устройство"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Неизвестный алгоритм шифрования"),
"Unmute chat": MessageLookupByLibrary.simpleMessage("Размутить чат"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"Использовать Amoled совместимые цвета?"),
"Username": MessageLookupByLibrary.simpleMessage("Имя пользователя"),
"Verify": MessageLookupByLibrary.simpleMessage("Проверить"),
"Verify User":
MessageLookupByLibrary.simpleMessage("Проверить пользователя"),
"Video call": MessageLookupByLibrary.simpleMessage("Видеозвонок"),
"Visibility of the chat history":
MessageLookupByLibrary.simpleMessage("Видимость истории чата"),
"Visible for all participants":
MessageLookupByLibrary.simpleMessage("Видима для всех участников"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Видна всем"),
"Voice message":
MessageLookupByLibrary.simpleMessage("Голосовое сообщение"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Обои"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Среда"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Добро пожаловать в самый симпатичный мессенджер в сети matrix."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Кому разрешено вступать в эту группу"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Напишите сообщение..."),
"Yes": MessageLookupByLibrary.simpleMessage("Да"),
"You": MessageLookupByLibrary.simpleMessage("Вы"),
"You are invited to this chat":
MessageLookupByLibrary.simpleMessage("Вы приглашены в этот чат"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Вы больше не участвуете в этом чате"),
"You cannot invite yourself": MessageLookupByLibrary.simpleMessage(
"Вы не можете пригласить себя"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Вы были забанены в этом чате"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Вы больше не сможете отключить шифрование. Вы уверены?"),
"Your own username":
MessageLookupByLibrary.simpleMessage("Ваше имя пользователя"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("псевдоним"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"Пожалуйста, введите секретную фразу безопасного хранилища или ключ восстановления для кеширования ключей."),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"Чтобы иметь возможность подписать другое лицо, пожалуйста, введите пароль или ключ восстановления вашего безопасного хранилища."),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"Пожалуйста, введите вашу безопасную парольную фразу или ключ восстановления, чтобы подтвердить ваш сеанс."),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys":
MessageLookupByLibrary.simpleMessage("Ключи успешно кэшированы!"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"Сравните и убедитесь, что следующие эмодзи соответствуют таковым на другом устройстве:"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"Сравните и убедитесь, что следующие числа соответствуют числам на другом устройстве:"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled":
MessageLookupByLibrary.simpleMessage("Кросс-подпись отключена"),
"crossSigningEnabled":
MessageLookupByLibrary.simpleMessage("Кросс-подпись включена"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists":
MessageLookupByLibrary.simpleMessage("Смайлик уже существует!"),
"emoteInvalid": MessageLookupByLibrary.simpleMessage(
"Недопустимый краткий код смайлика!"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"Вам нужно выбрать краткий код смайлика и картинку!"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Неверный пароль или ключ восстановления"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...": MessageLookupByLibrary.simpleMessage("Печатает..."),
"isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(
"Правильно ли указан следующий ключ устройства?"),
"joinedTheChat": m29,
"keysCached": MessageLookupByLibrary.simpleMessage("Ключи кэшированы"),
"keysMissing":
MessageLookupByLibrary.simpleMessage("Ключи отсутствуют"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest": MessageLookupByLibrary.simpleMessage(
"Новый запрос на подтверждение!"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat в настоящее время не поддерживает включение кросс-подписи. Пожалуйста, включите его в Element."),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"В настоящее время Fluffychat не поддерживает функцию резервного копирования онлайн-ключей. Пожалуйста, включите его из Element."),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("ok"),
"onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(
"Резервное копирование онлайн-ключей отключено"),
"onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(
"Резервное копирование онлайн ключей включено"),
"passphraseOrKey": MessageLookupByLibrary.simpleMessage(
"пароль или ключ восстановления"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified":
MessageLookupByLibrary.simpleMessage("Сессия подтверждена"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify": MessageLookupByLibrary.simpleMessage(
"Неизвестная сессия, пожалуйста, проверьте"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession":
MessageLookupByLibrary.simpleMessage("Успешно проверенная сессия!"),
"verifyManual":
MessageLookupByLibrary.simpleMessage("Проверить вручную"),
"verifyStart": MessageLookupByLibrary.simpleMessage("Начать проверку"),
"verifySuccess":
MessageLookupByLibrary.simpleMessage("Вы успешно проверили!"),
"verifyTitle": MessageLookupByLibrary.simpleMessage(
"Проверка другой учётной записи"),
"waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(
"В ожидании партнера, чтобы принять запрос..."),
"waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(
"В ожидании партнера, чтобы принять смайлики..."),
"waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage(
"В ожидании партнера, чтобы принять числа...")
};
}

View file

@ -1,604 +0,0 @@
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
// This is a library that provides messages for a sk locale. All the
// messages from the main program should be duplicated here with the same
// function name.
// Ignore issues from commonly used lints in this file.
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
// ignore_for_file:unused_import, file_names
import 'package:intl/intl.dart';
import 'package:intl/message_lookup_by_library.dart';
final messages = new MessageLookup();
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
class MessageLookup extends MessageLookupByLibrary {
String get localeName => 'sk';
static m0(username) => "${username} prijali pozvánku";
static m1(username) => "${username} aktivovali koncové šifrovanie";
static m60(username) => "Akcepovať žiadosť o verifikáciu od ${username}?";
static m2(username, targetName) => "${username} zabanoval ${targetName}";
static m3(homeserver) =>
"V základnom nastavení budete pripojený k ${homeserver}";
static m4(username) => "${username} si zmenili svôj avatar";
static m5(username, description) =>
"${username} zmenili popis chatu na: „${description}";
static m6(username, chatname) =>
"${username} zmenili meno chatu na: „${chatname}";
static m7(username) => "${username} zmenili nastavenie oprávnení chatu";
static m8(username, displayname) =>
"${username} si zmenili prezývku na: ${displayname}";
static m9(username) => "${username} zmenili prístupové práva pre hosťov";
static m10(username, rules) =>
"${username} zmenili prístupové práva pro hosťov na: ${rules}";
static m11(username) =>
"${username} zmenili nastavenie viditelnosti histórie chatu";
static m12(username, rules) =>
"${username} zmenili nastavenie viditelnosti histórie chatu na: ${rules}";
static m13(username) => "${username} zmenili nastavenie pravidiel pripojenia";
static m14(username, joinRules) =>
"${username} zmenili nastavenie pravidiel pripojenia na: ${joinRules}";
static m15(username) => "${username} si zmenili profilový obrázok";
static m16(username) => "${username} zmenili nastavenie aliasov chatu";
static m17(username) => "${username} zmenili odkaz k pozvánke do miestnosti";
static m18(error) => "Nebolo možné dešifrovať správu: ${error}";
static m19(count) => "${count} účastníkov";
static m20(username) => "${username} založili chat";
static m21(date, timeOfDay) => "${date}, ${timeOfDay}";
static m22(year, month, day) => "${day}.${month}.${year}";
static m23(month, day) => "${day}.${month}.";
static m24(displayname) => "Skupina s ${displayname}";
static m25(username, targetName) =>
"${username} vzal späť pozvánku pre ${targetName}";
static m26(groupName) => "Pozvať kontakt do ${groupName}";
static m27(username, link) =>
"${username} vás pozval na FluffyChat.\n1. Nainštalujte si FluffyChat: http://fluffy.chat\n2. Zaregistrujte sa alebo sa prihláste\n3. Otvorte odkaz na pozvánku: ${link}";
static m28(username, targetName) => "${username} pozvali ${targetName}";
static m29(username) => "${username} sa pripojili do chatu";
static m30(username, targetName) => "${username} vyhodili ${targetName}";
static m31(username, targetName) =>
"${username} vyhodili a zabanovali ${targetName}";
static m32(localizedTimeShort) => "Naposledy prítomní: ${localizedTimeShort}";
static m33(count) => "Načítať ďalších ${count} účastníkov";
static m34(homeserver) => "Prihlásenie k ${homeserver}";
static m35(number) => "${number} označených správ";
static m36(fileName) => "Prehrať (fileName}";
static m37(username) => "${username} odstránili udalosť";
static m38(username) => "${username} odmietli pozvánku";
static m39(username) => "Odstánené užívateľom ${username}";
static m40(username) => "Videné užívateľom ${username}";
static m41(username, count) =>
"Videné užívateľom ${username} a ${count} dalšími";
static m42(username, username2) =>
"Videné užívateľmi ${username} a ${username2}";
static m43(username) => "${username} poslali súbor";
static m44(username) => "${username} poslali obrázok";
static m45(username) => "${username} poslali nálepku";
static m46(username) => "${username} poslali video";
static m47(username) => "${username} poslali zvukovú nahrávku";
static m48(username) => "${username} zdieľa lokáciu";
static m49(hours12, hours24, minutes, suffix) => "${hours24}:${minutes}";
static m50(username, targetName) => "${username} odbanovali ${targetName}";
static m51(type) => "Neznáma udalosť „${type}";
static m52(unreadCount) => "${unreadCount} neprečítaných chatov";
static m53(unreadEvents) => "${unreadEvents} neprečítaných správ";
static m54(unreadEvents, unreadChats) =>
"${unreadEvents} neprečítaných správ v ${unreadChats} chatoch";
static m55(username, count) => "${username} a ${count} dalších píšu…";
static m56(username, username2) => "${username} a ${username2} píšu…";
static m57(username) => "${username} píše…";
static m58(username) => "${username} opustili chat";
static m59(username, type) => "${username} poslali udalosť ${type}";
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function>{
"(Optional) Group name":
MessageLookupByLibrary.simpleMessage("(Voliteľné) Názov skupiny"),
"About": MessageLookupByLibrary.simpleMessage("O aplikácii"),
"Accept": MessageLookupByLibrary.simpleMessage("Prijať"),
"Account": MessageLookupByLibrary.simpleMessage("Účet"),
"Account informations":
MessageLookupByLibrary.simpleMessage("Informácie o účte"),
"Add a group description":
MessageLookupByLibrary.simpleMessage("Pridať popis skupiny"),
"Admin": MessageLookupByLibrary.simpleMessage("Administrátor"),
"Already have an account?":
MessageLookupByLibrary.simpleMessage("Máte už účet?"),
"Anyone can join":
MessageLookupByLibrary.simpleMessage("Ktokoľvek sa môže pripojiť"),
"Archive": MessageLookupByLibrary.simpleMessage("Archivovať"),
"Archived Room":
MessageLookupByLibrary.simpleMessage("Archivovaná miestnosť"),
"Are guest users allowed to join":
MessageLookupByLibrary.simpleMessage("Môžu sa pripojiť hostia"),
"Are you sure?": MessageLookupByLibrary.simpleMessage("Ste si istí?"),
"Authentication":
MessageLookupByLibrary.simpleMessage("Autentifikácia"),
"Avatar has been changed":
MessageLookupByLibrary.simpleMessage("Avatar bol zmenený"),
"Ban from chat":
MessageLookupByLibrary.simpleMessage("Zabanovať z chatu"),
"Banned": MessageLookupByLibrary.simpleMessage("Zabanovaný"),
"Block Device":
MessageLookupByLibrary.simpleMessage("Zakázať zariadenie"),
"Cancel": MessageLookupByLibrary.simpleMessage("Zrušiť"),
"Change the homeserver":
MessageLookupByLibrary.simpleMessage("Zmeniť použitý server"),
"Change the name of the group":
MessageLookupByLibrary.simpleMessage("Zmeniť názov skupiny"),
"Change the server":
MessageLookupByLibrary.simpleMessage("Zmeniť server"),
"Change wallpaper":
MessageLookupByLibrary.simpleMessage("Zmeniť pozadie"),
"Change your style":
MessageLookupByLibrary.simpleMessage("Zmena štýlu"),
"Changelog": MessageLookupByLibrary.simpleMessage("História zmien"),
"Chat": MessageLookupByLibrary.simpleMessage("Chat"),
"Chat details":
MessageLookupByLibrary.simpleMessage("Podrobnosti o chate"),
"Choose a strong password":
MessageLookupByLibrary.simpleMessage("Vyberte si silné heslo"),
"Choose a username":
MessageLookupByLibrary.simpleMessage("Vyberte si užívateľské meno"),
"Close": MessageLookupByLibrary.simpleMessage("Zavrieť"),
"Confirm": MessageLookupByLibrary.simpleMessage("Potvrdiť"),
"Connect": MessageLookupByLibrary.simpleMessage("Pripojiť"),
"Connection attempt failed":
MessageLookupByLibrary.simpleMessage("Pokus o pripojenie zlyhal"),
"Contact has been invited to the group":
MessageLookupByLibrary.simpleMessage(
"Kontakt bol pozvaný do skupiny"),
"Content viewer":
MessageLookupByLibrary.simpleMessage("Prehliadač obsahu"),
"Copied to clipboard":
MessageLookupByLibrary.simpleMessage("Skopírované do schránky"),
"Copy": MessageLookupByLibrary.simpleMessage("Kopírovať"),
"Could not set avatar": MessageLookupByLibrary.simpleMessage(
"Nepodarilo sa nastaviť avatar"),
"Could not set displayname": MessageLookupByLibrary.simpleMessage(
"Nepodarilo sa nastaviť prezývku užívateľa"),
"Create": MessageLookupByLibrary.simpleMessage("Vytvoriť"),
"Create account now":
MessageLookupByLibrary.simpleMessage("Vytvoriť účet teraz"),
"Create new group":
MessageLookupByLibrary.simpleMessage("Vytvoriť novú skupinu"),
"Currently active":
MessageLookupByLibrary.simpleMessage("Momentálne prítomní"),
"Dark": MessageLookupByLibrary.simpleMessage("Tmavá"),
"Delete": MessageLookupByLibrary.simpleMessage("Odstrániť"),
"Delete message":
MessageLookupByLibrary.simpleMessage("Odstrániť správu"),
"Deny": MessageLookupByLibrary.simpleMessage("Zamietnuť"),
"Device": MessageLookupByLibrary.simpleMessage("Zariadenie"),
"Devices": MessageLookupByLibrary.simpleMessage("Zariadenia"),
"Discard picture":
MessageLookupByLibrary.simpleMessage("Zahodiť obrázok"),
"Displayname has been changed":
MessageLookupByLibrary.simpleMessage("Prezývka bola zmenená"),
"Donate": MessageLookupByLibrary.simpleMessage("Prispejte"),
"Download file": MessageLookupByLibrary.simpleMessage("Stiahnuť súbor"),
"Edit Jitsi instance":
MessageLookupByLibrary.simpleMessage("Nastavenie inštancie Jitsi"),
"Edit displayname":
MessageLookupByLibrary.simpleMessage("Zmeniť prezývku"),
"Emote Settings":
MessageLookupByLibrary.simpleMessage("Nastavenie emotikonov"),
"Emote shortcode":
MessageLookupByLibrary.simpleMessage("Kód emotikonu"),
"Empty chat": MessageLookupByLibrary.simpleMessage("Prázdny chat"),
"Encryption": MessageLookupByLibrary.simpleMessage("Šifrovanie"),
"Encryption algorithm":
MessageLookupByLibrary.simpleMessage("Šifrovací algoritmus"),
"Encryption is not enabled":
MessageLookupByLibrary.simpleMessage("Šifrovanie nie je aktívne"),
"End to end encryption is currently in Beta! Use at your own risk!":
MessageLookupByLibrary.simpleMessage(
"Konečné šifrovanie je momentálne v Beta verzii! Používajte na vlastné riziko!"),
"End-to-end encryption settings": MessageLookupByLibrary.simpleMessage(
"Nastavenie koncového šifrovania"),
"Enter a group name":
MessageLookupByLibrary.simpleMessage("Zadajte názov skupiny"),
"Enter a username":
MessageLookupByLibrary.simpleMessage("Zadajte uživateľské meno"),
"Enter your homeserver":
MessageLookupByLibrary.simpleMessage("Zadajte svoj homeserver"),
"File name": MessageLookupByLibrary.simpleMessage("Názov súboru"),
"File size": MessageLookupByLibrary.simpleMessage("Veľkosť súboru"),
"FluffyChat": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"Forward": MessageLookupByLibrary.simpleMessage("Preposlať"),
"Friday": MessageLookupByLibrary.simpleMessage("Piatok"),
"From joining": MessageLookupByLibrary.simpleMessage("Od pripojenia"),
"From the invitation":
MessageLookupByLibrary.simpleMessage("Od pozvania"),
"Group": MessageLookupByLibrary.simpleMessage("Skupina"),
"Group description":
MessageLookupByLibrary.simpleMessage("Popis skupiny"),
"Group description has been changed":
MessageLookupByLibrary.simpleMessage("Popis skupiny bol zmenený"),
"Group is public":
MessageLookupByLibrary.simpleMessage("Skupina je verejná"),
"Guests are forbidden":
MessageLookupByLibrary.simpleMessage("Hostia sú zakázaní"),
"Guests can join":
MessageLookupByLibrary.simpleMessage("Hostia sa môžu pripojiť"),
"Help": MessageLookupByLibrary.simpleMessage("Pomoc"),
"Homeserver is not compatible": MessageLookupByLibrary.simpleMessage(
"Homeserver nie je kompatibilný"),
"How are you today?":
MessageLookupByLibrary.simpleMessage("Ako sa dnes máte?"),
"ID": MessageLookupByLibrary.simpleMessage("ID"),
"Identity": MessageLookupByLibrary.simpleMessage("Identita"),
"Invite contact":
MessageLookupByLibrary.simpleMessage("Pozvať kontakt"),
"Invited": MessageLookupByLibrary.simpleMessage("Pozvanie"),
"Invited users only":
MessageLookupByLibrary.simpleMessage("Len pozvaní používatelia"),
"It seems that you have no google services on your phone. That\'s a good decision for your privacy! To receive push notifications in FluffyChat we recommend using microG: https://microg.org/":
MessageLookupByLibrary.simpleMessage(
"Zdá sa, že nemáte žiadne služby Googlu v telefóne. To je dobré rozhodnutie pre vaše súkromie! Ak chcete dostávať push notifikácie vo FluffyChat, odporúčame používať microG: https://microg.org/"),
"Kick from chat":
MessageLookupByLibrary.simpleMessage("Vyhodiť z chatu"),
"Last seen IP": MessageLookupByLibrary.simpleMessage(
"Naposledy zaznamenaná IP adresa"),
"Leave": MessageLookupByLibrary.simpleMessage("Opustiť"),
"Left the chat": MessageLookupByLibrary.simpleMessage("Opustili chat"),
"License": MessageLookupByLibrary.simpleMessage("Licencia"),
"Light": MessageLookupByLibrary.simpleMessage("Svetlá"),
"Load more...": MessageLookupByLibrary.simpleMessage("Načítať viac..."),
"Loading... Please wait": MessageLookupByLibrary.simpleMessage(
"Načítava sa... Čakajte prosím"),
"Login": MessageLookupByLibrary.simpleMessage("Prihlásiť sa"),
"Logout": MessageLookupByLibrary.simpleMessage("Odhlásiť sa"),
"Make a moderator":
MessageLookupByLibrary.simpleMessage("Pridať práva moderátora"),
"Make an admin":
MessageLookupByLibrary.simpleMessage("Pridať práva administrátora"),
"Make sure the identifier is valid":
MessageLookupByLibrary.simpleMessage(
"Skontrolujte, či je identifikátor platný"),
"Message will be removed for all participants":
MessageLookupByLibrary.simpleMessage(
"Správa bude odstránená pre všetkých účastníkov"),
"Moderator": MessageLookupByLibrary.simpleMessage("Moderátor"),
"Monday": MessageLookupByLibrary.simpleMessage("Pondelok"),
"Mute chat": MessageLookupByLibrary.simpleMessage("Stlmiť chat"),
"New message in FluffyChat":
MessageLookupByLibrary.simpleMessage("Nová správa v FluffyChate"),
"New private chat":
MessageLookupByLibrary.simpleMessage("Nový súkromný chat"),
"No emotes found. 😕": MessageLookupByLibrary.simpleMessage(
"Nenašli sa žiadne emotikony. 😕"),
"No permission":
MessageLookupByLibrary.simpleMessage("Chýba povolenie"),
"No rooms found...": MessageLookupByLibrary.simpleMessage(
"Nenašli sa žiadne miestnosti..."),
"None": MessageLookupByLibrary.simpleMessage("Žiadne"),
"Not supported in web": MessageLookupByLibrary.simpleMessage(
"Nepodporované vo webovej verzii"),
"Oops something went wrong...":
MessageLookupByLibrary.simpleMessage("Och! Niečo sa pokazilo..."),
"Open app to read messages": MessageLookupByLibrary.simpleMessage(
"Na prečítanie správy otvorte aplikáciu"),
"Open camera":
MessageLookupByLibrary.simpleMessage("Otvoriť fotoaparát"),
"Participating user devices": MessageLookupByLibrary.simpleMessage(
"Zúčastnené užívateľské zariadenia"),
"Password": MessageLookupByLibrary.simpleMessage("Heslo"),
"Pick image": MessageLookupByLibrary.simpleMessage("Vybrať obrázok"),
"Please be aware that you need Pantalaimon to use end-to-end encryption for now.":
MessageLookupByLibrary.simpleMessage(
"Prosím berte na vedomie, že na koncové šifrovanie zatiaľ potrebujete Pantalaimon."),
"Please choose a username": MessageLookupByLibrary.simpleMessage(
"Vyberte si používateľské meno"),
"Please enter a matrix identifier":
MessageLookupByLibrary.simpleMessage(
"Vyberte si matrix identifkátor"),
"Please enter your password":
MessageLookupByLibrary.simpleMessage("Prosím zadajte svoje heslo"),
"Please enter your username": MessageLookupByLibrary.simpleMessage(
"Zadajte svoje používateľské meno"),
"Public Rooms":
MessageLookupByLibrary.simpleMessage("Verejné miestnosti"),
"Recording": MessageLookupByLibrary.simpleMessage("Nahrávam"),
"Reject": MessageLookupByLibrary.simpleMessage("Odmietnuť"),
"Rejoin": MessageLookupByLibrary.simpleMessage("Vrátiť sa"),
"Remove": MessageLookupByLibrary.simpleMessage("Odstrániť"),
"Remove all other devices": MessageLookupByLibrary.simpleMessage(
"Odstráňiť všetky ostatné zariadenia"),
"Remove device":
MessageLookupByLibrary.simpleMessage("Odstráňiť zariadenie"),
"Remove exile": MessageLookupByLibrary.simpleMessage("Odblokovať"),
"Remove message":
MessageLookupByLibrary.simpleMessage("Odstrániť správu"),
"Render rich message content":
MessageLookupByLibrary.simpleMessage("Zobraziť formátovaný obsah"),
"Reply": MessageLookupByLibrary.simpleMessage("Odpovedať"),
"Request permission":
MessageLookupByLibrary.simpleMessage("Vyžiadať si povolenie"),
"Request to read older messages": MessageLookupByLibrary.simpleMessage(
"Žiadosť o prečítanie starších správ"),
"Revoke all permissions":
MessageLookupByLibrary.simpleMessage("Zrušiť všetky povolenia"),
"Room has been upgraded":
MessageLookupByLibrary.simpleMessage("Miestnosť bola upgradeovaná"),
"Saturday": MessageLookupByLibrary.simpleMessage("Sobota"),
"Search for a chat":
MessageLookupByLibrary.simpleMessage("Vyhladať v chate"),
"Seen a long time ago":
MessageLookupByLibrary.simpleMessage("Videný veľmi dávno"),
"Send": MessageLookupByLibrary.simpleMessage("Odoslať"),
"Send a message":
MessageLookupByLibrary.simpleMessage("Odoslať správu"),
"Send file": MessageLookupByLibrary.simpleMessage("Odoslať súbor"),
"Send image": MessageLookupByLibrary.simpleMessage("Odoslať obrázok"),
"Set a profile picture":
MessageLookupByLibrary.simpleMessage("Nastaviť profilový obrázok"),
"Set group description":
MessageLookupByLibrary.simpleMessage("Nastaviť popis skupiny"),
"Set invitation link":
MessageLookupByLibrary.simpleMessage("Nastaviť odkaz pre pozvánku"),
"Set status": MessageLookupByLibrary.simpleMessage("Nastaviť status"),
"Settings": MessageLookupByLibrary.simpleMessage("Nastavenia"),
"Share": MessageLookupByLibrary.simpleMessage("Zdieľať"),
"Sign up": MessageLookupByLibrary.simpleMessage("Zaregistrovať sa"),
"Skip": MessageLookupByLibrary.simpleMessage("Preskočiť"),
"Source code": MessageLookupByLibrary.simpleMessage("Zdrojový kód"),
"Start your first chat :-)":
MessageLookupByLibrary.simpleMessage("Začnite svoj prvý chat :-)"),
"Submit": MessageLookupByLibrary.simpleMessage("Odoslať"),
"Sunday": MessageLookupByLibrary.simpleMessage("Nedeľa"),
"System": MessageLookupByLibrary.simpleMessage("Systémová farba"),
"Tap to show menu":
MessageLookupByLibrary.simpleMessage("Ťuknutím zobrazíte menu"),
"The encryption has been corrupted":
MessageLookupByLibrary.simpleMessage("Šifrovanie bolo poškodené"),
"They Don\'t Match":
MessageLookupByLibrary.simpleMessage("Sa nezhodujú"),
"They Match": MessageLookupByLibrary.simpleMessage("Zhodujú sa"),
"This room has been archived.": MessageLookupByLibrary.simpleMessage(
"Táto miestnosť bola archivovaná."),
"Thursday": MessageLookupByLibrary.simpleMessage("Štvrtok"),
"Try to send again":
MessageLookupByLibrary.simpleMessage("Skúsiť znova odoslať"),
"Tuesday": MessageLookupByLibrary.simpleMessage("Utorok"),
"Unblock Device":
MessageLookupByLibrary.simpleMessage("Odblokovať zariadenie"),
"Unknown device":
MessageLookupByLibrary.simpleMessage("Neznáme zariadenie"),
"Unknown encryption algorithm": MessageLookupByLibrary.simpleMessage(
"Neznámy šifrovací algoritmus"),
"Unmute chat":
MessageLookupByLibrary.simpleMessage("Zrušiť stlmenie chatu"),
"Use Amoled compatible colors?": MessageLookupByLibrary.simpleMessage(
"Použiť Amoled kompatibilné farby?"),
"Username": MessageLookupByLibrary.simpleMessage("Užívateľské meno"),
"Verify": MessageLookupByLibrary.simpleMessage("Overiť"),
"Verify User":
MessageLookupByLibrary.simpleMessage("Verifikovať používateľa"),
"Video call": MessageLookupByLibrary.simpleMessage("Videohovor"),
"Visibility of the chat history":
MessageLookupByLibrary.simpleMessage("Viditeľnosť histórie chatu"),
"Visible for all participants": MessageLookupByLibrary.simpleMessage(
"Viditeľné pre všetkých účastníkov"),
"Visible for everyone":
MessageLookupByLibrary.simpleMessage("Viditeľné pre každého"),
"Voice message": MessageLookupByLibrary.simpleMessage("Hlasová správa"),
"Wallpaper": MessageLookupByLibrary.simpleMessage("Pozadie"),
"Wednesday": MessageLookupByLibrary.simpleMessage("Streda"),
"Welcome to the cutest instant messenger in the matrix network.":
MessageLookupByLibrary.simpleMessage(
"Vítajte v najroztomilejšom instant messengeri v sieti matrix."),
"Who is allowed to join this group":
MessageLookupByLibrary.simpleMessage(
"Kto môže vstúpiť do tejto skupiny"),
"Write a message...":
MessageLookupByLibrary.simpleMessage("Napísať správu..."),
"Yes": MessageLookupByLibrary.simpleMessage("Áno"),
"You": MessageLookupByLibrary.simpleMessage("Vy"),
"You are invited to this chat":
MessageLookupByLibrary.simpleMessage("Ste pozvaní do tohto chatu"),
"You are no longer participating in this chat":
MessageLookupByLibrary.simpleMessage(
"Už sa nezúčastňujete tohto chatu"),
"You cannot invite yourself":
MessageLookupByLibrary.simpleMessage("Nemôžete pozvať samých seba"),
"You have been banned from this chat":
MessageLookupByLibrary.simpleMessage(
"Máte zablokovaný prístup k tomuto chatu"),
"You won\'t be able to disable the encryption anymore. Are you sure?":
MessageLookupByLibrary.simpleMessage(
"Šifrovanie už nebude možné vypnúť. Ste si tým istí?"),
"Your own username":
MessageLookupByLibrary.simpleMessage("Vaša vlastná prezývka"),
"acceptedTheInvitation": m0,
"activatedEndToEndEncryption": m1,
"alias": MessageLookupByLibrary.simpleMessage("alias"),
"askSSSSCache": MessageLookupByLibrary.simpleMessage(
"Prosím zadajte vašu prístupovu frázu k \"bezpečému úložisku\" alebo \"kľúč na obnovu\" pre uloženie kľúčov."),
"askSSSSSign": MessageLookupByLibrary.simpleMessage(
"Na overenie tejto osoby, prosím zadajte prístupovu frázu k \"bezpečému úložisku\" alebo \"klúč na obnovu\"."),
"askSSSSVerify": MessageLookupByLibrary.simpleMessage(
"Prosím zadajte vašu prístupovú frázu k \"bezpečnému úložisku\" alebo \"kľúč na obnovu\" pre overenie vašej relácie."),
"askVerificationRequest": m60,
"bannedUser": m2,
"byDefaultYouWillBeConnectedTo": m3,
"cachedKeys":
MessageLookupByLibrary.simpleMessage("Klúče sa úspešne uložili!"),
"changedTheChatAvatar": m4,
"changedTheChatDescriptionTo": m5,
"changedTheChatNameTo": m6,
"changedTheChatPermissions": m7,
"changedTheDisplaynameTo": m8,
"changedTheGuestAccessRules": m9,
"changedTheGuestAccessRulesTo": m10,
"changedTheHistoryVisibility": m11,
"changedTheHistoryVisibilityTo": m12,
"changedTheJoinRules": m13,
"changedTheJoinRulesTo": m14,
"changedTheProfileAvatar": m15,
"changedTheRoomAliases": m16,
"changedTheRoomInvitationLink": m17,
"compareEmojiMatch": MessageLookupByLibrary.simpleMessage(
"Porovnajte a uistite sa, že nasledujúce emotikony sa zhodujú na oboch zariadeniach:"),
"compareNumbersMatch": MessageLookupByLibrary.simpleMessage(
"Porovnajte a uistite sa, že nasledujúce čísla sa zhodujú na oboch zariadeniach:"),
"couldNotDecryptMessage": m18,
"countParticipants": m19,
"createdTheChat": m20,
"crossSigningDisabled": MessageLookupByLibrary.simpleMessage(
"Vzájomné overenie je vypnuté"),
"crossSigningEnabled": MessageLookupByLibrary.simpleMessage(
"Vzájomné overenie je zapnuté"),
"dateAndTimeOfDay": m21,
"dateWithYear": m22,
"dateWithoutYear": m23,
"emoteExists":
MessageLookupByLibrary.simpleMessage("Emotikon už existuje"),
"emoteInvalid": MessageLookupByLibrary.simpleMessage(
"Nesprávné označenie emotikonu"),
"emoteWarnNeedToPick": MessageLookupByLibrary.simpleMessage(
"Musíte zvoliť kód emotikonu a obrázok"),
"groupWith": m24,
"hasWithdrawnTheInvitationFor": m25,
"incorrectPassphraseOrKey": MessageLookupByLibrary.simpleMessage(
"Nesprávna prístupová fráza alebo kľúč na obnovenie"),
"inviteContactToGroup": m26,
"inviteText": m27,
"invitedUser": m28,
"is typing...": MessageLookupByLibrary.simpleMessage("píše..."),
"isDeviceKeyCorrect": MessageLookupByLibrary.simpleMessage(
"Je nasledujúci kód zariadenia správny?"),
"joinedTheChat": m29,
"keysCached": MessageLookupByLibrary.simpleMessage("Kľúče sú uložené"),
"keysMissing": MessageLookupByLibrary.simpleMessage("Kľúče chýbaju"),
"kicked": m30,
"kickedAndBanned": m31,
"lastActiveAgo": m32,
"loadCountMoreParticipants": m33,
"logInTo": m34,
"newVerificationRequest":
MessageLookupByLibrary.simpleMessage("Nová žiadosť o verifikáciu!"),
"noCrossSignBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat v súčasnosti nepodporuje povolenie krížového podpisu. Prosím, povoľte ho z Riot.im."),
"noMegolmBootstrap": MessageLookupByLibrary.simpleMessage(
"Fluffychat v súčasnosti nepodporuje povolenie online zálohu klúčov. Prosím, povoľte ho z Riot.im."),
"numberSelected": m35,
"ok": MessageLookupByLibrary.simpleMessage("ok"),
"onlineKeyBackupDisabled": MessageLookupByLibrary.simpleMessage(
"Online záloha kľúčov je vypnutá"),
"onlineKeyBackupEnabled": MessageLookupByLibrary.simpleMessage(
"Online záloha kľúčov je zapnutá"),
"passphraseOrKey": MessageLookupByLibrary.simpleMessage(
"prístupová fráza alebo kľúč na obnovenie"),
"play": m36,
"redactedAnEvent": m37,
"rejectedTheInvitation": m38,
"removedBy": m39,
"seenByUser": m40,
"seenByUserAndCountOthers": m41,
"seenByUserAndUser": m42,
"sentAFile": m43,
"sentAPicture": m44,
"sentASticker": m45,
"sentAVideo": m46,
"sentAnAudio": m47,
"sessionVerified":
MessageLookupByLibrary.simpleMessage("Relácia je overená"),
"sharedTheLocation": m48,
"timeOfDay": m49,
"title": MessageLookupByLibrary.simpleMessage("FluffyChat"),
"unbannedUser": m50,
"unknownEvent": m51,
"unknownSessionVerify": MessageLookupByLibrary.simpleMessage(
"Neznáma relácia, prosím verifikujte ju"),
"unreadChats": m52,
"unreadMessages": m53,
"unreadMessagesInChats": m54,
"userAndOthersAreTyping": m55,
"userAndUserAreTyping": m56,
"userIsTyping": m57,
"userLeftTheChat": m58,
"userSentUnknownEvent": m59,
"verifiedSession":
MessageLookupByLibrary.simpleMessage("Úspešne overenie relácie!"),
"verifyManual":
MessageLookupByLibrary.simpleMessage("Verifikovať manuálne"),
"verifyStart":
MessageLookupByLibrary.simpleMessage("Spustiť verifikáciu"),
"verifySuccess":
MessageLookupByLibrary.simpleMessage("Verifikácia bola úspešná!"),
"verifyTitle":
MessageLookupByLibrary.simpleMessage("Verifikujem protiľahlý účet"),
"waitingPartnerAcceptRequest": MessageLookupByLibrary.simpleMessage(
"Čaká sa, kým partner prijme požiadavku..."),
"waitingPartnerEmoji": MessageLookupByLibrary.simpleMessage(
"Čaká sa, kým partner prijme emotikon..."),
"waitingPartnerNumbers": MessageLookupByLibrary.simpleMessage(
"Čaká sa na to, kým partner prijme čísla...")
};
}

View file

@ -1,23 +1,41 @@
import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:bot_toast/bot_toast.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/views/homeserver_picker.dart'; import 'package:fluffychat/views/homeserver_picker.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:bot_toast/bot_toast.dart'; import 'package:localstorage/localstorage.dart';
import 'package:sentry/sentry.dart';
import 'l10n/l10n.dart';
import 'components/theme_switcher.dart';
import 'components/matrix.dart';
import 'views/chat_list.dart';
import 'package:universal_html/prefer_universal/html.dart' as html; import 'package:universal_html/prefer_universal/html.dart' as html;
import 'components/matrix.dart';
import 'components/theme_switcher.dart';
import 'views/chat_list.dart';
final sentry = SentryClient(dsn: '8591d0d863b646feb4f3dda7e5dcab38');
void main() { void main() {
SystemChrome.setSystemUIOverlayStyle( SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(statusBarColor: Colors.transparent)); SystemUiOverlayStyle(statusBarColor: Colors.transparent));
runApp(App()); runZonedGuarded(
() => runApp(App()),
(error, stackTrace) async {
final storage = LocalStorage('LocalStorage');
await storage.ready;
debugPrint(error.toString());
debugPrint(stackTrace.toString());
if (storage.getItem('sentry') == true) {
await sentry.captureException(
exception: error,
stackTrace: stackTrace,
);
}
},
);
} }
class App extends StatelessWidget { class App extends StatelessWidget {
@ -34,26 +52,8 @@ class App extends StatelessWidget {
builder: BotToastInit(), builder: BotToastInit(),
navigatorObservers: [BotToastNavigatorObserver()], navigatorObservers: [BotToastNavigatorObserver()],
theme: ThemeSwitcherWidget.of(context).themeData, theme: ThemeSwitcherWidget.of(context).themeData,
localizationsDelegates: [ localizationsDelegates: L10n.localizationsDelegates,
AppLocalizationsDelegate(), supportedLocales: L10n.supportedLocales,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en'), // English
const Locale('de'), // German
const Locale('hu'), // Hungarian
const Locale('pl'), // Polish
const Locale('fr'), // French
const Locale('cs'), // Czech
const Locale('es'), // Spanish
const Locale('sk'), // Slovakian
const Locale('gl'), // Galician
const Locale('hr'), // Croatian
const Locale('ja'), // Japanese
const Locale('ru'), // Russian
],
locale: kIsWeb locale: kIsWeb
? Locale(html.window.navigator.language.split('-').first) ? Locale(html.window.navigator.language.split('-').first)
: null, : null,

View file

@ -1,10 +1,7 @@
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
extension ClientPresenceExtension on Client { extension ClientPresenceExtension on Client {
static final Map<String, Profile> presencesCache = {}; List<Presence> get statuses => presences.values
.where((p) => p.presence.statusMsg?.isNotEmpty ?? false)
Future<Profile> requestProfileCached(String senderId) async { .toList();
presencesCache[senderId] ??= await getProfileFromUserId(senderId);
return presencesCache[senderId];
}
} }

View file

@ -6,9 +6,9 @@ import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'package:moor/backends.dart'; import 'package:moor/backends.dart';
import 'package:moor/ffi.dart';
import 'package:moor/moor.dart'; import 'package:moor/moor.dart';
import 'package:moor_ffi/moor_ffi.dart'; import 'package:sqlite3/open.dart';
import 'package:moor_ffi/open_helper.dart';
/// Tells `moor_ffi` to use `sqlcipher` instead of the regular `sqlite3`. /// Tells `moor_ffi` to use `sqlcipher` instead of the regular `sqlite3`.
/// ///

View file

@ -1,3 +1,4 @@
import 'dart:ffi';
import 'dart:io'; import 'dart:io';
import 'dart:isolate'; import 'dart:isolate';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
@ -6,7 +7,10 @@ import 'package:path/path.dart' as p;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:moor/moor.dart'; import 'package:moor/moor.dart';
import 'package:moor/isolate.dart'; import 'package:moor/isolate.dart';
import '../platform_infos.dart';
import 'cipher_db.dart' as cipher; import 'cipher_db.dart' as cipher;
import 'package:moor/ffi.dart' as moor;
import 'package:sqlite3/open.dart';
bool _inited = false; bool _inited = false;
@ -47,6 +51,7 @@ Future<Database> constructDb(
{bool logStatements = false, {bool logStatements = false,
String filename = 'database.sqlite', String filename = 'database.sqlite',
String password = ''}) async { String password = ''}) async {
if (PlatformInfos.isMobile || Platform.isMacOS) {
debugPrint('[Moor] using encrypted moor'); debugPrint('[Moor] using encrypted moor');
final dbFolder = await getDatabasesPath(); final dbFolder = await getDatabasesPath();
final targetPath = p.join(dbFolder, filename); final targetPath = p.join(dbFolder, filename);
@ -58,6 +63,27 @@ Future<Database> constructDb(
); );
final isolate = (await receivePort.first as MoorIsolate); final isolate = (await receivePort.first as MoorIsolate);
return Database.connect(await isolate.connect()); return Database.connect(await isolate.connect());
} else if (Platform.isLinux) {
debugPrint('[Moor] using desktop moor');
open.overrideFor(OperatingSystem.linux, _openOnLinux);
return Database(moor.VmDatabase.memory());
} else if (Platform.isWindows) {
debugPrint('[Moor] using desktop moor');
open.overrideFor(OperatingSystem.linux, _openOnWindows);
return Database(moor.VmDatabase.memory());
}
throw Exception('Platform not supported');
}
DynamicLibrary _openOnLinux() {
final libraryNextToScript = File('/usr/lib/x86_64-linux-gnu/libsqlite3.so');
return DynamicLibrary.open(libraryNextToScript.path);
}
DynamicLibrary _openOnWindows() {
final script = File(Platform.script.toFilePath());
final libraryNextToScript = File('${script.path}/sqlite3.dll');
return DynamicLibrary.open(libraryNextToScript.path);
} }
Future<String> getLocalstorage(String key) async { Future<String> getLocalstorage(String key) async {

View file

@ -1,5 +1,5 @@
import 'package:fluffychat/l10n/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
/// Provides extra functionality for formatting the time. /// Provides extra functionality for formatting the time.
extension DateTimeExtension on DateTime { extension DateTimeExtension on DateTime {
@ -34,8 +34,11 @@ extension DateTimeExtension on DateTime {
/// Returns a simple time String. /// Returns a simple time String.
/// TODO: Add localization /// TODO: Add localization
String localizedTimeOfDay(BuildContext context) { String localizedTimeOfDay(BuildContext context) {
return L10n.of(context).timeOfDay(_z(hour % 12 == 0 ? 12 : hour % 12), if (MediaQuery.of(context).alwaysUse24HourFormat) {
_z(hour), _z(minute), hour > 11 ? 'pm' : 'am'); return '${_z(hour)}:${_z(minute)}';
} else {
return '${_z(hour % 12 == 0 ? 12 : hour % 12)}:${_z(minute)} ${hour > 11 ? "pm" : "am"}';
}
} }
/// Returns [localizedTimeOfDay()] if the ChatTime is today, the name of the week /// Returns [localizedTimeOfDay()] if the ChatTime is today, the name of the week

View file

@ -3,9 +3,20 @@ import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'matrix_file_extension.dart'; import 'matrix_file_extension.dart';
import 'app_route.dart';
import '../views/image_view.dart';
extension LocalizedBody on Event { extension LocalizedBody on Event {
void openFile(BuildContext context) async { void openFile(BuildContext context, {bool downloadOnly = false}) async {
if (!downloadOnly &&
[MessageTypes.Image, MessageTypes.Sticker].contains(messageType)) {
await Navigator.of(context).push(
AppRoute(
ImageView(this),
),
);
return;
}
final MatrixFile matrixFile = final MatrixFile matrixFile =
await SimpleDialogs(context).tryRequestWithLoadingDialog( await SimpleDialogs(context).tryRequestWithLoadingDialog(
downloadAndDecryptAttachment(), downloadAndDecryptAttachment(),
@ -32,7 +43,14 @@ extension LocalizedBody on Event {
[MessageTypes.Image, MessageTypes.Sticker].contains(messageType) && [MessageTypes.Image, MessageTypes.Sticker].contains(messageType) &&
(kIsWeb || (kIsWeb ||
(content['info'] is Map && (content['info'] is Map &&
content['info']['size'] < room.client.database.maxFileSize)); content['info']['size'] is int &&
content['info']['size'] < room.client.database.maxFileSize) ||
(hasThumbnail &&
content['info']['thumbnail_info'] is Map &&
content['info']['thumbnail_info']['size'] is int &&
content['info']['thumbnail_info']['size'] <
room.client.database.maxFileSize) ||
(content['url'] is String));
String get sizeString { String get sizeString {
if (content['info'] is Map<String, dynamic> && if (content['info'] is Map<String, dynamic> &&

View file

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart';
@ -186,7 +187,9 @@ Future<void> migrate(String clientName, Database db, Store store) async {
entry.key, entry.key,
entry.value['inboundGroupSession'], entry.value['inboundGroupSession'],
json.encode(entry.value['content']), json.encode(entry.value['content']),
json.encode(entry.value['indexes'])); json.encode(entry.value['indexes']),
null,
null);
} }
} }
} }
@ -199,10 +202,10 @@ class Store {
Store() Store()
: storage = LocalStorage('LocalStorage'), : storage = LocalStorage('LocalStorage'),
secureStorage = kIsWeb ? null : FlutterSecureStorage(); secureStorage = PlatformInfos.isMobile ? FlutterSecureStorage() : null;
Future<dynamic> getItem(String key) async { Future<dynamic> getItem(String key) async {
if (kIsWeb) { if (!PlatformInfos.isMobile) {
await storage.ready; await storage.ready;
try { try {
return await storage.getItem(key); return await storage.getItem(key);
@ -218,7 +221,7 @@ class Store {
} }
Future<void> setItem(String key, String value) async { Future<void> setItem(String key, String value) async {
if (kIsWeb) { if (!PlatformInfos.isMobile) {
await storage.ready; await storage.ready;
return await storage.setItem(key, value); return await storage.setItem(key, value);
} }
@ -230,7 +233,7 @@ class Store {
} }
Future<Map<String, dynamic>> getAllItems() async { Future<Map<String, dynamic>> getAllItems() async {
if (kIsWeb) { if (!PlatformInfos.isMobile) {
try { try {
final rawStorage = await getLocalstorage('LocalStorage'); final rawStorage = await getLocalstorage('LocalStorage');
return json.decode(rawStorage); return json.decode(rawStorage);

View file

@ -1,19 +1,22 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:bot_toast/bot_toast.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/chat.dart'; import 'package:fluffychat/views/chat.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:flutter_gen/gen_l10n/l10n_en.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:bot_toast/bot_toast.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'famedlysdk_store.dart';
import '../components/matrix.dart'; import '../components/matrix.dart';
import 'famedlysdk_store.dart';
import 'matrix_locals.dart';
abstract class FirebaseController { abstract class FirebaseController {
static final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); static final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
@ -53,7 +56,10 @@ abstract class FirebaseController {
} }
return; return;
} }
final pushers = await client.api.requestPushers(); final pushers = await client.requestPushers().catchError((e) {
debugPrint('[Push] Unable to request pushers: ${e.toString()}');
return [];
});
final currentPushers = pushers.where((pusher) => pusher.pushkey == token); final currentPushers = pushers.where((pusher) => pusher.pushkey == token);
if (currentPushers.length == 1 && if (currentPushers.length == 1 &&
currentPushers.first.kind == 'http' && currentPushers.first.kind == 'http' &&
@ -69,14 +75,15 @@ abstract class FirebaseController {
for (final currentPusher in currentPushers) { for (final currentPusher in currentPushers) {
currentPusher.pushkey = token; currentPusher.pushkey = token;
currentPusher.kind = 'null'; currentPusher.kind = 'null';
await client.api.setPusher( await client.setPusher(
currentPusher, currentPusher,
append: true, append: true,
); );
debugPrint('[Push] Remove legacy pusher for this device'); debugPrint('[Push] Remove legacy pusher for this device');
} }
} }
await client.api.setPusher( await client
.setPusher(
Pusher( Pusher(
token, token,
APP_ID, APP_ID,
@ -90,7 +97,11 @@ abstract class FirebaseController {
kind: 'http', kind: 'http',
), ),
append: false, append: false,
); )
.catchError((e) {
debugPrint('[Push] Unable to set pushers: ${e.toString()}');
return [];
});
} }
Function goToRoom = (dynamic message) async { Function goToRoom = (dynamic message) async {
@ -149,21 +160,30 @@ abstract class FirebaseController {
return null; return null;
} }
if (context != null && Matrix.of(context).activeRoomId == roomId) { if (context != null && Matrix.of(context).activeRoomId == roomId) {
debugPrint('[Push] New clearing push');
return null; return null;
} }
final i18n = debugPrint('[Push] New message received');
context == null ? L10n(Platform.localeName) : L10n.of(context); // FIXME unable to init without context currently https://github.com/flutter/flutter/issues/67092
// Locked on EN until issue resolved
final i18n = context == null ? L10nEn() : L10n.of(context);
// Get the client // Get the client
Client client; Client client;
if (context != null) { var tempClient = false;
try {
client = Matrix.of(context).client; client = Matrix.of(context).client;
} else { } catch (_) {
client = null;
}
if (client == null) {
tempClient = true;
final platform = kIsWeb ? 'Web' : Platform.operatingSystem; final platform = kIsWeb ? 'Web' : Platform.operatingSystem;
final clientName = 'FluffyChat $platform'; final clientName = 'FluffyChat $platform';
client = Client(clientName, debug: false); client = Client(clientName);
client.database = await getDatabase(client); client.database = await getDatabase(client);
client.connect(); client.connect();
debugPrint('[Push] Use a temp client');
await client.onLoginStateChanged.stream await client.onLoginStateChanged.stream
.firstWhere((l) => l == LoginState.logged) .firstWhere((l) => l == LoginState.logged)
.timeout( .timeout(
@ -174,10 +194,12 @@ abstract class FirebaseController {
// Get the room // Get the room
var room = client.getRoomById(roomId); var room = client.getRoomById(roomId);
if (room == null) { if (room == null) {
debugPrint('[Push] Wait for the room');
await client.onRoomUpdate.stream await client.onRoomUpdate.stream
.where((u) => u.id == roomId) .where((u) => u.id == roomId)
.first .first
.timeout(Duration(seconds: 5)); .timeout(Duration(seconds: 5));
debugPrint('[Push] Room found');
room = client.getRoomById(roomId); room = client.getRoomById(roomId);
if (room == null) return null; if (room == null) return null;
} }
@ -185,10 +207,12 @@ abstract class FirebaseController {
// Get the event // Get the event
var event = await client.database.getEventById(client.id, eventId, room); var event = await client.database.getEventById(client.id, eventId, room);
if (event == null) { if (event == null) {
debugPrint('[Push] Wait for the event');
final eventUpdate = await client.onEvent.stream final eventUpdate = await client.onEvent.stream
.where((u) => u.content['event_id'] == eventId) .where((u) => u.content['event_id'] == eventId)
.first .first
.timeout(Duration(seconds: 5)); .timeout(Duration(seconds: 5));
debugPrint('[Push] Event found');
event = Event.fromJson(eventUpdate.content, room); event = Event.fromJson(eventUpdate.content, room);
if (room == null) return null; if (room == null) return null;
} }
@ -206,14 +230,14 @@ abstract class FirebaseController {
// Calculate the body // Calculate the body
final body = event.getLocalizedBody( final body = event.getLocalizedBody(
i18n, MatrixLocals(i18n),
withSenderNamePrefix: true, withSenderNamePrefix: true,
hideReply: true, hideReply: true,
); );
// The person object for the android message style notification // The person object for the android message style notification
final person = Person( final person = Person(
name: room.getLocalizedDisplayname(i18n), name: room.getLocalizedDisplayname(MatrixLocals(i18n)),
icon: room.avatar == null icon: room.avatar == null
? null ? null
: BitmapFilePathAndroidIcon( : BitmapFilePathAndroidIcon(
@ -247,8 +271,17 @@ abstract class FirebaseController {
var platformChannelSpecifics = NotificationDetails( var platformChannelSpecifics = NotificationDetails(
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await _flutterLocalNotificationsPlugin.show( await _flutterLocalNotificationsPlugin.show(
0, room.getLocalizedDisplayname(i18n), body, platformChannelSpecifics, 0,
room.getLocalizedDisplayname(MatrixLocals(i18n)),
body,
platformChannelSpecifics,
payload: roomId); payload: roomId);
if (tempClient) {
await client.dispose();
client = null;
debugPrint('[Push] Temp client disposed');
}
} catch (exception) { } catch (exception) {
debugPrint('[Push] Error while processing notification: ' + debugPrint('[Push] Error while processing notification: ' +
exception.toString()); exception.toString());
@ -268,7 +301,11 @@ abstract class FirebaseController {
var initializationSettings = InitializationSettings( var initializationSettings = InitializationSettings(
initializationSettingsAndroid, initializationSettingsIOS); initializationSettingsAndroid, initializationSettingsIOS);
await flutterLocalNotificationsPlugin.initialize(initializationSettings); await flutterLocalNotificationsPlugin.initialize(initializationSettings);
final l10n = L10n(Platform.localeName);
// FIXME unable to init without context currently https://github.com/flutter/flutter/issues/67092
// Locked on en for now
//final l10n = L10n(Platform.localeName);
final l10n = L10nEn();
// Notification data and matrix data // Notification data and matrix data
Map<dynamic, dynamic> data = message['data'] ?? message; Map<dynamic, dynamic> data = message['data'] ?? message;

View file

@ -24,11 +24,44 @@ extension MatrixFileExtension on MatrixFile {
element.click(); element.click();
element.remove(); element.remove();
} else { } else {
var tempDir = await getTemporaryDirectory(); final downloadsDir = Platform.isAndroid
final file = File(tempDir.path + '/' + name.split('/').last); ? (await getExternalStorageDirectory())
: (await getApplicationDocumentsDirectory());
final file = File(downloadsDir.path + '/' + name.split('/').last);
file.writeAsBytesSync(bytes); file.writeAsBytesSync(bytes);
await OpenFile.open(file.path); await OpenFile.open(file.path);
} }
return; return;
} }
MatrixFile get detectFileType {
if (msgType == MessageTypes.Image) {
return MatrixImageFile(bytes: bytes, name: name);
}
if (msgType == MessageTypes.Video) {
return MatrixVideoFile(bytes: bytes, name: name);
}
if (msgType == MessageTypes.Audio) {
return MatrixAudioFile(bytes: bytes, name: name);
}
return this;
}
String get sizeString {
var size = this.size.toDouble();
if (size < 1000000) {
size = size / 1000;
size = (size * 10).round() / 10;
return '${size.toString()} KB';
} else if (size < 1000000000) {
size = size / 1000000;
size = (size * 10).round() / 10;
return '${size.toString()} MB';
} else {
size = size / 1000000000;
size = (size * 10).round() / 10;
return '${size.toString()} GB';
}
}
} }

View file

@ -0,0 +1,24 @@
extension MatrixIdentifierStringExtension on String {
/// Separates room identifiers with an event id and possibly a query parameter into its components.
MatrixIdentifierStringExtensionResults parseIdentifierIntoParts() {
final match = RegExp(r'^([#!][^:]*:[^\/?]*)(?:\/(\$[^?]*))?(?:\?(.*))?$')
.firstMatch(this);
if (match == null) {
return null;
}
return MatrixIdentifierStringExtensionResults(
roomIdOrAlias: match.group(1),
eventId: match.group(2),
queryString: match.group(3),
);
}
}
class MatrixIdentifierStringExtensionResults {
final String roomIdOrAlias;
final String eventId;
final String queryString;
MatrixIdentifierStringExtensionResults(
{this.roomIdOrAlias, this.eventId, this.queryString});
}

View file

@ -0,0 +1,264 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
/// This is a temporary helper class until there is a proper solution to this with the new system
class MatrixLocals extends MatrixLocalizations {
final L10n l10n;
MatrixLocals(this.l10n);
@override
String acceptedTheInvitation(String targetName) {
return l10n.acceptedTheInvitation(targetName);
}
@override
String activatedEndToEndEncryption(String senderName) {
return l10n.activatedEndToEndEncryption(senderName);
}
@override
String answeredTheCall(String senderName) {
return l10n.answeredTheCall(senderName);
}
@override
String get anyoneCanJoin => l10n.anyoneCanJoin;
@override
String bannedUser(String senderName, String targetName) {
return l10n.bannedUser(senderName, targetName);
}
@override
String changedTheChatAvatar(String senderName) {
return l10n.changedTheChatAvatar(senderName);
}
@override
String changedTheChatDescriptionTo(String senderName, String content) {
return l10n.changedTheChatDescriptionTo(senderName, content);
}
@override
String changedTheChatNameTo(String senderName, String content) {
return l10n.changedTheChatNameTo(senderName, content);
}
@override
String changedTheChatPermissions(String senderName) {
return l10n.changedTheChatPermissions(senderName);
}
@override
String changedTheDisplaynameTo(String targetName, String newDisplayname) {
return l10n.changedTheDisplaynameTo(targetName, newDisplayname);
}
@override
String changedTheGuestAccessRules(String senderName) {
return l10n.changedTheGuestAccessRules(senderName);
}
@override
String changedTheGuestAccessRulesTo(
String senderName, String localizedString) {
return l10n.changedTheGuestAccessRulesTo(senderName, localizedString);
}
@override
String changedTheHistoryVisibility(String senderName) {
return l10n.changedTheHistoryVisibility(senderName);
}
@override
String changedTheHistoryVisibilityTo(
String senderName, String localizedString) {
return l10n.changedTheHistoryVisibilityTo(senderName, localizedString);
}
@override
String changedTheJoinRules(String senderName) {
return l10n.changedTheJoinRules(senderName);
}
@override
String changedTheJoinRulesTo(String senderName, String localizedString) {
return l10n.changedTheJoinRulesTo(senderName, localizedString);
}
@override
String changedTheProfileAvatar(String targetName) {
return l10n.changedTheProfileAvatar(targetName);
}
@override
String changedTheRoomAliases(String senderName) {
return l10n.changedTheRoomAliases(senderName);
}
@override
String changedTheRoomInvitationLink(String senderName) {
return l10n.changedTheRoomInvitationLink(senderName);
}
@override
String get channelCorruptedDecryptError => l10n.channelCorruptedDecryptError;
@override
String couldNotDecryptMessage(String errorText) {
return l10n.couldNotDecryptMessage(errorText);
}
@override
String createdTheChat(String senderName) {
return l10n.createdTheChat(senderName);
}
@override
String get emptyChat => l10n.emptyChat;
@override
String get encryptionNotEnabled => l10n.encryptionNotEnabled;
@override
String endedTheCall(String senderName) {
return l10n.endedTheCall(senderName);
}
@override
String get fromJoining => l10n.fromJoining;
@override
String get fromTheInvitation => l10n.fromTheInvitation;
@override
String groupWith(String displayname) {
return l10n.groupWith(displayname);
}
@override
String get guestsAreForbidden => l10n.guestsAreForbidden;
@override
String get guestsCanJoin => l10n.guestsCanJoin;
@override
String hasWithdrawnTheInvitationFor(String senderName, String targetName) {
return l10n.hasWithdrawnTheInvitationFor(senderName, targetName);
}
@override
String invitedUser(String senderName, String targetName) {
return l10n.invitedUser(senderName, targetName);
}
@override
String get invitedUsersOnly => l10n.invitedUsersOnly;
@override
String joinedTheChat(String targetName) {
return l10n.joinedTheChat(targetName);
}
@override
String kicked(String senderName, String targetName) {
return l10n.kicked(senderName, targetName);
}
@override
String kickedAndBanned(String senderName, String targetName) {
return l10n.kickedAndBanned(senderName, targetName);
}
@override
String get needPantalaimonWarning => l10n.needPantalaimonWarning;
@override
String get noPermission => l10n.noPermission;
@override
String redactedAnEvent(String senderName) {
return l10n.redactedAnEvent(senderName);
}
@override
String rejectedTheInvitation(String targetName) {
return l10n.rejectedTheInvitation(targetName);
}
@override
String removedBy(String calcDisplayname) {
return l10n.removedBy(calcDisplayname);
}
@override
String get roomHasBeenUpgraded => l10n.roomHasBeenUpgraded;
@override
String sentAFile(String senderName) {
return l10n.sentAFile(senderName);
}
@override
String sentAPicture(String senderName) {
return l10n.sentAPicture(senderName);
}
@override
String sentASticker(String senderName) {
return l10n.sentASticker(senderName);
}
@override
String sentAVideo(String senderName) {
return l10n.sentAVideo(senderName);
}
@override
String sentAnAudio(String senderName) {
return l10n.sentAnAudio(senderName);
}
@override
String sentCallInformations(String senderName) {
return l10n.sentCallInformations(senderName);
}
@override
String sharedTheLocation(String senderName) {
return l10n.sharedTheLocation(senderName);
}
@override
String startedACall(String senderName) {
return l10n.startedACall(senderName);
}
@override
String unbannedUser(String senderName, String targetName) {
return l10n.unbannedUser(senderName, targetName);
}
@override
String get unknownEncryptionAlgorithm => l10n.unknownEncryptionAlgorithm;
@override
String unknownEvent(String typeKey) {
return l10n.unknownEvent(typeKey);
}
@override
String userLeftTheChat(String targetName) {
return l10n.userLeftTheChat(userLeftTheChat);
}
@override
String get visibleForAllParticipants => l10n.visibleForAllParticipants;
@override
String get visibleForEveryone => l10n.visibleForEveryone;
@override
String get you => l10n.you;
}

View file

@ -0,0 +1,9 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
abstract class PlatformInfos {
static bool get isWeb => kIsWeb;
static bool get isMobile => !kIsWeb && (Platform.isAndroid || Platform.isIOS);
static bool get usesTouchscreen => !isMobile;
}

View file

@ -1,18 +1,24 @@
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'date_time_extension.dart'; import 'date_time_extension.dart';
extension PresenceExtension on Presence { extension PresenceExtension on Presence {
bool get isUserStatus => presence?.statusMsg?.isNotEmpty ?? false;
String getLocalizedStatusMessage(BuildContext context) { String getLocalizedStatusMessage(BuildContext context) {
if (presence.statusMsg?.isNotEmpty ?? false) { if (presence.statusMsg?.isNotEmpty ?? false) {
return presence.statusMsg; return presence.statusMsg;
} }
if (presence.lastActiveAgo != null) { if (presence.lastActiveAgo != null ?? presence.lastActiveAgo != 0) {
return L10n.of(context).lastActiveAgo( return L10n.of(context).lastActiveAgo(
DateTime.fromMillisecondsSinceEpoch(presence.lastActiveAgo) DateTime.fromMillisecondsSinceEpoch(presence.lastActiveAgo)
.localizedTimeShort(context)); .localizedTimeShort(context));
} }
if (presence.currentlyActive) {
return L10n.of(context).currentlyActive;
}
return L10n.of(context).lastSeenLongTimeAgo; return L10n.of(context).lastSeenLongTimeAgo;
} }
} }

View file

@ -0,0 +1,98 @@
/*
* Famedly App
* Copyright (C) 2020 Famedly GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import 'dart:typed_data';
import 'dart:ui';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:native_imaging/native_imaging.dart' as native;
extension RoomSendFileExtension on Room {
Future<String> sendFileEventWithThumbnail(
MatrixFile file, {
String txid,
Event inReplyTo,
String editEventId,
bool waitUntilSent,
}) async {
MatrixFile thumbnail;
try {
if (file is MatrixImageFile) {
await native.init();
var nativeImg = native.Image();
try {
await nativeImg.loadEncoded(file.bytes);
file.width = nativeImg.width();
file.height = nativeImg.height();
} on UnsupportedError {
final dartCodec = await instantiateImageCodec(file.bytes);
final dartFrame = await dartCodec.getNextFrame();
file.width = dartFrame.image.width;
file.height = dartFrame.image.height;
final rgbaData = await dartFrame.image.toByteData();
final rgba = Uint8List.view(
rgbaData.buffer, rgbaData.offsetInBytes, rgbaData.lengthInBytes);
dartFrame.image.dispose();
dartCodec.dispose();
nativeImg.loadRGBA(file.width, file.height, rgba);
}
const max = 800;
if (file.width > max || file.height > max) {
var w = max, h = max;
if (file.width > file.height) {
h = max * file.height ~/ file.width;
} else {
w = max * file.width ~/ file.height;
}
final scaledImg = nativeImg.resample(w, h, native.Transform.lanczos);
nativeImg.free();
nativeImg = scaledImg;
}
final jpegBytes = await nativeImg.toJpeg(75);
file.blurhash = nativeImg.toBlurhash(3, 3);
thumbnail = MatrixImageFile(
bytes: jpegBytes,
name: 'thumbnail.jpg',
mimeType: 'image/jpeg',
width: nativeImg.width(),
height: nativeImg.height(),
);
nativeImg.free();
if (thumbnail.size > file.size ~/ 2) {
thumbnail = null;
}
}
} catch (e) {
// send no thumbnail
}
return sendFileEvent(
file,
txid: txid,
inReplyTo: inReplyTo,
editEventId: editEventId,
waitUntilSent: waitUntilSent ?? false,
thumbnail: thumbnail,
);
}
}

View file

@ -1,6 +1,6 @@
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'date_time_extension.dart'; import 'date_time_extension.dart';

View file

@ -0,0 +1,26 @@
import 'package:bot_toast/bot_toast.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:localstorage/localstorage.dart';
abstract class SentryController {
static LocalStorage storage = LocalStorage('LocalStorage');
static Future<void> toggleSentryAction(BuildContext context) async {
final enableSentry = await SimpleDialogs(context).askConfirmation(
titleText: L10n.of(context).sendBugReports,
contentText: L10n.of(context).sentryInfo,
confirmText: L10n.of(context).ok,
cancelText: L10n.of(context).no,
);
await storage.ready;
await storage.setItem('sentry', enableSentry);
BotToast.showText(text: L10n.of(context).changesHaveBeenSaved);
return;
}
static Future<bool> getSentryStatus() async {
await storage.ready;
return storage.getItem('sentry') as bool;
}
}

4
lib/utils/ui_fake.dart Normal file
View file

@ -0,0 +1,4 @@
// ignore: camel_case_types
class platformViewRegistry {
static void registerViewFactory(String viewId, dynamic cb) {}
}

View file

@ -5,6 +5,7 @@ import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/chat.dart'; import 'package:fluffychat/views/chat.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'matrix_identifier_string_extension.dart';
class UrlLauncher { class UrlLauncher {
final String url; final String url;
@ -12,7 +13,8 @@ class UrlLauncher {
const UrlLauncher(this.context, this.url); const UrlLauncher(this.context, this.url);
void launchUrl() { void launchUrl() {
if (url.startsWith('https://matrix.to/#/')) { if (url.startsWith('https://matrix.to/#/') ||
{'#', '@', '!', '+', '\$'}.contains(url[0])) {
return openMatrixToUrl(); return openMatrixToUrl();
} }
launch(url); launch(url);
@ -21,34 +23,111 @@ class UrlLauncher {
void openMatrixToUrl() async { void openMatrixToUrl() async {
final matrix = Matrix.of(context); final matrix = Matrix.of(context);
final identifier = url.replaceAll('https://matrix.to/#/', ''); final identifier = url.replaceAll('https://matrix.to/#/', '');
if (identifier.substring(0, 1) == '#') { if (identifier[0] == '#' || identifier[0] == '!') {
final response = await SimpleDialogs(context).tryRequestWithLoadingDialog( // sometimes we have identifiers which have an event id and additional query parameters
matrix.client.api.joinRoom( // we want to separate those.
Uri.encodeComponent(identifier), final identityParts = identifier.parseIdentifierIntoParts();
if (identityParts == null) {
return; // no match, nothing to do
}
final roomIdOrAlias = identityParts.roomIdOrAlias;
final event = identityParts.eventId;
final query = identityParts.queryString;
var room = matrix.client.getRoomByAlias(roomIdOrAlias) ??
matrix.client.getRoomById(roomIdOrAlias);
var roomId = room?.id;
// we make the servers a set and later on convert to a list, so that we can easily
// deduplicate servers added via alias lookup and query parameter
var servers = <String>{};
if (room == null && roomIdOrAlias.startsWith('#')) {
// we were unable to find the room locally...so resolve it
final response =
await SimpleDialogs(context).tryRequestWithLoadingDialog(
matrix.client.requestRoomAliasInformations(roomIdOrAlias),
);
if (response != false) {
roomId = response.roomId;
servers.addAll(response.servers);
room = matrix.client.getRoomById(roomId);
}
}
if (query != null) {
// the query information might hold additional servers to try, so let's try them!
// as there might be multiple "via" tags we can't just use Uri.splitQueryString, we need to do our own thing
for (final parameter in query.split('&')) {
final index = parameter.indexOf('=');
if (index == -1) {
continue;
}
if (Uri.decodeQueryComponent(parameter.substring(0, index)) !=
'via') {
continue;
}
servers.add(Uri.decodeQueryComponent(parameter.substring(index + 1)));
}
}
if (room != null) {
// we have the room, so....just open it!
await Navigator.pushAndRemoveUntil(
context,
AppRoute.defaultRoute(
context, ChatView(room.id, scrollToEventId: event)),
(r) => r.isFirst,
);
return;
}
if (roomIdOrAlias[0] == '!') {
roomId = roomIdOrAlias;
}
if (await SimpleDialogs(context)
.askConfirmation(titleText: 'Join room $roomIdOrAlias')) {
final response =
await SimpleDialogs(context).tryRequestWithLoadingDialog(
matrix.client.joinRoomOrAlias(
roomIdOrAlias,
servers: servers.isNotEmpty ? servers.toList() : null,
), ),
); );
if (response == false) return; if (response == false) return;
// wait for two seconds so that it probably came down /sync
await SimpleDialogs(context).tryRequestWithLoadingDialog(
Future.delayed(const Duration(seconds: 2)));
await Navigator.pushAndRemoveUntil( await Navigator.pushAndRemoveUntil(
context, context,
AppRoute.defaultRoute(context, ChatView(response['room_id'])), AppRoute.defaultRoute(
context, ChatView(response, scrollToEventId: event)),
(r) => r.isFirst, (r) => r.isFirst,
); );
} else if (identifier.substring(0, 1) == '@') { }
} else if (identifier[0] == '@') {
final user = User( final user = User(
identifier, identifier,
room: Room(id: '', client: matrix.client), room: Room(id: '', client: matrix.client),
); );
final String roomID = await SimpleDialogs(context) var roomId = matrix.client.getDirectChatFromUserId(identifier);
if (roomId != null) {
await Navigator.pushAndRemoveUntil(
context,
AppRoute.defaultRoute(context, ChatView(roomId)),
(r) => r.isFirst,
);
return;
}
if (await SimpleDialogs(context)
.askConfirmation(titleText: 'Message user $identifier')) {
roomId = await SimpleDialogs(context)
.tryRequestWithLoadingDialog(user.startDirectChat()); .tryRequestWithLoadingDialog(user.startDirectChat());
Navigator.of(context).pop(); Navigator.of(context).pop();
if (roomID != null) { if (roomId != null) {
await Navigator.pushAndRemoveUntil( await Navigator.pushAndRemoveUntil(
context, context,
AppRoute.defaultRoute(context, ChatView(roomID)), AppRoute.defaultRoute(context, ChatView(roomId)),
(r) => r.isFirst, (r) => r.isFirst,
); );
} }
} }
} }
}
} }

View file

@ -0,0 +1,21 @@
class UserStatus {
String statusMsg;
String userId;
int receivedAt;
UserStatus();
UserStatus.fromJson(Map<String, dynamic> json) {
statusMsg = json['status_msg'];
userId = json['user_id'];
receivedAt = json['received_at'];
}
Map<String, dynamic> toJson() {
final data = <String, dynamic>{};
data['status_msg'] = statusMsg;
data['user_id'] = userId;
data['received_at'] = receivedAt;
return data;
}
}

View file

@ -1,10 +1,10 @@
import 'package:fluffychat/components/adaptive_page_layout.dart'; import 'package:fluffychat/components/adaptive_page_layout.dart';
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/utils/beautify_string_extension.dart';
import 'package:fluffychat/views/chat_list.dart'; import 'package:fluffychat/views/chat_list.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:olm/olm.dart' as olm; import 'package:olm/olm.dart' as olm;
import 'package:fluffychat/utils/beautify_string_extension.dart';
class AppInfoView extends StatelessWidget { class AppInfoView extends StatelessWidget {
@override @override
@ -23,7 +23,7 @@ class AppInfo extends StatelessWidget {
var client = Matrix.of(context).client; var client = Matrix.of(context).client;
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(L10n.of(context).accountInformations), title: Text(L10n.of(context).accountInformation),
), ),
body: ListView( body: ListView(
children: <Widget>[ children: <Widget>[
@ -33,7 +33,7 @@ class AppInfo extends StatelessWidget {
), ),
ListTile( ListTile(
title: Text('Homeserver:'), title: Text('Homeserver:'),
subtitle: Text(client.api.homeserver.toString()), subtitle: Text(client.homeserver.toString()),
), ),
ListTile( ListTile(
title: Text('Device name:'), title: Text('Device name:'),

View file

@ -2,8 +2,8 @@ import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/adaptive_page_layout.dart'; import 'package:fluffychat/components/adaptive_page_layout.dart';
import 'package:fluffychat/components/list_items/chat_list_item.dart'; import 'package:fluffychat/components/list_items/chat_list_item.dart';
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
class Archive extends StatefulWidget { class Archive extends StatefulWidget {
@override @override

View file

@ -1,7 +1,7 @@
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
@ -14,7 +14,7 @@ class AuthWebView extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final url = Matrix.of(context).client.api.homeserver.toString() + final url = Matrix.of(context).client.homeserver.toString() +
'/_matrix/client/r0/auth/$authType/fallback/web?session=$session'; '/_matrix/client/r0/auth/$authType/fallback/web?session=$session';
if (kIsWeb) launch(url); if (kIsWeb) launch(url);
return Scaffold( return Scaffold(

View file

@ -3,35 +3,42 @@ import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:file_picker_platform_interface/file_picker_platform_interface.dart';
import 'package:fluffychat/components/adaptive_page_layout.dart'; import 'package:fluffychat/components/adaptive_page_layout.dart';
import 'package:fluffychat/components/avatar.dart'; import 'package:fluffychat/components/avatar.dart';
import 'package:fluffychat/components/chat_settings_popup_menu.dart'; import 'package:fluffychat/components/chat_settings_popup_menu.dart';
import 'package:fluffychat/components/connection_status_header.dart'; import 'package:fluffychat/components/connection_status_header.dart';
import 'package:fluffychat/components/dialogs/presence_dialog.dart';
import 'package:fluffychat/components/dialogs/recording_dialog.dart'; import 'package:fluffychat/components/dialogs/recording_dialog.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/components/encryption_button.dart'; import 'package:fluffychat/components/encryption_button.dart';
import 'package:fluffychat/components/list_items/message.dart'; import 'package:fluffychat/components/list_items/message.dart';
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/components/reply_content.dart'; import 'package:fluffychat/components/reply_content.dart';
import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/config/app_emojis.dart';
import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/utils/matrix_locals.dart';
import 'package:fluffychat/utils/room_status_extension.dart'; import 'package:fluffychat/utils/room_status_extension.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:image_picker/image_picker.dart';
import 'package:memoryfilepicker/memoryfilepicker.dart'; import 'package:memoryfilepicker/memoryfilepicker.dart';
import 'package:pedantic/pedantic.dart'; import 'package:pedantic/pedantic.dart';
import 'package:image_picker/image_picker.dart'; import 'package:scroll_to_index/scroll_to_index.dart';
import '../components/dialogs/send_file_dialog.dart';
import '../components/input_bar.dart';
import '../utils/matrix_file_extension.dart';
import 'chat_details.dart'; import 'chat_details.dart';
import 'chat_list.dart'; import 'chat_list.dart';
import '../components/input_bar.dart';
class ChatView extends StatelessWidget { class ChatView extends StatelessWidget {
final String id; final String id;
final String scrollToEventId;
const ChatView(this.id, {Key key}) : super(key: key); const ChatView(this.id, {Key key, this.scrollToEventId}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -41,15 +48,16 @@ class ChatView extends StatelessWidget {
firstScaffold: ChatList( firstScaffold: ChatList(
activeChat: id, activeChat: id,
), ),
secondScaffold: _Chat(id), secondScaffold: _Chat(id, scrollToEventId: scrollToEventId),
); );
} }
} }
class _Chat extends StatefulWidget { class _Chat extends StatefulWidget {
final String id; final String id;
final String scrollToEventId;
const _Chat(this.id, {Key key}) : super(key: key); const _Chat(this.id, {Key key, this.scrollToEventId}) : super(key: key);
@override @override
_ChatState createState() => _ChatState(); _ChatState createState() => _ChatState();
@ -64,7 +72,7 @@ class _ChatState extends State<_Chat> {
String seenByText = ''; String seenByText = '';
final ScrollController _scrollController = ScrollController(); final AutoScrollController _scrollController = AutoScrollController();
FocusNode inputFocus = FocusNode(); FocusNode inputFocus = FocusNode();
@ -76,6 +84,8 @@ class _ChatState extends State<_Chat> {
Event replyEvent; Event replyEvent;
Event editEvent;
bool showScrollDownButton = false; bool showScrollDownButton = false;
bool get selectMode => selectedEvents.isNotEmpty; bool get selectMode => selectedEvents.isNotEmpty;
@ -96,13 +106,14 @@ class _ChatState extends State<_Chat> {
timeline.requestHistory(historyCount: _loadHistoryCount), timeline.requestHistory(historyCount: _loadHistoryCount),
); );
if (mounted) setState(() => _loadingHistory = false); // we do NOT setState() here as then the event order will be wrong.
// instead, we just set our variable to false, and rely on timeline update to set the
// new state, thus triggering a re-render, for us
_loadingHistory = false;
} }
} }
@override void _updateScrollController() {
void initState() {
_scrollController.addListener(() async {
if (_scrollController.position.pixels == if (_scrollController.position.pixels ==
_scrollController.position.maxScrollExtent && _scrollController.position.maxScrollExtent &&
timeline.events.isNotEmpty && timeline.events.isNotEmpty &&
@ -117,7 +128,11 @@ class _ChatState extends State<_Chat> {
showScrollDownButton == true) { showScrollDownButton == true) {
setState(() => showScrollDownButton = false); setState(() => showScrollDownButton = false);
} }
}); }
@override
void initState() {
_scrollController.addListener(_updateScrollController);
super.initState(); super.initState();
} }
@ -151,12 +166,22 @@ class _ChatState extends State<_Chat> {
} }
} }
Future<bool> getTimeline() async { Future<bool> getTimeline(BuildContext context) async {
if (timeline == null) { if (timeline == null) {
timeline = await room.getTimeline(onUpdate: updateView); timeline = await room.getTimeline(onUpdate: updateView);
if (timeline.events.isNotEmpty) { if (timeline.events.isNotEmpty) {
unawaited(room.sendReadReceipt(timeline.events.first.eventId)); unawaited(room.sendReadReceipt(timeline.events.first.eventId));
} }
// when the scroll controller is attached we want to scroll to an event id, if specified
// and update the scroll controller...which will trigger a request history, if the
// "load more" button is visible on the screen
SchedulerBinding.instance.addPostFrameCallback((_) async {
if (widget.scrollToEventId != null) {
_scrollToEventId(widget.scrollToEventId, context: context);
}
_updateScrollController();
});
} }
updateView(); updateView();
return true; return true;
@ -174,51 +199,50 @@ class _ChatState extends State<_Chat> {
void send() { void send() {
if (sendController.text.isEmpty) return; if (sendController.text.isEmpty) return;
room.sendTextEvent(sendController.text, inReplyTo: replyEvent); room.sendTextEvent(sendController.text,
inReplyTo: replyEvent, editEventId: editEvent?.eventId);
sendController.text = ''; sendController.text = '';
if (replyEvent != null) {
setState(() => replyEvent = null);
}
setState(() => inputText = ''); setState(() {
inputText = '';
replyEvent = null;
editEvent = null;
});
} }
void sendFileAction(BuildContext context) async { void sendFileAction(BuildContext context) async {
var file = await MemoryFilePicker.getFile(); var file = await MemoryFilePicker.getFile();
if (file == null) return; if (file == null) return;
await SimpleDialogs(context).tryRequestWithLoadingDialog( await showDialog(
room.sendFileEvent( context: context,
MatrixFile(bytes: file.bytes, name: file.path), builder: (context) => SendFileDialog(
), file:
); MatrixFile(bytes: file.bytes, name: file.path).detectFileType,
room: room,
));
} }
void sendImageAction(BuildContext context) async { void sendImageAction(BuildContext context) async {
var file = await MemoryFilePicker.getImage( var file = await MemoryFilePicker.getFile(type: FileType.image);
source: ImageSource.gallery,
imageQuality: 50,
maxWidth: 1600,
maxHeight: 1600);
if (file == null) return; if (file == null) return;
await SimpleDialogs(context).tryRequestWithLoadingDialog( final bytes = await file.bytes;
room.sendFileEvent( await showDialog(
MatrixImageFile(bytes: await file.bytes, name: file.path), context: context,
), builder: (context) => SendFileDialog(
); file: MatrixImageFile(bytes: bytes, name: file.path),
room: room,
));
} }
void openCameraAction(BuildContext context) async { void openCameraAction(BuildContext context) async {
var file = await MemoryFilePicker.getImage( var file = await MemoryFilePicker.getImage(source: ImageSource.camera);
source: ImageSource.camera,
imageQuality: 50,
maxWidth: 1600,
maxHeight: 1600);
if (file == null) return; if (file == null) return;
await SimpleDialogs(context).tryRequestWithLoadingDialog( await showDialog(
room.sendFileEvent( context: context,
MatrixImageFile(bytes: file.bytes, name: file.path), builder: (context) => SendFileDialog(
), file: MatrixImageFile(bytes: file.bytes, name: file.path),
); room: room,
));
} }
void voiceMessageAction(BuildContext context) async { void voiceMessageAction(BuildContext context) async {
@ -230,6 +254,8 @@ class _ChatState extends State<_Chat> {
)); ));
if (result == null) return; if (result == null) return;
final audioFile = File(result); final audioFile = File(result);
// as we already explicitly say send in the recording dialog,
// we do not need the send file dialog anymore. We can just send this straight away.
await SimpleDialogs(context).tryRequestWithLoadingDialog( await SimpleDialogs(context).tryRequestWithLoadingDialog(
room.sendFileEvent( room.sendFileEvent(
MatrixAudioFile( MatrixAudioFile(
@ -241,12 +267,13 @@ class _ChatState extends State<_Chat> {
String _getSelectedEventString(BuildContext context) { String _getSelectedEventString(BuildContext context) {
var copyString = ''; var copyString = '';
if (selectedEvents.length == 1) { if (selectedEvents.length == 1) {
return selectedEvents.first.getLocalizedBody(L10n.of(context)); return selectedEvents.first
.getLocalizedBody(MatrixLocals(L10n.of(context)));
} }
for (var event in selectedEvents) { for (var event in selectedEvents) {
if (copyString.isNotEmpty) copyString += '\n\n'; if (copyString.isNotEmpty) copyString += '\n\n';
copyString += copyString += event.getLocalizedBody(MatrixLocals(L10n.of(context)),
event.getLocalizedBody(L10n.of(context), withSenderNamePrefix: true); withSenderNamePrefix: true);
} }
return copyString; return copyString;
} }
@ -289,8 +316,17 @@ class _ChatState extends State<_Chat> {
Navigator.of(context).popUntil((r) => r.isFirst); Navigator.of(context).popUntil((r) => r.isFirst);
} }
void sendAgainAction() { void sendAgainAction(Timeline timeline) {
selectedEvents.first.sendAgain(); final event = selectedEvents.first;
if (event.status == -1) {
event.sendAgain();
}
final allEditEvents = event
.aggregatedEvents(timeline, RelationshipTypes.Edit)
.where((e) => e.status == -1);
for (final e in allEditEvents) {
e.sendAgain();
}
setState(() => selectedEvents.clear()); setState(() => selectedEvents.clear());
} }
@ -302,6 +338,66 @@ class _ChatState extends State<_Chat> {
inputFocus.requestFocus(); inputFocus.requestFocus();
} }
void _scrollToEventId(String eventId, {BuildContext context}) async {
var eventIndex =
getFilteredEvents().indexWhere((e) => e.eventId == eventId);
if (eventIndex == -1) {
// event id not found...maybe we can fetch it?
// the try...finally is here to start and close the loading dialog reliably
try {
if (context != null) {
SimpleDialogs(context).showLoadingDialog(context);
}
// okay, we first have to fetch if the event is in the room
try {
final event = await timeline.getEventById(eventId);
if (event == null) {
// event is null...meaning something is off
return;
}
} catch (err) {
if (err is MatrixException && err.errcode == 'M_NOT_FOUND') {
// event wasn't found, as the server gave a 404 or something
return;
}
rethrow;
}
// okay, we know that the event *is* in the room
while (eventIndex == -1) {
if (!_canLoadMore) {
// we can't load any more events but still haven't found ours yet...better stop here
return;
}
try {
await timeline.requestHistory(historyCount: _loadHistoryCount);
} catch (err) {
if (err is TimeoutException) {
// loading the history timed out...so let's do nothing
return;
}
rethrow;
}
eventIndex =
getFilteredEvents().indexWhere((e) => e.eventId == eventId);
}
} finally {
if (context != null) {
Navigator.of(context)?.pop();
}
}
}
await _scrollController.scrollToIndex(eventIndex,
preferPosition: AutoScrollPosition.middle);
_updateScrollController();
}
List<Event> getFilteredEvents() => timeline.events
.where((e) =>
![RelationshipTypes.Edit, RelationshipTypes.Reaction]
.contains(e.relationshipType) &&
e.type != 'm.reaction')
.toList();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
matrix = Matrix.of(context); matrix = Matrix.of(context);
@ -363,25 +459,19 @@ class _ChatState extends State<_Chat> {
return ListTile( return ListTile(
leading: Avatar(room.avatar, room.displayname), leading: Avatar(room.avatar, room.displayname),
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
onTap: () => onTap: room.isDirectChat && room.directChatPresence == null
room.isDirectChat && room.directChatPresence == null
? null ? null
: room.isDirectChat : room.isDirectChat
? showDialog( ? null
context: context, : () => Navigator.of(context).push(
builder: (c) => PresenceDialog(
room.directChatPresence,
avatarUrl: room.avatar,
displayname: room.displayname,
),
)
: Navigator.of(context).push(
AppRoute.defaultRoute( AppRoute.defaultRoute(
context, context,
ChatDetails(room), ChatDetails(room),
), ),
), ),
title: Text(room.getLocalizedDisplayname(L10n.of(context)), title: Text(
room.getLocalizedDisplayname(
MatrixLocals(L10n.of(context))),
maxLines: 1), maxLines: 1),
subtitle: typingText.isEmpty subtitle: typingText.isEmpty
? Text( ? Text(
@ -411,6 +501,23 @@ class _ChatState extends State<_Chat> {
.numberSelected(selectedEvents.length.toString())), .numberSelected(selectedEvents.length.toString())),
actions: selectMode actions: selectMode
? <Widget>[ ? <Widget>[
if (selectedEvents.length == 1 &&
selectedEvents.first.status > 0 &&
selectedEvents.first.senderId == client.userID)
IconButton(
icon: Icon(Icons.edit),
onPressed: () {
setState(() {
editEvent = selectedEvents.first;
sendController.text = editEvent
.getDisplayEvent(timeline)
.getLocalizedBody(MatrixLocals(L10n.of(context)),
withSenderNamePrefix: false, hideReply: true);
selectedEvents.clear();
});
inputFocus.requestFocus();
},
),
IconButton( IconButton(
icon: Icon(Icons.content_copy), icon: Icon(Icons.content_copy),
onPressed: () => copyEventsAction(context), onPressed: () => copyEventsAction(context),
@ -450,9 +557,10 @@ class _ChatState extends State<_Chat> {
), ),
Column( Column(
children: <Widget>[ children: <Widget>[
ConnectionStatusHeader(),
Expanded( Expanded(
child: FutureBuilder<bool>( child: FutureBuilder<bool>(
future: getTimeline(), future: getTimeline(context),
builder: (BuildContext context, snapshot) { builder: (BuildContext context, snapshot) {
if (!snapshot.hasData) { if (!snapshot.hasData) {
return Center( return Center(
@ -463,11 +571,12 @@ class _ChatState extends State<_Chat> {
if (room.notificationCount != null && if (room.notificationCount != null &&
room.notificationCount > 0 && room.notificationCount > 0 &&
timeline != null && timeline != null &&
timeline.events.isNotEmpty) { timeline.events.isNotEmpty &&
Matrix.of(context).webHasFocus) {
room.sendReadReceipt(timeline.events.first.eventId); room.sendReadReceipt(timeline.events.first.eventId);
} }
if (timeline.events.isEmpty) return Container(); final filteredEvents = getFilteredEvents();
return ListView.builder( return ListView.builder(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
@ -479,10 +588,10 @@ class _ChatState extends State<_Chat> {
2), 2),
), ),
reverse: true, reverse: true,
itemCount: timeline.events.length + 2, itemCount: filteredEvents.length + 2,
controller: _scrollController, controller: _scrollController,
itemBuilder: (BuildContext context, int i) { itemBuilder: (BuildContext context, int i) {
return i == timeline.events.length + 1 return i == filteredEvents.length + 1
? _loadingHistory ? _loadingHistory
? Container( ? Container(
height: 50, height: 50,
@ -512,16 +621,28 @@ class _ChatState extends State<_Chat> {
? Duration(milliseconds: 0) ? Duration(milliseconds: 0)
: Duration(milliseconds: 500), : Duration(milliseconds: 500),
alignment: alignment:
timeline.events.first.senderId == filteredEvents.first.senderId ==
client.userID client.userID
? Alignment.topRight ? Alignment.topRight
: Alignment.topLeft, : Alignment.topLeft,
child: Container(
padding:
EdgeInsets.symmetric(horizontal: 4),
decoration: BoxDecoration(
color: Theme.of(context)
.scaffoldBackgroundColor
.withOpacity(0.8),
borderRadius:
BorderRadius.circular(4),
),
child: Text( child: Text(
seenByText, seenByText,
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
color: Theme.of(context).primaryColor, color:
Theme.of(context).primaryColor,
),
), ),
), ),
padding: EdgeInsets.only( padding: EdgeInsets.only(
@ -530,52 +651,126 @@ class _ChatState extends State<_Chat> {
bottom: 8, bottom: 8,
), ),
) )
: Message(timeline.events[i - 1], : AutoScrollTag(
key: ValueKey(i - 1),
index: i - 1,
controller: _scrollController,
child: Message(filteredEvents[i - 1],
onAvatarTab: (Event event) { onAvatarTab: (Event event) {
sendController.text += sendController.text +=
' ${event.senderId}'; ' ${event.senderId}';
}, onSelect: (Event event) { },
onSelect: (Event event) {
if (!event.redacted) { if (!event.redacted) {
if (selectedEvents.contains(event)) { if (selectedEvents
.contains(event)) {
setState( setState(
() => selectedEvents.remove(event), () => selectedEvents
.remove(event),
); );
} else { } else {
setState( setState(
() => selectedEvents.add(event), () =>
selectedEvents.add(event),
); );
} }
selectedEvents.sort( selectedEvents.sort(
(a, b) => a.originServerTs (a, b) => a.originServerTs
.compareTo(b.originServerTs), .compareTo(
b.originServerTs),
); );
} }
}, },
longPressSelect: selectedEvents.isEmpty, scrollToEventId: (String eventId) =>
_scrollToEventId(eventId,
context: context),
longPressSelect:
selectedEvents.isEmpty,
selected: selectedEvents selected: selectedEvents
.contains(timeline.events[i - 1]), .contains(filteredEvents[i - 1]),
timeline: timeline, timeline: timeline,
nextEvent: i >= 2 nextEvent: i >= 2
? timeline.events[i - 2] ? filteredEvents[i - 2]
: null); : null),
);
}); });
}, },
), ),
), ),
ConnectionStatusHeader(),
AnimatedContainer( AnimatedContainer(
duration: Duration(milliseconds: 300), duration: Duration(milliseconds: 300),
height: replyEvent != null ? 56 : 0, height: (editEvent == null &&
replyEvent == null &&
selectedEvents.length == 1)
? 56
: 0,
child: Material(
color: Theme.of(context).secondaryHeaderColor,
child: Builder(builder: (context) {
if (!(editEvent == null &&
replyEvent == null &&
selectedEvents.length == 1)) {
return Container();
}
var emojis = List<String>.from(AppEmojis.emojis);
final allReactionEvents = selectedEvents.first
.aggregatedEvents(timeline, RelationshipTypes.Reaction)
?.where((event) =>
event.senderId == event.room.client.userID &&
event.type == 'm.reaction');
allReactionEvents.forEach((event) {
try {
emojis.remove(event.content['m.relates_to']['key']);
} catch (_) {}
});
return ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: emojis.length,
itemBuilder: (c, i) => InkWell(
borderRadius: BorderRadius.circular(8),
onTap: () {
SimpleDialogs(context).tryRequestWithLoadingDialog(
room.sendReaction(
selectedEvents.first.eventId,
emojis[i],
),
);
setState(() => selectedEvents.clear());
},
child: Container(
width: 56,
height: 56,
alignment: Alignment.center,
child: Text(
emojis[i],
style: TextStyle(fontSize: 30),
),
),
),
);
}),
),
),
AnimatedContainer(
duration: Duration(milliseconds: 300),
height: editEvent != null || replyEvent != null ? 56 : 0,
child: Material( child: Material(
color: Theme.of(context).secondaryHeaderColor, color: Theme.of(context).secondaryHeaderColor,
child: Row( child: Row(
children: <Widget>[ children: <Widget>[
IconButton( IconButton(
icon: Icon(Icons.close), icon: Icon(Icons.close),
onPressed: () => setState(() => replyEvent = null), onPressed: () => setState(() {
replyEvent = null;
editEvent = null;
}),
), ),
Expanded( Expanded(
child: ReplyContent(replyEvent), child: replyEvent != null
? ReplyContent(replyEvent, timeline: timeline)
: _EditContent(
editEvent?.getDisplayEvent(timeline)),
), ),
], ],
), ),
@ -611,7 +806,10 @@ class _ChatState extends State<_Chat> {
), ),
), ),
selectedEvents.length == 1 selectedEvents.length == 1
? selectedEvents.first.status > 0 ? selectedEvents.first
.getDisplayEvent(timeline)
.status >
0
? Container( ? Container(
height: 56, height: 56,
child: FlatButton( child: FlatButton(
@ -629,7 +827,7 @@ class _ChatState extends State<_Chat> {
height: 56, height: 56,
child: FlatButton( child: FlatButton(
onPressed: () => onPressed: () =>
sendAgainAction(), sendAgainAction(timeline),
child: Row( child: Row(
children: <Widget>[ children: <Widget>[
Text(L10n.of(context) Text(L10n.of(context)
@ -804,3 +1002,38 @@ class _ChatState extends State<_Chat> {
); );
} }
} }
class _EditContent extends StatelessWidget {
final Event event;
_EditContent(this.event);
@override
Widget build(BuildContext context) {
if (event == null) {
return Container();
}
return Row(
children: <Widget>[
Icon(
Icons.edit,
color: Theme.of(context).primaryColor,
),
Container(width: 15.0),
Text(
event?.getLocalizedBody(
MatrixLocals(L10n.of(context)),
withSenderNamePrefix: false,
hideReply: true,
) ??
'',
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: TextStyle(
color: Theme.of(context).textTheme.bodyText2.color,
),
),
],
);
}
}

View file

@ -1,3 +1,4 @@
import 'package:bot_toast/bot_toast.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:famedlysdk/matrix_api.dart'; import 'package:famedlysdk/matrix_api.dart';
import 'package:fluffychat/components/adaptive_page_layout.dart'; import 'package:fluffychat/components/adaptive_page_layout.dart';
@ -5,18 +6,21 @@ import 'package:fluffychat/components/chat_settings_popup_menu.dart';
import 'package:fluffychat/components/content_banner.dart'; import 'package:fluffychat/components/content_banner.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/components/list_items/participant_list_item.dart'; import 'package:fluffychat/components/list_items/participant_list_item.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/utils/matrix_locals.dart';
import 'package:fluffychat/views/chat_list.dart'; import 'package:fluffychat/views/chat_list.dart';
import 'package:fluffychat/views/invitation_selection.dart'; import 'package:fluffychat/views/invitation_selection.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:bot_toast/bot_toast.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:link_text/link_text.dart'; import 'package:matrix_link_text/link_text.dart';
import 'package:memoryfilepicker/memoryfilepicker.dart'; import 'package:memoryfilepicker/memoryfilepicker.dart';
import './settings_emotes.dart'; import './settings_emotes.dart';
import './settings_multiple_emotes.dart';
import '../utils/url_launcher.dart';
class ChatDetails extends StatefulWidget { class ChatDetails extends StatefulWidget {
final Room room; final Room room;
@ -33,7 +37,8 @@ class _ChatDetailsState extends State<ChatDetails> {
var enterText = SimpleDialogs(context).enterText( var enterText = SimpleDialogs(context).enterText(
titleText: L10n.of(context).changeTheNameOfTheGroup, titleText: L10n.of(context).changeTheNameOfTheGroup,
labelText: L10n.of(context).changeTheNameOfTheGroup, labelText: L10n.of(context).changeTheNameOfTheGroup,
hintText: widget.room.getLocalizedDisplayname(L10n.of(context)), hintText:
widget.room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))),
); );
final displayname = await enterText; final displayname = await enterText;
if (displayname == null) return; if (displayname == null) return;
@ -63,20 +68,18 @@ class _ChatDetailsState extends State<ChatDetails> {
var newAliases = List<String>.from(aliases); var newAliases = List<String>.from(aliases);
newAliases.add(canonicalAlias); newAliases.add(canonicalAlias);
final response = await SimpleDialogs(context).tryRequestWithLoadingDialog( final response = await SimpleDialogs(context).tryRequestWithLoadingDialog(
widget.room.client.api.requestRoomAliasInformations(canonicalAlias), widget.room.client.requestRoomAliasInformations(canonicalAlias),
); );
if (response == false) { if (response == false) {
final success = final success =
await SimpleDialogs(context).tryRequestWithLoadingDialog( await SimpleDialogs(context).tryRequestWithLoadingDialog(
widget.room.client.api widget.room.client.createRoomAlias(canonicalAlias, widget.room.id),
.createRoomAlias(canonicalAlias, widget.room.id),
); );
if (success == false) return; if (success == false) return;
} }
} }
await SimpleDialogs(context).tryRequestWithLoadingDialog( await SimpleDialogs(context).tryRequestWithLoadingDialog(
widget.room.client.api widget.room.client.sendState(widget.room.id, 'm.room.canonical_alias', {
.sendState(widget.room.id, 'm.room.canonical_alias', {
'alias': '#$s:$domain', 'alias': '#$s:$domain',
}), }),
); );
@ -174,7 +177,8 @@ class _ChatDetailsState extends State<ChatDetails> {
ChatSettingsPopupMenu(widget.room, false) ChatSettingsPopupMenu(widget.room, false)
], ],
title: Text( title: Text(
widget.room.getLocalizedDisplayname(L10n.of(context)), widget.room.getLocalizedDisplayname(
MatrixLocals(L10n.of(context))),
style: TextStyle( style: TextStyle(
color: Theme.of(context) color: Theme.of(context)
.appBarTheme .appBarTheme
@ -224,6 +228,8 @@ class _ChatDetailsState extends State<ChatDetails> {
.bodyText2 .bodyText2
.color, .color,
), ),
onLinkTap: (url) =>
UrlLauncher(context, url).launchUrl(),
), ),
onTap: widget.room.canSendEvent('m.room.topic') onTap: widget.room.canSendEvent('m.room.topic')
? () => setTopicAction(context) ? () => setTopicAction(context)
@ -250,7 +256,8 @@ class _ChatDetailsState extends State<ChatDetails> {
title: Text( title: Text(
L10n.of(context).changeTheNameOfTheGroup), L10n.of(context).changeTheNameOfTheGroup),
subtitle: Text(widget.room subtitle: Text(widget.room
.getLocalizedDisplayname(L10n.of(context))), .getLocalizedDisplayname(
MatrixLocals(L10n.of(context)))),
onTap: () => setDisplaynameAction(context), onTap: () => setDisplaynameAction(context),
), ),
if (widget.room if (widget.room
@ -279,13 +286,31 @@ class _ChatDetailsState extends State<ChatDetails> {
child: Icon(Icons.insert_emoticon), child: Icon(Icons.insert_emoticon),
), ),
title: Text(L10n.of(context).emoteSettings), title: Text(L10n.of(context).emoteSettings),
onTap: () async => onTap: () async {
// okay, we need to test if there are any emote state events other than the default one
// if so, we need to be directed to a selection screen for which pack we want to look at
// otherwise, we just open the normal one.
if ((widget.room.states
.states['im.ponies.room_emotes'] ??
<String, Event>{})
.keys
.any((String s) => s.isNotEmpty)) {
await Navigator.of(context).push(
AppRoute.defaultRoute(
context,
MultipleEmotesSettingsView(
room: widget.room),
),
);
} else {
await Navigator.of(context).push( await Navigator.of(context).push(
AppRoute.defaultRoute( AppRoute.defaultRoute(
context, context,
EmotesSettingsView(room: widget.room), EmotesSettingsView(room: widget.room),
), ),
), );
}
},
), ),
PopupMenuButton( PopupMenuButton(
child: ListTile( child: ListTile(
@ -297,8 +322,8 @@ class _ChatDetailsState extends State<ChatDetails> {
title: Text(L10n.of(context) title: Text(L10n.of(context)
.whoIsAllowedToJoinThisGroup), .whoIsAllowedToJoinThisGroup),
subtitle: Text( subtitle: Text(
widget.room.joinRules widget.room.joinRules.getLocalizedString(
.getLocalizedString(L10n.of(context)), MatrixLocals(L10n.of(context))),
), ),
), ),
onSelected: (JoinRules joinRule) => onSelected: (JoinRules joinRule) =>
@ -312,13 +337,15 @@ class _ChatDetailsState extends State<ChatDetails> {
PopupMenuItem<JoinRules>( PopupMenuItem<JoinRules>(
value: JoinRules.public, value: JoinRules.public,
child: Text(JoinRules.public child: Text(JoinRules.public
.getLocalizedString(L10n.of(context))), .getLocalizedString(
MatrixLocals(L10n.of(context)))),
), ),
if (widget.room.canChangeJoinRules) if (widget.room.canChangeJoinRules)
PopupMenuItem<JoinRules>( PopupMenuItem<JoinRules>(
value: JoinRules.invite, value: JoinRules.invite,
child: Text(JoinRules.invite child: Text(JoinRules.invite
.getLocalizedString(L10n.of(context))), .getLocalizedString(
MatrixLocals(L10n.of(context)))),
), ),
], ],
), ),
@ -334,7 +361,8 @@ class _ChatDetailsState extends State<ChatDetails> {
.visibilityOfTheChatHistory), .visibilityOfTheChatHistory),
subtitle: Text( subtitle: Text(
widget.room.historyVisibility widget.room.historyVisibility
.getLocalizedString(L10n.of(context)), .getLocalizedString(
MatrixLocals(L10n.of(context))),
), ),
), ),
onSelected: onSelected:
@ -350,25 +378,29 @@ class _ChatDetailsState extends State<ChatDetails> {
PopupMenuItem<HistoryVisibility>( PopupMenuItem<HistoryVisibility>(
value: HistoryVisibility.invited, value: HistoryVisibility.invited,
child: Text(HistoryVisibility.invited child: Text(HistoryVisibility.invited
.getLocalizedString(L10n.of(context))), .getLocalizedString(
MatrixLocals(L10n.of(context)))),
), ),
if (widget.room.canChangeHistoryVisibility) if (widget.room.canChangeHistoryVisibility)
PopupMenuItem<HistoryVisibility>( PopupMenuItem<HistoryVisibility>(
value: HistoryVisibility.joined, value: HistoryVisibility.joined,
child: Text(HistoryVisibility.joined child: Text(HistoryVisibility.joined
.getLocalizedString(L10n.of(context))), .getLocalizedString(
MatrixLocals(L10n.of(context)))),
), ),
if (widget.room.canChangeHistoryVisibility) if (widget.room.canChangeHistoryVisibility)
PopupMenuItem<HistoryVisibility>( PopupMenuItem<HistoryVisibility>(
value: HistoryVisibility.shared, value: HistoryVisibility.shared,
child: Text(HistoryVisibility.shared child: Text(HistoryVisibility.shared
.getLocalizedString(L10n.of(context))), .getLocalizedString(
MatrixLocals(L10n.of(context)))),
), ),
if (widget.room.canChangeHistoryVisibility) if (widget.room.canChangeHistoryVisibility)
PopupMenuItem<HistoryVisibility>( PopupMenuItem<HistoryVisibility>(
value: HistoryVisibility.world_readable, value: HistoryVisibility.world_readable,
child: Text(HistoryVisibility.world_readable child: Text(HistoryVisibility.world_readable
.getLocalizedString(L10n.of(context))), .getLocalizedString(
MatrixLocals(L10n.of(context)))),
), ),
], ],
), ),
@ -384,8 +416,8 @@ class _ChatDetailsState extends State<ChatDetails> {
title: Text( title: Text(
L10n.of(context).areGuestsAllowedToJoin), L10n.of(context).areGuestsAllowedToJoin),
subtitle: Text( subtitle: Text(
widget.room.guestAccess widget.room.guestAccess.getLocalizedString(
.getLocalizedString(L10n.of(context)), MatrixLocals(L10n.of(context))),
), ),
), ),
onSelected: (GuestAccess guestAccess) => onSelected: (GuestAccess guestAccess) =>
@ -400,7 +432,7 @@ class _ChatDetailsState extends State<ChatDetails> {
value: GuestAccess.can_join, value: GuestAccess.can_join,
child: Text( child: Text(
GuestAccess.can_join.getLocalizedString( GuestAccess.can_join.getLocalizedString(
L10n.of(context)), MatrixLocals(L10n.of(context))),
), ),
), ),
if (widget.room.canChangeGuestAccess) if (widget.room.canChangeGuestAccess)
@ -409,7 +441,7 @@ class _ChatDetailsState extends State<ChatDetails> {
child: Text( child: Text(
GuestAccess.forbidden GuestAccess.forbidden
.getLocalizedString( .getLocalizedString(
L10n.of(context)), MatrixLocals(L10n.of(context))),
), ),
), ),
], ],

View file

@ -1,15 +1,16 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:famedlysdk/encryption.dart'; import 'package:famedlysdk/encryption.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/adaptive_page_layout.dart'; import 'package:fluffychat/components/adaptive_page_layout.dart';
import 'package:fluffychat/components/avatar.dart'; import 'package:fluffychat/components/avatar.dart';
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/utils/beautify_string_extension.dart'; import 'package:fluffychat/utils/beautify_string_extension.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/views/chat_list.dart'; import 'package:fluffychat/views/chat_list.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'key_verification.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../utils/app_route.dart';
import '../components/dialogs/simple_dialogs.dart'; import '../components/dialogs/simple_dialogs.dart';
import '../utils/app_route.dart';
import 'key_verification.dart';
class ChatEncryptionSettingsView extends StatelessWidget { class ChatEncryptionSettingsView extends StatelessWidget {
final String id; final String id;

View file

@ -3,19 +3,24 @@ import 'dart:io';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:famedlysdk/matrix_api.dart'; import 'package:famedlysdk/matrix_api.dart';
import 'package:fluffychat/components/avatar.dart';
import 'package:fluffychat/components/connection_status_header.dart'; import 'package:fluffychat/components/connection_status_header.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/components/list_items/presence_list_item.dart'; import 'package:fluffychat/components/list_items/status_list_item.dart';
import 'package:fluffychat/components/list_items/public_room_list_item.dart'; import 'package:fluffychat/components/list_items/public_room_list_item.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/views/status_view.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:receive_sharing_intent/receive_sharing_intent.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart';
import 'package:share/share.dart'; import 'package:share/share.dart';
import '../components/adaptive_page_layout.dart'; import '../components/adaptive_page_layout.dart';
import '../components/list_items/chat_list_item.dart'; import '../components/list_items/chat_list_item.dart';
import '../components/matrix.dart'; import '../components/matrix.dart';
import '../l10n/l10n.dart';
import '../utils/app_route.dart'; import '../utils/app_route.dart';
import '../utils/matrix_file_extension.dart';
import '../utils/url_launcher.dart'; import '../utils/url_launcher.dart';
import 'archive.dart'; import 'archive.dart';
import 'homeserver_picker.dart'; import 'homeserver_picker.dart';
@ -23,7 +28,7 @@ import 'new_group.dart';
import 'new_private_chat.dart'; import 'new_private_chat.dart';
import 'settings.dart'; import 'settings.dart';
enum SelectMode { normal, share } enum SelectMode { normal, share, select }
class ChatListView extends StatelessWidget { class ChatListView extends StatelessWidget {
@override @override
@ -57,9 +62,15 @@ class _ChatListState extends State<ChatList> {
PublicRoomsResponse publicRoomsResponse; PublicRoomsResponse publicRoomsResponse;
bool loadingPublicRooms = false; bool loadingPublicRooms = false;
String searchServer; String searchServer;
final _selectedRoomIds = <String>{};
final ScrollController _scrollController = ScrollController(); final ScrollController _scrollController = ScrollController();
void _toggleSelection(String roomId) =>
setState(() => _selectedRoomIds.contains(roomId)
? _selectedRoomIds.remove(roomId)
: _selectedRoomIds.add(roomId));
Future<void> waitForFirstSync(BuildContext context) async { Future<void> waitForFirstSync(BuildContext context) async {
var client = Matrix.of(context).client; var client = Matrix.of(context).client;
if (client.prevBatch?.isEmpty ?? true) { if (client.prevBatch?.isEmpty ?? true) {
@ -92,7 +103,7 @@ class _ChatListState extends State<ChatList> {
setState(() => loadingPublicRooms = true); setState(() => loadingPublicRooms = true);
final newPublicRoomsResponse = final newPublicRoomsResponse =
await SimpleDialogs(context).tryRequestWithErrorToast( await SimpleDialogs(context).tryRequestWithErrorToast(
Matrix.of(context).client.api.searchPublicRooms( Matrix.of(context).client.searchPublicRooms(
limit: 30, limit: 30,
includeAllNetworks: true, includeAllNetworks: true,
genericSearchTerm: searchController.text, genericSearchTerm: searchController.text,
@ -119,7 +130,7 @@ class _ChatListState extends State<ChatList> {
}); });
setState(() => null); setState(() => null);
}); });
_initReceiveSharingINtent(); _initReceiveSharingIntent();
super.initState(); super.initState();
} }
@ -139,7 +150,7 @@ class _ChatListState extends State<ChatList> {
'file': MatrixFile( 'file': MatrixFile(
bytes: file.readAsBytesSync(), bytes: file.readAsBytesSync(),
name: file.path, name: file.path,
), ).detectFileType,
}; };
} }
@ -158,8 +169,8 @@ class _ChatListState extends State<ChatList> {
}; };
} }
void _initReceiveSharingINtent() { void _initReceiveSharingIntent() {
if (kIsWeb) return; if (!PlatformInfos.isMobile) return;
// For sharing images coming from outside the app while the app is in the memory // For sharing images coming from outside the app while the app is in the memory
_intentFileStreamSubscription = ReceiveSharingIntent.getMediaStream() _intentFileStreamSubscription = ReceiveSharingIntent.getMediaStream()
@ -187,21 +198,31 @@ class _ChatListState extends State<ChatList> {
); );
} }
void _setStatus(BuildContext context) async { void _setStatus(BuildContext context, {bool fromDrawer = false}) async {
Navigator.of(context).pop(); if (fromDrawer) Navigator.of(context).pop();
final status = await SimpleDialogs(context).enterText( final ownProfile = await SimpleDialogs(context)
multiLine: true, .tryRequestWithLoadingDialog(Matrix.of(context).client.ownProfile);
titleText: L10n.of(context).setStatus, String composeText;
labelText: L10n.of(context).setStatus, if (Matrix.of(context).shareContent != null &&
hintText: L10n.of(context).statusExampleMessage, Matrix.of(context).shareContent['msgtype'] == 'm.text') {
); composeText = Matrix.of(context).shareContent['body'];
if (status?.isEmpty ?? true) return; Matrix.of(context).shareContent = null;
await SimpleDialogs(context).tryRequestWithLoadingDialog( }
Matrix.of(context).client.api.sendPresence( if (ownProfile is Profile) {
Matrix.of(context).client.userID, PresenceType.online, await Navigator.of(context).push(
statusMsg: status), MaterialPageRoute(
builder: (_) => StatusView(
composeMode: true,
avatarUrl: ownProfile.avatarUrl,
displayname: ownProfile.displayname ??
Matrix.of(context).client.userID.localpart,
composeText: composeText,
),
),
); );
} }
return;
}
@override @override
void dispose() { void dispose() {
@ -213,6 +234,39 @@ class _ChatListState extends State<ChatList> {
super.dispose(); super.dispose();
} }
Future<void> _toggleFavouriteRoom(BuildContext context) {
final room = Matrix.of(context).client.getRoomById(_selectedRoomIds.single);
return SimpleDialogs(context).tryRequestWithLoadingDialog(
room.setFavourite(!room.isFavourite),
);
}
Future<void> _toggleMuted(BuildContext context) {
final room = Matrix.of(context).client.getRoomById(_selectedRoomIds.single);
return SimpleDialogs(context).tryRequestWithLoadingDialog(
room.setPushRuleState(room.pushRuleState == PushRuleState.notify
? PushRuleState.mentions_only
: PushRuleState.notify),
);
}
Future<void> _archiveAction(BuildContext context) async {
final confirmed = await SimpleDialogs(context).askConfirmation();
if (!confirmed) return;
await SimpleDialogs(context)
.tryRequestWithLoadingDialog(_archiveSelectedRooms(context));
setState(() => null);
}
Future<void> _archiveSelectedRooms(BuildContext context) async {
final client = Matrix.of(context).client;
while (_selectedRoomIds.isNotEmpty) {
final roomId = _selectedRoomIds.first;
await client.getRoomById(roomId).leave();
_selectedRoomIds.remove(roomId);
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StreamBuilder<LoginState>( return StreamBuilder<LoginState>(
@ -230,10 +284,15 @@ class _ChatListState extends State<ChatList> {
stream: Matrix.of(context).onShareContentChanged.stream, stream: Matrix.of(context).onShareContentChanged.stream,
builder: (context, snapshot) { builder: (context, snapshot) {
final selectMode = Matrix.of(context).shareContent == null final selectMode = Matrix.of(context).shareContent == null
? _selectedRoomIds.isEmpty
? SelectMode.normal ? SelectMode.normal
: SelectMode.select
: SelectMode.share; : SelectMode.share;
if (selectMode == SelectMode.share) {
_selectedRoomIds.clear();
}
return Scaffold( return Scaffold(
drawer: selectMode == SelectMode.share drawer: selectMode != SelectMode.normal
? null ? null
: Drawer( : Drawer(
child: SafeArea( child: SafeArea(
@ -243,7 +302,8 @@ class _ChatListState extends State<ChatList> {
ListTile( ListTile(
leading: Icon(Icons.edit), leading: Icon(Icons.edit),
title: Text(L10n.of(context).setStatus), title: Text(L10n.of(context).setStatus),
onTap: () => _setStatus(context), onTap: () =>
_setStatus(context, fromDrawer: true),
), ),
Divider(height: 1), Divider(height: 1),
ListTile( ListTile(
@ -288,27 +348,63 @@ class _ChatListState extends State<ChatList> {
), ),
), ),
appBar: AppBar( appBar: AppBar(
//elevation: _scrolledToTop ? 0 : null, centerTitle: false,
leading: selectMode != SelectMode.share elevation: _scrolledToTop ? 0 : null,
? null leading: selectMode == SelectMode.share
: IconButton( ? IconButton(
icon: Icon(Icons.close), icon: Icon(Icons.close),
onPressed: () => onPressed: () =>
Matrix.of(context).shareContent = null, Matrix.of(context).shareContent = null,
), )
: selectMode == SelectMode.select
? IconButton(
icon: Icon(Icons.close),
onPressed: () =>
setState(_selectedRoomIds.clear),
)
: null,
titleSpacing: 0, titleSpacing: 0,
actions: selectMode != SelectMode.select
? null
: [
if (_selectedRoomIds.length == 1)
IconButton(
icon: Icon(Icons.favorite_border_outlined),
onPressed: () => _toggleFavouriteRoom(context),
),
if (_selectedRoomIds.length == 1)
IconButton(
icon: Icon(Icons.notifications_none),
onPressed: () => _toggleMuted(context),
),
IconButton(
icon: Icon(Icons.archive),
onPressed: () => _archiveAction(context),
),
],
title: selectMode == SelectMode.share title: selectMode == SelectMode.share
? Text(L10n.of(context).share) ? Text(L10n.of(context).share)
: Padding( : selectMode == SelectMode.select
padding: ? Text(_selectedRoomIds.length.toString())
EdgeInsets.only(top: 8, bottom: 8, right: 8), : Container(
height: 40,
padding: EdgeInsets.only(right: 8),
child: Material(
color: Theme.of(context).secondaryHeaderColor,
borderRadius: BorderRadius.circular(32),
child: TextField( child: TextField(
autocorrect: false, autocorrect: false,
controller: searchController, controller: searchController,
focusNode: _searchFocusNode, focusNode: _searchFocusNode,
decoration: InputDecoration( decoration: InputDecoration(
contentPadding: EdgeInsets.all(9), contentPadding: EdgeInsets.only(
border: InputBorder.none, top: 8,
bottom: 8,
left: 16,
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(32),
),
hintText: L10n.of(context).searchForAChat, hintText: L10n.of(context).searchForAChat,
suffixIcon: searchMode suffixIcon: searchMode
? IconButton( ? IconButton(
@ -323,21 +419,49 @@ class _ChatListState extends State<ChatList> {
), ),
), ),
), ),
),
floatingActionButton: floatingActionButton:
(AdaptivePageLayout.columnMode(context) || (AdaptivePageLayout.columnMode(context) ||
selectMode == SelectMode.share) selectMode != SelectMode.normal)
? null ? null
: FloatingActionButton( : Column(
mainAxisSize: MainAxisSize.min,
children: [
FloatingActionButton(
heroTag: null,
child: Icon(
Icons.edit,
color: Theme.of(context).primaryColor,
),
elevation: 1,
backgroundColor:
Theme.of(context).secondaryHeaderColor,
onPressed: () => _setStatus(context),
),
SizedBox(height: 16.0),
FloatingActionButton(
child: Icon(Icons.add), child: Icon(Icons.add),
backgroundColor: Theme.of(context).primaryColor, backgroundColor:
Theme.of(context).primaryColor,
onPressed: () => Navigator.of(context) onPressed: () => Navigator.of(context)
.pushAndRemoveUntil( .pushAndRemoveUntil(
AppRoute.defaultRoute( AppRoute.defaultRoute(
context, NewPrivateChatView()), context, NewPrivateChatView()),
(r) => r.isFirst), (r) => r.isFirst),
), ),
body: StreamBuilder( ],
stream: Matrix.of(context).client.onSync.stream, ),
body: Column(
children: [
ConnectionStatusHeader(),
Expanded(
child: StreamBuilder(
stream: Matrix.of(context)
.client
.onSync
.stream
.where((s) =>
s.hasRoomUpdate || s.hasPresenceUpdate),
builder: (context, snapshot) { builder: (context, snapshot) {
return FutureBuilder<void>( return FutureBuilder<void>(
future: waitForFirstSync(context), future: waitForFirstSync(context),
@ -348,8 +472,10 @@ class _ChatListState extends State<ChatList> {
rooms.removeWhere((Room room) => rooms.removeWhere((Room room) =>
room.lastEvent == null || room.lastEvent == null ||
(searchMode && (searchMode &&
!room.displayname.toLowerCase().contains( !room.displayname
searchController.text.toLowerCase() ?? .toLowerCase()
.contains(searchController.text
.toLowerCase() ??
''))); '')));
if (rooms.isEmpty && if (rooms.isEmpty &&
(!searchMode || (!searchMode ||
@ -374,21 +500,10 @@ class _ChatListState extends State<ChatList> {
); );
} }
final publicRoomsCount = final publicRoomsCount =
(publicRoomsResponse?.chunk?.length ?? 0); (publicRoomsResponse?.chunk?.length ??
0);
final totalCount = final totalCount =
rooms.length + publicRoomsCount; rooms.length + publicRoomsCount;
final directChats =
rooms.where((r) => r.isDirectChat).toList();
final presences =
Matrix.of(context).client.presences;
directChats.sort((a, b) =>
presences[b.directChatMatrixID]
?.presence
?.statusMsg !=
null
? 1
: b.lastEvent.originServerTs.compareTo(
a.lastEvent.originServerTs));
return ListView.separated( return ListView.separated(
controller: _scrollController, controller: _scrollController,
separatorBuilder: (BuildContext context, separatorBuilder: (BuildContext context,
@ -396,10 +511,12 @@ class _ChatListState extends State<ChatList> {
i == totalCount - publicRoomsCount i == totalCount - publicRoomsCount
? ListTile( ? ListTile(
title: Text( title: Text(
L10n.of(context).publicRooms + L10n.of(context)
.publicRooms +
':', ':',
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.bold, fontWeight:
FontWeight.bold,
color: Theme.of(context) color: Theme.of(context)
.primaryColor, .primaryColor,
), ),
@ -407,33 +524,73 @@ class _ChatListState extends State<ChatList> {
) )
: Container(), : Container(),
itemCount: totalCount + 1, itemCount: totalCount + 1,
itemBuilder: (BuildContext context, int i) { itemBuilder:
(BuildContext context, int i) {
if (i == 0) { if (i == 0) {
final displayPresences =
Matrix.of(context)
.userStatuses
.isNotEmpty &&
selectMode ==
SelectMode.normal;
final displayShareStatus =
selectMode ==
SelectMode.share &&
Matrix.of(context)
.shareContent[
'msgtype'] ==
'm.text';
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
ConnectionStatusHeader(), AnimatedContainer(
(directChats.isEmpty || duration: Duration(
selectMode == milliseconds: 500),
SelectMode.share) height: displayPresences
? Container() ? 78
: PreferredSize( : displayShareStatus
preferredSize: ? 56
Size.fromHeight(90), : 0,
child: Container( child: displayPresences
height: 82, ? ListView.builder(
child: ListView.builder(
scrollDirection: scrollDirection:
Axis.horizontal, Axis.horizontal,
itemCount: itemCount:
directChats.length, Matrix.of(context)
.userStatuses
.length,
itemBuilder: (BuildContext itemBuilder: (BuildContext
context, context,
int i) => int i) =>
PresenceListItem( StatusListItem(Matrix
directChats[i]), .of(context)
.userStatuses[i]),
)
: displayShareStatus
? ListTile(
leading:
CircleAvatar(
radius: Avatar
.defaultSize /
2,
backgroundColor:
Theme.of(
context)
.secondaryHeaderColor,
child: Icon(
Icons.edit,
color: Theme.of(
context)
.primaryColor,
), ),
), ),
title: Text(L10n.of(
context)
.setStatus),
onTap: () =>
_setStatus(
context))
: null,
), ),
], ],
); );
@ -442,10 +599,24 @@ class _ChatListState extends State<ChatList> {
return i < rooms.length return i < rooms.length
? ChatListItem( ? ChatListItem(
rooms[i], rooms[i],
activeChat: widget.activeChat == selected: _selectedRoomIds
.contains(rooms[i].id),
onTap: selectMode ==
SelectMode.select
? () => _toggleSelection(
rooms[i].id)
: null,
onLongPress: selectMode !=
SelectMode.share
? () => _toggleSelection(
rooms[i].id)
: null,
activeChat:
widget.activeChat ==
rooms[i].id, rooms[i].id,
) )
: PublicRoomListItem(publicRoomsResponse : PublicRoomListItem(
publicRoomsResponse
.chunk[i - rooms.length]); .chunk[i - rooms.length]);
}); });
} else { } else {
@ -456,6 +627,9 @@ class _ChatListState extends State<ChatList> {
}, },
); );
}), }),
),
],
),
); );
}); });
}); });

View file

@ -3,11 +3,13 @@ import 'dart:math';
import 'package:famedlysdk/matrix_api/model/well_known_informations.dart'; import 'package:famedlysdk/matrix_api/model/well_known_informations.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/config/app_config.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:fluffychat/utils/app_route.dart'; import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/views/login.dart'; import 'package:fluffychat/views/login.dart';
import 'package:fluffychat/views/sign_up.dart'; import 'package:fluffychat/views/sign_up.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
class HomeserverPicker extends StatefulWidget { class HomeserverPicker extends StatefulWidget {
@override @override
@ -18,7 +20,7 @@ class _HomeserverPickerState extends State<HomeserverPicker> {
Future<void> _setHomeserverAction(BuildContext context) async { Future<void> _setHomeserverAction(BuildContext context) async {
final homeserver = await SimpleDialogs(context).enterText( final homeserver = await SimpleDialogs(context).enterText(
titleText: L10n.of(context).enterYourHomeserver, titleText: L10n.of(context).enterYourHomeserver,
hintText: Matrix.defaultHomeserver, hintText: AppConfig.defaultHomeserver,
prefixText: 'https://', prefixText: 'https://',
keyboardType: TextInputType.url); keyboardType: TextInputType.url);
if (homeserver?.isEmpty ?? true) return; if (homeserver?.isEmpty ?? true) return;

View file

@ -2,7 +2,7 @@ import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/image_bubble.dart'; import 'package:fluffychat/components/image_bubble.dart';
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_advanced_networkimage/zoomable.dart'; import 'package:photo_view/photo_view.dart';
import '../utils/event_extension.dart'; import '../utils/event_extension.dart';
class ImageView extends StatelessWidget { class ImageView extends StatelessWidget {
@ -36,12 +36,12 @@ class ImageView extends StatelessWidget {
), ),
IconButton( IconButton(
icon: Icon(Icons.file_download), icon: Icon(Icons.file_download),
onPressed: () => event.openFile(context), onPressed: () => event.openFile(context, downloadOnly: true),
color: Colors.white, color: Colors.white,
), ),
], ],
), ),
body: ZoomableWidget( body: PhotoView.customChild(
minScale: 1.0, minScale: 1.0,
maxScale: 10.0, maxScale: 10.0,
child: ImageBubble( child: ImageBubble(
@ -51,6 +51,7 @@ class ImageView extends StatelessWidget {
backgroundColor: Colors.black, backgroundColor: Colors.black,
maxSize: false, maxSize: false,
radius: 0.0, radius: 0.0,
thumbnailOnly: false,
), ),
), ),
); );

View file

@ -1,14 +1,14 @@
import 'dart:async'; import 'dart:async';
import 'package:bot_toast/bot_toast.dart';
import 'package:famedlysdk/famedlysdk.dart'; import 'package:famedlysdk/famedlysdk.dart';
import 'package:famedlysdk/matrix_api.dart'; import 'package:famedlysdk/matrix_api.dart';
import 'package:fluffychat/components/adaptive_page_layout.dart'; import 'package:fluffychat/components/adaptive_page_layout.dart';
import 'package:fluffychat/components/avatar.dart'; import 'package:fluffychat/components/avatar.dart';
import 'package:fluffychat/components/dialogs/simple_dialogs.dart'; import 'package:fluffychat/components/dialogs/simple_dialogs.dart';
import 'package:fluffychat/components/matrix.dart'; import 'package:fluffychat/components/matrix.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:bot_toast/bot_toast.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'chat_list.dart'; import 'chat_list.dart';
@ -85,7 +85,7 @@ class _InvitationSelectionState extends State<InvitationSelection> {
setState(() => loading = true); setState(() => loading = true);
final matrix = Matrix.of(context); final matrix = Matrix.of(context);
final response = await SimpleDialogs(context).tryRequestWithErrorToast( final response = await SimpleDialogs(context).tryRequestWithErrorToast(
matrix.client.api.searchUser(text, limit: 10), matrix.client.searchUser(text, limit: 10),
); );
setState(() => loading = false); setState(() => loading = false);
if (response == false || (response?.results == null)) return; if (response == false || (response?.results == null)) return;
@ -98,11 +98,13 @@ class _InvitationSelectionState extends State<InvitationSelection> {
Profile.fromJson({'user_id': '@$text'}), Profile.fromJson({'user_id': '@$text'}),
]); ]);
} }
foundProfiles.removeWhere((profile) => final participants = widget.room
widget.room
.getParticipants() .getParticipants()
.indexWhere((u) => u.id == profile.userId) != .where((user) =>
-1); [Membership.join, Membership.invite].contains(user.membership))
.toList();
foundProfiles.removeWhere((profile) =>
participants.indexWhere((u) => u.id == profile.userId) != -1);
}); });
} }

View file

@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
import 'package:famedlysdk/encryption.dart'; import 'package:famedlysdk/encryption.dart';
import 'package:famedlysdk/matrix_api.dart'; import 'package:famedlysdk/matrix_api.dart';
import 'chat_list.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../components/adaptive_page_layout.dart'; import '../components/adaptive_page_layout.dart';
import '../components/avatar.dart'; import '../components/avatar.dart';
import '../components/dialogs/simple_dialogs.dart'; import '../components/dialogs/simple_dialogs.dart';
import '../l10n/l10n.dart'; import 'chat_list.dart';
class KeyVerificationView extends StatelessWidget { class KeyVerificationView extends StatelessWidget {
final KeyVerification request; final KeyVerification request;

Some files were not shown because too many files have changed in this diff Show more