Merge pull request #342 from pangeachat/new-merge

New merge
This commit is contained in:
ggurdin 2024-06-21 10:17:56 -04:00 committed by GitHub
commit 2f905f86b7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
182 changed files with 61628 additions and 53465 deletions

3
.github/CODEOWNERS vendored
View file

@ -1 +1,2 @@
* @krille-chan
* @krille-chan
assets/l10n/*.arb @weblate

View file

@ -0,0 +1,21 @@
*Thank you so much for your contribution to FluffyChat ❤️❤️❤️*
Please make sure that your Pull Request meet the following **acceptance criteria**:
- [ ] Code formatting and import sorting has been done with `dart format lib/ test/` and `dart run import_sorter:main --no-comments`
- [ ] The commit message uses the format of [Conventional Commits](https://www.conventionalcommits.org)
- [ ] The commit message describes what has been changed, why it has been changed and how it has been changed
- [ ] Every new feature or change of the design/GUI is linked to an approved design proposal in an issue
- [ ] Every new feature in the app or the build system has a strategy how this will be tested and maintained from now on for every release, e.g. a volunteer who takes over maintainership
### Pull Request has been tested on:
- [ ] Android
- [ ] iOS
- [ ] Browser (Chromium based)
- [ ] Browser (Firefox based)
- [ ] Browser (WebKit based)
- [ ] Desktop Linux
- [ ] Desktop Windows
- [ ] Desktop macOS

View file

@ -15,6 +15,7 @@ jobs:
flutter-version: ${{ env.FLUTTER_VERSION }}
cache: true
- run: flutter pub get
- run: flutter gen-l10n
- name: Check formatting
run: dart format lib/ test/ --set-exit-if-changed
- name: Check import formatting

View file

@ -51,7 +51,7 @@ jobs:
echo "$WEB_APP_ENV" >> public/.env
cp public/.env public/assets/.env
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
uses: peaceiris/actions-gh-pages@v4
with:
personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }}
publish_dir: ./public

View file

@ -103,7 +103,7 @@ jobs:
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
- uses: subosito/flutter-action@v2
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
flutter-version: 3.19.6 # Workaround for not working on 3.22
cache: true
- name: Install dependencies
run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libssl-dev -y

View file

@ -1,2 +1,2 @@
FLUTTER_VERSION=3.19.5
FLUTTER_VERSION=3.22.2
JAVA_VERSION=17

View file

@ -1,3 +1,128 @@
## v1.21.1
- build: Update Matrix Dart SDK (Krille)
- build: Update to Flutter 3.22.2 (krille-chan)
- feat: add option to configure reply swipe direction (MrSpoony)
- fix: Add missing unlock button to lockscreen textfield (Krille)
- fix: Auto unlock lock screen (krille-chan)
- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山)
- Translated using Weblate (Estonian) (Priit Jõerüüt)
- Translated using Weblate (Estonian) (Rauno Ots)
- Translated using Weblate (Galician) (josé m)
- Translated using Weblate (Turkish) (Oğuz Ersen)
- Translated using Weblate (Vietnamese) (Karo)
## v1.21.0
FluffyChat v1.21.0 introduces the new search feature which also includes a gallery and files list for each chat. Several performance improvements have been added under the hood, leading to a much nicer user experience.
- feat: Enable download images on iOS, not only share images (krille-chan)
- feat: Search feature (krille-chan)
- build: Update record package (krille-chan)
- build: Use correct pubspec.yaml format for hosted dependency (krille-chan)
- build: Use matrix sdk main branch (krille-chan)
- chore: Change default timeout to 30 min (krille-chan)
- chore: Go back to pub.dev matrix sdk (Krille)
- chore: Hotfix create missing objectbox (Krille)
- chore: Increase default network request timeout (Krille)
- chore: Make bottomnavbar labels always visible (krille-chan)
- chore: Nicer message animation (krille-chan)
- chore: Only load last event sender if necessary (Krille)
- chore: Set a maxsize for textfields (Krille)
- chore: upgrade flutter to 3.22.0 (lauren n. liberda)
- chore: upgrade flutter to 3.22.1 (lauren n. liberda)
- ci: run `flutter gen-l10n` on code_tests (lauren n. liberda)
- design: Improve design of Voice Messages and add 1.25 as speed (Krille)
- fastlane: i18n ru (Yurt Page)
- fastlane: improve full_description.txt (Yurt Page)
- fix: Broken localization with empty strings in it (krille-chan)
- fix: FakeMatrixApi check (krille-chan)
- fix: mxc reactions not rendered correctly (krille-chan)
- fix: Stickers from gboard have black background (Krille)
- fix: voip code breaking from 0.28 (td)
- refactor: Delete database file on failed app start (krille-chan)
- refactor: Display better command hints (Krille)
- refactor: Improve performance of chat list (krille-chan)
- refactor: Precache theme and directchatmatrixid to improve performance in chat list item (krille-chan)
- refactor: Update to Matrix Dart SDK 0.29.9 (Krille)
- Translated using Weblate (Croatian) (Milo Ivir)
- Translated using Weblate (Czech) (Jozef Mlich)
- Translated using Weblate (Georgian) (Nicholas Winterhalter)
- Translated using Weblate (German) (Gian Klug)
- Translated using Weblate (Korean) (kdh8219)
- Translated using Weblate (Latvian) (Edgars Andersons)
- Translated using Weblate (Norwegian Bokmål) (sunniva)
- Translated using Weblate (Turkish) (Oğuz Ersen)
## v1.20.0
Design improvements and new advanced UI to manage rooms.
- build: Fix google services patch (Krille)
- build: Update matrix dart sdk (krille-chan)
- build: Update to Flutter 3.19.6 (krille-chan)
- chore: Let error reporter fill out bug report (krille-chan)
- chore: More nicer event source display (krille-chan)
- chore: Update user has knocked localization with emoji (krille-chan)
- design: Adjust chat settings design (krille-chan)
- design: Adjust settings design (krille-chan)
- design: Fix color of invite button (krille-chan)
- design: Follow up chat settings design (krille-chan)
- design: Follow up settings design (krille-chan)
- design: Improve user permission settings (krille-chan)
- design: New chat access settings (krille-chan)
- design: Redesign permissions settings with dropdownbuttons (krille-chan)
- design: Remake UX of selecting messages and chats (krille-chan)
- refactor: Download on android and iOS with file_picker (krille-chan)
- Translated using Weblate (Arabic) (Rex_sa)
- Translated using Weblate (Basque) (xabirequejo)
- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山)
- Translated using Weblate (Dutch) (Anonymous)
- Translated using Weblate (Estonian) (Priit Jõerüüt)
- Translated using Weblate (Filipino) (searinminecraft)
- Translated using Weblate (Finnish) (Anonymous)
- Translated using Weblate (Galician) (josé m)
- Translated using Weblate (German) (Christian)
- Translated using Weblate (Hungarian) (Máté Menyhárt)
- Translated using Weblate (Indonesian) (Linerly)
- Translated using Weblate (Latvian) (Edgars Andersons)
- Translated using Weblate (Portuguese (Brazil)) (lucasmz)
- Translated using Weblate (Portuguese (Brazil)) (Rudah Ximenes Alvarenga)
## v1.19.2
Bugfix release to mostly fix the new database encryption on Linux and update the translations.
- build: (deps): bump peaceiris/actions-gh-pages from 3 to 4 (dependabot[bot])
- build: Update all dependencies and remove vibrator package (krille-chan)
- build: Update emoji picker package (krille-chan)
- build: Update flutter_map package (krille-chan)
- docs: Fix typo in android app description (Krille)
- fix: Allow unencrypted database if gnome keyring not present or platform does not support it (krille-chan)
- fix: Background color of images with transparency (Krille)
- fix: Localizations from weblate confused by unknownEvent locale (Krille)
- fix: More logs when database fails to init and trycatch sendInitNotification (Krille)
- Added translation using Weblate (Filipino) (searinminecraft)
- Translated using Weblate (Arabic) (Rex_sa)
- Translated using Weblate (Basque) (xabirequejo)
- Translated using Weblate (Catalan) (fadelkon)
- Translated using Weblate (Chinese (Simplified)) (大王叫我来巡山)
- Translated using Weblate (Chinese (Traditional)) (D0735)
- Translated using Weblate (Chinese (Traditional)) (Kyanos Chiu)
- Translated using Weblate (Croatian) (v1s7)
- Translated using Weblate (English) (v1s7)
- Translated using Weblate (Estonian) (Priit Jõerüüt)
- Translated using Weblate (Estonian) (Priit Jõerüüt)
- Translated using Weblate (Filipino) (searinminecraft)
- Translated using Weblate (Galician) (josé m)
- Translated using Weblate (Indonesian) (Linerly)
- Translated using Weblate (Interlingua) (kdh8219)
- Translated using Weblate (Italian) (Krystian)
- Translated using Weblate (Korean) (kdh8219)
- Translated using Weblate (Persian) (EndermanXD)
- Translated using Weblate (Polish) (Adam Strączek)
- Translated using Weblate (Polish) (Krystian)
- Translated using Weblate (Russian) (v1s7)
- Translated using Weblate (Swedish) (Joaquim Homrighausen)
- Translated using Weblate (Turkish) (v1s7)
- Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
## v1.19.1
Minor bugfix release for login with SSO on web.

View file

@ -1,4 +1,4 @@
FluffyChat is an open, nonprofit and cute matrix messenger app for Ubuntu Touch, Android and iOS.
FluffyChat is an open, nonprofit and cute Matrix messenger app for Ubuntu Touch, Android and iOS.
Open
Opensource and open development where everyone can join.
@ -9,7 +9,7 @@ FluffyChat is donation funded.
Cute ♥
Cute design and many theme settings including a dark mode.
One-to-one and groupchats
One-to-one and group chats
Unlimited groups and direct chats.
Easy
@ -22,11 +22,11 @@ Decentralized
There is no "FluffyChat server" you are forced to use. Use the server you find trustworthy or host your own.
Compatible
Compatible with Element, Fractal, Nekho and all matrix messengers.
Compatible with Element, Fractal, Nheko and all Matrix messengers.
FluffyChat comes with a dream
Imagine a world where everyone can choose the messenger they like and is still able to chat with all of their friends.
A world where there are no companies spying on you when you send selfies to friends and lovers.
A world where there are no companies spying on you when you send selfies to friends and your loved.
And a world where apps are made for fluffyness and not for profit. ♥

View file

@ -305,7 +305,7 @@
"type": "text",
"placeholders": {}
},
"createdTheChat": "💬 أنشأ {username} الدردشة",
"createdTheChat": "💬 أنشأ {username} المحادثة",
"@createdTheChat": {
"type": "text",
"placeholders": {
@ -1113,7 +1113,7 @@
"username": {}
}
},
"userLeftTheChat": "🚪 {username} غادر الدردشة",
"userLeftTheChat": "🚪 {username} غادر المحادثة",
"@userLeftTheChat": {
"type": "text",
"placeholders": {
@ -1762,7 +1762,7 @@
"type": "text",
"placeholders": {}
},
"wipeChatBackup": "مسح نسخة الدردشة الاحتياطية لإنشاء مفتاح استرداد جديد؟",
"wipeChatBackup": "مسح نسخة المحادثة الاحتياطية لإنشاء مفتاح استرداد جديد؟",
"@wipeChatBackup": {
"type": "text",
"placeholders": {}
@ -2112,7 +2112,7 @@
"@errorAddingWidget": {},
"youRejectedTheInvitation": "لقد رفضت الدعوة",
"@youRejectedTheInvitation": {},
"youJoinedTheChat": "لقد انضممت إلى الدردشة",
"youJoinedTheChat": "لقد انضممت إلى المحادثة",
"@youJoinedTheChat": {},
"youAcceptedTheInvitation": "👍 لقد قبلت الدعوة",
"@youAcceptedTheInvitation": {},
@ -2166,7 +2166,7 @@
"@nextAccount": {},
"previousAccount": "الحساب السابق",
"@previousAccount": {},
"encryptThisChat": "تشفير هذه الدردشة",
"encryptThisChat": "تشفير هذه المحادثة",
"@encryptThisChat": {},
"screenSharingDetail": "أنت تشارك شاشتك في FuffyChat",
"@screenSharingDetail": {},
@ -2196,7 +2196,7 @@
"senderName": {}
}
},
"hydrateTorLong": "هل قمت بتصدير جلستك الأخيرة على تور؟ قم باستيراده بسرعة واستمر في الدردشة.",
"hydrateTorLong": "هل قمت بتصدير جلستك الأخيرة على تور؟ قم باستيرادها بسرعة واستمر في المحادثة.",
"@hydrateTorLong": {},
"widgetUrlError": "هذا ليس عنوان URL صالحًا.",
"@widgetUrlError": {},
@ -2275,7 +2275,7 @@
"oldDisplayName": {}
}
},
"disableEncryptionWarning": "لأسباب أمنية ، لا يمكنك تعطيل التشفير في الدردشة ، حيث تم تمكينه من قبل.",
"disableEncryptionWarning": "لأسباب أمنية ، لا يمكنك تعطيل التشفير في المحادثة ، حيث تم تمكينه من قبل.",
"@disableEncryptionWarning": {},
"reportErrorDescription": "😭 أوه لا. هناك خطأ ما. إذا كنت تريد، يمكنك الإبلاغ عن هذا الخطأ إلى المطورين.",
"@reportErrorDescription": {},
@ -2285,7 +2285,7 @@
"@sorryThatsNotPossible": {},
"openLinkInBrowser": "فتح الرابط في المتصفح",
"@openLinkInBrowser": {},
"reopenChat": "إعادة فتح الدردشة",
"reopenChat": "إعادة فتح المحادثة",
"@reopenChat": {},
"noBackupWarning": "تحذير! بدون تمكين النسخ الاحتياطي للدردشة ، ستفقد الوصول إلى رسائلك المشفرة. يوصى بشدة بتمكين النسخ الاحتياطي للدردشة أولاً قبل تسجيل الخروج.",
"@noBackupWarning": {},
@ -2363,7 +2363,7 @@
"@addChatDescription": {},
"chatPermissions": "صلاحيات المحادثة",
"@chatPermissions": {},
"chatDescription": "وصف الدردشة",
"chatDescription": "وصف المحادثة",
"@chatDescription": {},
"chatDescriptionHasBeenChanged": "تغير وصف المجموعة",
"@chatDescriptionHasBeenChanged": {},
@ -2375,7 +2375,7 @@
"@setChatDescription": {},
"directChat": "محادثة مباشرة",
"@directChat": {},
"inviteGroupChat": "📨 دعوة الدردشة الجماعية",
"inviteGroupChat": "📨 دعوة للمحادثة الجماعية",
"@inviteGroupChat": {},
"invitePrivateChat": "📨 دعوة دردشة خاصة",
"@invitePrivateChat": {},
@ -2393,7 +2393,7 @@
"seconds": {}
}
},
"hasKnocked": "لقد طرق {user}",
"hasKnocked": "🚪 لقد طرق {user}",
"@hasKnocked": {
"placeholders": {
"user": {}
@ -2401,23 +2401,23 @@
},
"pleaseEnterANumber": "الرجاء إدخال رقم أكبر من 0",
"@pleaseEnterANumber": {},
"banUserDescription": "سيتم حظر المستخدم من الدردشة ولن يتمكن من الدخول إلى الدردشة مرة أخرى حتى يتم رفع الحظر عنه.",
"banUserDescription": "سيتم حظر المستخدم من المحادثة ولن يتمكن من الدخول إلى المحادثة مرة أخرى حتى يتم رفع الحظر عنه.",
"@banUserDescription": {},
"removeDevicesDescription": "سيتم تسجيل خروجك من هذا الجهاز ولن تتمكن بعد ذلك من تلقي الرسائل.",
"@removeDevicesDescription": {},
"unbanUserDescription": "سيتمكن المستخدم من الدخول إلى الدردشة مرة أخرى إذا حاول.",
"unbanUserDescription": "سيتمكن المستخدم من الدخول إلى المحادثة مرة أخرى إذا حاول.",
"@unbanUserDescription": {},
"pushNotificationsNotAvailable": "دفع الإخطارات غير متوفرة",
"@pushNotificationsNotAvailable": {},
"makeAdminDescription": "بمجرد تعيين هذا المستخدم كمسؤول، قد لا تتمكن من التراجع عن هذا لأنه سيكون لديه نفس الأذونات التي تتمتع بها.",
"@makeAdminDescription": {},
"archiveRoomDescription": "سيتم نقل الدردشة إلى الأرشيف. سيتمكن المستخدمون الآخرون من رؤية أنك غادرت الدردشة.",
"archiveRoomDescription": "سيتم نقل المحادثة إلى الأرشيف. سيتمكن المستخدمون الآخرون من رؤية أنك غادرت المحادثة.",
"@archiveRoomDescription": {},
"learnMore": "تعلم المزيد",
"@learnMore": {},
"roomUpgradeDescription": "سيتم بعد ذلك إعادة إنشاء الدردشة باستخدام إصدار الغرفة الجديد. سيتم إخطار جميع المشاركين بأنهم بحاجة إلى التبديل إلى الدردشة الجديدة. يمكنك معرفة المزيد حول إصدارات الغرف على https://spec.matrix.org/latest/rooms/",
"roomUpgradeDescription": "سيتم بعد ذلك إعادة إنشاء المحادثة باستخدام إصدار الغرفة الجديد. سيتم إخطار جميع المشاركين بأنهم بحاجة إلى التبديل إلى المحادثة الجديدة. يمكنك معرفة المزيد حول إصدارات الغرف على https://spec.matrix.org/latest/rooms/",
"@roomUpgradeDescription": {},
"kickUserDescription": "يتم طرد المستخدم من الدردشة ولكن لا يتم حظره. في الدردشات العامة، يمكن للمستخدم الانضمام مرة أخرى في أي وقت.",
"kickUserDescription": "يتم طرد المستخدم من المحادثة ولكن لا يتم حظره. في المحادثات العامة، يمكن للمستخدم الانضمام مرة أخرى في أي وقت.",
"@kickUserDescription": {},
"createGroupAndInviteUsers": "إنشاء مجموعة ودعوة المستخدمين",
"@createGroupAndInviteUsers": {},
@ -2553,9 +2553,9 @@
"roomName": {}
}
},
"sendTypingNotificationsDescription": "يستطيع المشاركون الآخرون في الدردشة رؤيتك عند كتابة رسالة جديدة.",
"sendTypingNotificationsDescription": "يستطيع المشاركون الآخرون في المحادثة رؤيتك عند كتابة رسالة جديدة.",
"@sendTypingNotificationsDescription": {},
"sendReadReceiptsDescription": "يمكن للمشاركين الآخرين في الدردشة معرفة متى قرأت رسالة.",
"sendReadReceiptsDescription": "يمكن للمشاركين الآخرين في المحادثة معرفة متى قرأت الرسالة.",
"@sendReadReceiptsDescription": {},
"verifyOtherUser": "🔐 التحقق من المستخدم الآخر",
"@verifyOtherUser": {},
@ -2600,5 +2600,111 @@
"@presencesToggle": {
"type": "text",
"placeholders": {}
}
},
"stickers": "الملصقات",
"@stickers": {},
"discover": "استكشف",
"@discover": {},
"commandHint_ignore": "تجاهل معرف المصفوفة المعطى",
"@commandHint_ignore": {},
"commandHint_unignore": "إلغاء تجاهل معرف المصفوفة المحدد",
"@commandHint_unignore": {},
"unreadChatsInApp": "{appname}: {unread} الدردشات غير المقروءة",
"@unreadChatsInApp": {
"type": "text",
"placeholders": {
"appname": {},
"unread": {}
}
},
"noDatabaseEncryption": "تشفير قاعدة البيانات غير مدعوم على هذا النظام الأساسي",
"@noDatabaseEncryption": {},
"appLockDescription": "قفل التطبيق عند عدم استخدامه بالرمز السري",
"@appLockDescription": {},
"accessAndVisibility": "الوصول والرؤية",
"@accessAndVisibility": {},
"calls": "المكالمات",
"@calls": {},
"customEmojisAndStickers": "الرموز التعبيرية والملصقات المخصصة",
"@customEmojisAndStickers": {},
"hideRedactedMessagesBody": "إذا قام شخص ما بتنقيح رسالة، فلن تكون هذه الرسالة مرئية في المحادثة بعد الآن.",
"@hideRedactedMessagesBody": {},
"hideInvalidOrUnknownMessageFormats": "إخفاء تنسيقات الرسائل غير الصالحة أو غير المعروفة",
"@hideInvalidOrUnknownMessageFormats": {},
"overview": "نظرة عامة",
"@overview": {},
"notifyMeFor": "أعلمني بـ",
"@notifyMeFor": {},
"passwordRecoverySettings": "إعدادات استعادة كلمة المرور",
"@passwordRecoverySettings": {},
"globalChatId": "معرف المحادثة العامة",
"@globalChatId": {},
"accessAndVisibilityDescription": "من المسموح له بالانضمام إلى هذه المحادثة وكيف يمكن اكتشاف المحادثة.",
"@accessAndVisibilityDescription": {},
"customEmojisAndStickersBody": "قم بإضافة أو مشاركة الرموز التعبيرية أو الملصقات المخصصة التي يمكن استخدامها في أي دردشة.",
"@customEmojisAndStickersBody": {},
"hideRedactedMessages": "إخفاء الرسائل المكررة",
"@hideRedactedMessages": {},
"hideMemberChangesInPublicChats": "إخفاء تغييرات الأعضاء في الدردشات العامة",
"@hideMemberChangesInPublicChats": {},
"hideMemberChangesInPublicChatsBody": "لا تظهر في المخطط الزمني للدردشة إذا انضم شخص ما إلى محادثة عامة أو غادرها لتحسين إمكانية القراءة.",
"@hideMemberChangesInPublicChatsBody": {},
"usersMustKnock": "المستخدم يجب أن يطرق الباب",
"@usersMustKnock": {},
"chatCanBeDiscoveredViaSearchOnServer": "يمكن اكتشاف الشات عن طريق البحث في {server}",
"@chatCanBeDiscoveredViaSearchOnServer": {
"type": "text",
"placeholders": {
"server": {}
}
},
"noOneCanJoin": "لا أحد يستطيع الانضمام",
"@noOneCanJoin": {},
"knocking": "طرق",
"@knocking": {},
"userWouldLikeToChangeTheChat": "{user} يرغب في الانضمام إلى المحادثة.",
"@userWouldLikeToChangeTheChat": {
"placeholders": {
"user": {}
}
},
"noPublicLinkHasBeenCreatedYet": "لم يتم بعد إنشاء أي رابط عام",
"@noPublicLinkHasBeenCreatedYet": {},
"knock": "دق",
"@knock": {},
"thereAreCountUsersBlocked": "يوجد حاليًا {count} من المستخدمين المحظورين.",
"@thereAreCountUsersBlocked": {
"type": "text",
"count": {}
},
"publicChatAddresses": "عناوين المحادثة العامة",
"@publicChatAddresses": {},
"createNewAddress": "إنشاء عنوان جديد",
"@createNewAddress": {},
"userRole": "دور المستخدم",
"@userRole": {},
"minimumPowerLevel": "{level} هو الحد الأدنى من مستوى الطاقة.",
"@minimumPowerLevel": {
"type": "text",
"placeholders": {
"level": {}
}
},
"searchIn": "بحث في {chat}...",
"@searchIn": {
"type": "text",
"placeholders": {
"chat": {}
}
},
"files": "الملفات",
"@files": {},
"restricted": "مقيد",
"@restricted": {},
"knockRestricted": "قيود النقر",
"@knockRestricted": {},
"searchMore": "ابحث أكثر...",
"@searchMore": {},
"gallery": "المعرض",
"@gallery": {}
}

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

View file

@ -2221,7 +2221,7 @@
},
"newSpaceDescription": "Mit Spaces kannst du deine Chats zusammenfassen und private oder öffentliche Communities aufbauen.",
"@newSpaceDescription": {},
"wasDirectChatDisplayName": "Leerer Chat (was {oldDisplayName}",
"wasDirectChatDisplayName": "Leerer Chat (war {oldDisplayName})",
"@wasDirectChatDisplayName": {
"type": "text",
"placeholders": {
@ -2381,7 +2381,7 @@
"@invitePrivateChat": {},
"invalidInput": "Ungültige Eingabe!",
"@invalidInput": {},
"hasKnocked": "{user} hat angeklopft",
"hasKnocked": "🚪 {user} hat angeklopft",
"@hasKnocked": {
"placeholders": {
"user": {}
@ -2586,5 +2586,125 @@
}
},
"verifyOtherDeviceDescription": "Wenn Sie ein anderes Gerät verifizieren, können diese Geräteschlüssel austauschen, was Ihre Sicherheit insgesamt erhöht. 💪 Wenn Sie eine Verifizierung starten, erscheint ein Pop-up in der App auf beiden Geräten. Dort sehen Sie dann eine Reihe von Emojis oder Zahlen, die Sie miteinander vergleichen müssen. Am besten hältst du beide Geräte bereit, bevor du die Verifizierung startest. 🤳",
"@verifyOtherDeviceDescription": {}
"@verifyOtherDeviceDescription": {},
"presenceStyle": "Statusmeldungen:",
"@presenceStyle": {
"type": "text",
"placeholders": {}
},
"presencesToggle": "Status-Nachrichten anderer Benutzer anzeigen",
"@presencesToggle": {
"type": "text",
"placeholders": {}
},
"incomingMessages": "Eingehende Nachrichten",
"@incomingMessages": {},
"commandHint_unignore": "Angegebene Matrix-ID nicht mehr ignorieren",
"@commandHint_unignore": {},
"commandHint_ignore": "Angegebene Matrix-ID ignorieren",
"@commandHint_ignore": {},
"noDatabaseEncryption": "Datenbankverschlüsselung wird auf dieser Plattform nicht unterstützt",
"@noDatabaseEncryption": {},
"hidePresences": "Status-Liste verbergen?",
"@hidePresences": {},
"stickers": "Sticker",
"@stickers": {},
"discover": "Entdecken",
"@discover": {},
"unreadChatsInApp": "{appname}: {unread} ungelesene Chats",
"@unreadChatsInApp": {
"type": "text",
"placeholders": {
"appname": {},
"unread": {}
}
},
"customEmojisAndStickersBody": "Eigene Emojis oder Sticker zur Nutzung im Chat hinzufügen oder teilen.",
"@customEmojisAndStickersBody": {},
"globalChatId": "Globale Chat-ID",
"@globalChatId": {},
"accessAndVisibility": "Zugang und Sichtbarkeit",
"@accessAndVisibility": {},
"hideMemberChangesInPublicChats": "Mitglieder-Änderungen in öffentlichen Chats ausblenden",
"@hideMemberChangesInPublicChats": {},
"accessAndVisibilityDescription": "Wer darf dem Chat beitreten und wie kann der Chat gefunden werden.",
"@accessAndVisibilityDescription": {},
"hideMemberChangesInPublicChatsBody": "Zeige keine Beitritt- oder Verlassen-Ereignisse von Mitgliedern in der Timeline an, um die Lesbarkeit in öffentlichen Chats zu verbessern.",
"@hideMemberChangesInPublicChatsBody": {},
"userWouldLikeToChangeTheChat": "{user} würde dem Chat gerne beitreten.",
"@userWouldLikeToChangeTheChat": {
"placeholders": {
"user": {}
}
},
"noPublicLinkHasBeenCreatedYet": "Es wurde noch kein öffentlicher Link erstellt",
"@noPublicLinkHasBeenCreatedYet": {},
"chatCanBeDiscoveredViaSearchOnServer": "Chat kann über die Suche auf {server} gefunden werden",
"@chatCanBeDiscoveredViaSearchOnServer": {
"type": "text",
"placeholders": {
"server": {}
}
},
"appLockDescription": "App mit einer PIN sperren, wenn sie nicht verwendet wird",
"@appLockDescription": {},
"calls": "Anrufe",
"@calls": {},
"customEmojisAndStickers": "Eigene Emojis und Sticker",
"@customEmojisAndStickers": {},
"hideRedactedMessages": "Geschwärzte Nachrichten verstecken",
"@hideRedactedMessages": {},
"hideRedactedMessagesBody": "Wenn jemand eine Nachricht schwärzt/löscht, dann wird diese Nachricht im Chat nicht mehr sichtbar sein.",
"@hideRedactedMessagesBody": {},
"hideInvalidOrUnknownMessageFormats": "Ungültige und unbekannte Nachrichten-Formate ausblenden",
"@hideInvalidOrUnknownMessageFormats": {},
"overview": "Übersicht",
"@overview": {},
"notifyMeFor": "Benachrichtige mich für",
"@notifyMeFor": {},
"passwordRecoverySettings": "Passwort-Wiederherstellungs-Einstellungen",
"@passwordRecoverySettings": {},
"knock": "Anklopfen",
"@knock": {},
"knocking": "Klopft",
"@knocking": {},
"thereAreCountUsersBlocked": "Im Augenblick werden {count} Benutzer blockiert.",
"@thereAreCountUsersBlocked": {
"type": "text",
"count": {}
},
"usersMustKnock": "Benutzer müssen anklopfen",
"@usersMustKnock": {},
"noOneCanJoin": "Niemand kann beitreten",
"@noOneCanJoin": {},
"createNewAddress": "Neue Adresse erstellen",
"@createNewAddress": {},
"userRole": "Benutzerrolle",
"@userRole": {},
"minimumPowerLevel": "{level} is das minimale Power-Level.",
"@minimumPowerLevel": {
"type": "text",
"placeholders": {
"level": {}
}
},
"publicChatAddresses": "Öffentliche Chat-Adressen",
"@publicChatAddresses": {},
"gallery": "Galerie",
"@gallery": {},
"files": "Dateien",
"@files": {},
"restricted": "Beschränkt",
"@restricted": {},
"knockRestricted": "Anklopfen beschränkt",
"@knockRestricted": {},
"searchIn": "In Chat \"{chat}\" suchen ...",
"@searchIn": {
"type": "text",
"placeholders": {
"chat": {}
}
},
"searchMore": "Weiter suchen ...",
"@searchMore": {}
}

File diff suppressed because it is too large Load diff

View file

@ -136,6 +136,8 @@
"type": "text",
"placeholders": {}
},
"appLockDescription": "Lock the app when not using with a pin code",
"@appLockDescription": {},
"archive": "Archive",
"@archive": {
"type": "text",
@ -183,7 +185,9 @@
},
"sendTypingNotifications": "Send typing notifications",
"@sendTypingNotifications": {},
"sendOnEnter": "Always send on enter",
"swipeRightToLeftToReply": "Swipe right to left to reply",
"@swipeRightToLeftToReply": {},
"sendOnEnter": "Send on enter",
"@sendOnEnter": {},
"badServerVersionsException": "The homeserver supports the Spec versions:\n{serverVersions}\nBut this app supports only {supportedVersions}",
"@badServerVersionsException": {
@ -773,6 +777,18 @@
"type": "text",
"placeholders": {}
},
"globalChatId": "Global chat ID",
"@globalChatId": {},
"accessAndVisibility": "Access and visibility",
"@accessAndVisibility": {},
"accessAndVisibilityDescription": "Who is allowed to join this chat and how the chat can be discovered.",
"@accessAndVisibilityDescription": {},
"calls": "Calls",
"@calls": {},
"customEmojisAndStickers": "Custom emojis and stickers",
"@customEmojisAndStickers": {},
"customEmojisAndStickersBody": "Add or share custom emojis or stickers which can be used in any chat.",
"@customEmojisAndStickersBody": {},
"emoteShortcode": "Emote shortcode",
"@emoteShortcode": {
"type": "text",
@ -958,11 +974,12 @@
"type": "text",
"placeholders": {}
},
"hideUnknownEvents": "Hide unknown events",
"@hideUnknownEvents": {
"type": "text",
"placeholders": {}
},
"hideRedactedMessages": "Hide redacted messages",
"@hideRedactedMessages": {},
"hideRedactedMessagesBody": "If someone redacts a message, this message won't be visible in the chat anymore.",
"@hideRedactedMessagesBody": {},
"hideInvalidOrUnknownMessageFormats": "Hide invalid or unknown message formats",
"@hideInvalidOrUnknownMessageFormats": {},
"howOffensiveIsThisContent": "How offensive is this content?",
"@howOffensiveIsThisContent": {
"type": "text",
@ -1426,6 +1443,16 @@
"type": "text",
"placeholders": {}
},
"hideMemberChangesInPublicChats": "Hide member changes in public chats",
"@hideMemberChangesInPublicChats": {},
"hideMemberChangesInPublicChatsBody": "Do not show in the chat timeline if someone joins or leaves a public chat to improve readability.",
"@hideMemberChangesInPublicChatsBody": {},
"overview": "Overview",
"@overview": {},
"notifyMeFor": "Notify me for",
"@notifyMeFor": {},
"passwordRecoverySettings": "Password recovery settings",
"@passwordRecoverySettings": {},
"passwordRecovery": "Password recovery",
"@passwordRecovery": {
"type": "text",
@ -2306,12 +2333,26 @@
"user": {}
}
},
"hasKnocked": "{user} has knocked",
"hasKnocked": "🚪 {user} has knocked",
"@hasKnocked": {
"placeholders": {
"user": {}
}
},
"usersMustKnock": "Users must knock",
"@usersMustKnock": {},
"noOneCanJoin": "No one can join",
"@noOneCanJoin": {},
"userWouldLikeToChangeTheChat": "{user} would like to join the chat.",
"@userWouldLikeToChangeTheChat": {
"placeholders": {
"user": {}
}
},
"noPublicLinkHasBeenCreatedYet": "No public link has been created yet",
"@noPublicLinkHasBeenCreatedYet": {},
"knock": "Knock",
"@knock": {},
"users": "Users",
"@users": {},
"unlockOldMessages": "Unlock old messages",
@ -3725,6 +3766,15 @@
"query": {}
}
},
"knocking": "Knocking",
"@knocking": {},
"chatCanBeDiscoveredViaSearchOnServer": "Chat can be discovered via the search on {server}",
"@chatCanBeDiscoveredViaSearchOnServer": {
"type": "text",
"placeholders": {
"server": {}
}
},
"searchChatsRooms": "Search for #chats, @users...",
"createClass": "Create class",
"createExchange": "Create exchange",
@ -3760,6 +3810,11 @@
"passwordsDoNotMatch": "Passwords do not match",
"passwordIsWrong": "Your entered password is wrong",
"publicLink": "Public link",
"@publicLink": {},
"publicChatAddresses": "Public chat addresses",
"@publicChatAddresses": {},
"createNewAddress": "Create new address",
"@createNewAddress": {},
"joinSpace": "Join space",
"publicSpaces": "Public spaces",
"addChatOrSubSpace": "Add chat or sub space",
@ -3767,6 +3822,29 @@
"decline": "Decline",
"thisDevice": "This device:",
"initAppError": "An error occured while init the app",
"@initAppError": {},
"userRole": "User role",
"@userRole": {},
"minimumPowerLevel": "{level} is the minimum power level.",
"@minimumPowerLevel": {
"type": "text",
"placeholders": {
"level": {}
}
},
"searchIn": "Search in chat \"{chat}\"...",
"@searchIn": {
"type": "text",
"placeholders": {
"chat": {}
}
},
"searchMore": "Search more...",
"@searchMore": {},
"gallery": "Gallery",
"@gallery": {},
"files": "Files",
"@files": {},
"databaseBuildErrorBody": "Unable to build the SQlite database. The app tries to use the legacy database for now. Please report this error to the developers at {url}. The error message is: {error}",
"@databaseBuildErrorBody": {
"type": "text",
@ -3971,6 +4049,17 @@
"roomCapacityExplanation": "Room capacity limits the number of non-admins allowed in a room.",
"enterNumber": "Please enter a whole number value.",
"buildTranslation": "Build your translation from the choices above",
"noDatabaseEncryption": "Database encryption is not supported on this platform",
"@noDatabaseEncryption": {},
"thereAreCountUsersBlocked": "Right now there are {count} users blocked.",
"@thereAreCountUsersBlocked": {
"type": "text",
"count": {}
},
"restricted": "Restricted",
"@restricted": {},
"knockRestricted": "Knock restricted",
"@knockRestricted": {},
"nonexistentSelection": "Selection no longer exists.",
"cantAddSpaceChild": "You do not have permission to add a child to this space.",
"roomAddedToSpace": "Room(s) have been added to the selected space."

View file

@ -1903,519 +1903,332 @@
"@homeserver": {},
"sendOnEnter": "Sendi per eniga klavo",
"@sendOnEnter": {},
"hugContent": "",
"@hugContent": {
"@hugContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"jumpToLastReadMessage": "",
"@jumpToLastReadMessage": {},
"allRooms": "",
"@allRooms": {
"@jumpToLastReadMessage": {},
"@allRooms": {
"type": "text",
"placeholders": {}
},
"commandHint_cuddle": "",
"@commandHint_cuddle": {},
"widgetVideo": "",
"@widgetVideo": {},
"dismiss": "",
"@dismiss": {},
"reportErrorDescription": "",
"@reportErrorDescription": {},
"addAccount": "",
"@addAccount": {},
"unsupportedAndroidVersion": "",
"@unsupportedAndroidVersion": {},
"widgetJitsi": "",
"@widgetJitsi": {},
"messageType": "",
"@messageType": {},
"indexedDbErrorLong": "",
"@indexedDbErrorLong": {},
"oneClientLoggedOut": "",
"@oneClientLoggedOut": {},
"startFirstChat": "",
"@startFirstChat": {},
"callingAccount": "",
"@callingAccount": {},
"setColorTheme": "",
"@setColorTheme": {},
"nextAccount": "",
"@nextAccount": {},
"commandHint_create": "",
"@commandHint_create": {
"@commandHint_cuddle": {},
"@widgetVideo": {},
"@dismiss": {},
"@reportErrorDescription": {},
"@addAccount": {},
"@unsupportedAndroidVersion": {},
"@widgetJitsi": {},
"@messageType": {},
"@indexedDbErrorLong": {},
"@oneClientLoggedOut": {},
"@startFirstChat": {},
"@callingAccount": {},
"@setColorTheme": {},
"@nextAccount": {},
"@commandHint_create": {
"type": "text",
"description": "Usage hint for the command /create"
},
"allSpaces": "",
"@allSpaces": {},
"supposedMxid": "",
"@supposedMxid": {
"@allSpaces": {},
"@supposedMxid": {
"type": "text",
"placeholders": {
"mxid": {}
}
},
"user": "",
"@user": {},
"youAcceptedTheInvitation": "",
"@youAcceptedTheInvitation": {},
"youInvitedBy": "",
"@youInvitedBy": {
"@user": {},
"@youAcceptedTheInvitation": {},
"@youInvitedBy": {
"placeholders": {
"user": {}
}
},
"banUserDescription": "",
"@banUserDescription": {},
"widgetEtherpad": "",
"@widgetEtherpad": {},
"removeDevicesDescription": "",
"@removeDevicesDescription": {},
"separateChatTypes": "",
"@separateChatTypes": {
"@banUserDescription": {},
"@widgetEtherpad": {},
"@removeDevicesDescription": {},
"@separateChatTypes": {
"type": "text",
"placeholders": {}
},
"tryAgain": "",
"@tryAgain": {},
"youKickedAndBanned": "",
"@youKickedAndBanned": {
"@tryAgain": {},
"@youKickedAndBanned": {
"placeholders": {
"user": {}
}
},
"unbanUserDescription": "",
"@unbanUserDescription": {},
"youRejectedTheInvitation": "",
"@youRejectedTheInvitation": {},
"otherCallingPermissions": "",
"@otherCallingPermissions": {},
"messagesStyle": "",
"@messagesStyle": {},
"link": "",
"@link": {},
"widgetUrlError": "",
"@widgetUrlError": {},
"emailOrUsername": "",
"@emailOrUsername": {},
"newSpaceDescription": "",
"@newSpaceDescription": {},
"chatDescription": "",
"@chatDescription": {},
"callingAccountDetails": "",
"@callingAccountDetails": {},
"enterSpace": "",
"@enterSpace": {},
"encryptThisChat": "",
"@encryptThisChat": {},
"previousAccount": "",
"@previousAccount": {},
"reopenChat": "",
"@reopenChat": {},
"pleaseEnterRecoveryKey": "",
"@pleaseEnterRecoveryKey": {},
"widgetNameError": "",
"@widgetNameError": {},
"addToBundle": "",
"@addToBundle": {},
"addWidget": "",
"@addWidget": {},
"countFiles": "",
"@countFiles": {
"@unbanUserDescription": {},
"@youRejectedTheInvitation": {},
"@otherCallingPermissions": {},
"@messagesStyle": {},
"@link": {},
"@widgetUrlError": {},
"@emailOrUsername": {},
"@newSpaceDescription": {},
"@chatDescription": {},
"@callingAccountDetails": {},
"@enterSpace": {},
"@encryptThisChat": {},
"@previousAccount": {},
"@reopenChat": {},
"@pleaseEnterRecoveryKey": {},
"@widgetNameError": {},
"@addToBundle": {},
"@addWidget": {},
"@countFiles": {
"placeholders": {
"count": {}
}
},
"noKeyForThisMessage": "",
"@noKeyForThisMessage": {},
"commandHint_markasgroup": "",
"@commandHint_markasgroup": {},
"hydrateTor": "",
"@hydrateTor": {},
"pushNotificationsNotAvailable": "",
"@pushNotificationsNotAvailable": {},
"storeInAppleKeyChain": "",
"@storeInAppleKeyChain": {},
"hydrate": "",
"@hydrate": {},
"invalidServerName": "",
"@invalidServerName": {},
"chatPermissions": "",
"@chatPermissions": {},
"sender": "",
"@sender": {},
"storeInAndroidKeystore": "",
"@storeInAndroidKeystore": {},
"signInWithPassword": "",
"@signInWithPassword": {},
"makeAdminDescription": "",
"@makeAdminDescription": {},
"commandHint_clearcache": "",
"@commandHint_clearcache": {
"@noKeyForThisMessage": {},
"@commandHint_markasgroup": {},
"@hydrateTor": {},
"@pushNotificationsNotAvailable": {},
"@storeInAppleKeyChain": {},
"@hydrate": {},
"@invalidServerName": {},
"@chatPermissions": {},
"@sender": {},
"@storeInAndroidKeystore": {},
"@signInWithPassword": {},
"@makeAdminDescription": {},
"@commandHint_clearcache": {
"type": "text",
"description": "Usage hint for the command /clearcache"
},
"saveKeyManuallyDescription": "",
"@saveKeyManuallyDescription": {},
"editBundlesForAccount": "",
"@editBundlesForAccount": {},
"whyIsThisMessageEncrypted": "",
"@whyIsThisMessageEncrypted": {},
"setChatDescription": "",
"@setChatDescription": {},
"importFromZipFile": "",
"@importFromZipFile": {},
"dehydrateWarning": "",
"@dehydrateWarning": {},
"noOtherDevicesFound": "",
"@noOtherDevicesFound": {},
"yourChatBackupHasBeenSetUp": "",
"@yourChatBackupHasBeenSetUp": {},
"redactedBy": "",
"@redactedBy": {
"@saveKeyManuallyDescription": {},
"@editBundlesForAccount": {},
"@whyIsThisMessageEncrypted": {},
"@setChatDescription": {},
"@importFromZipFile": {},
"@dehydrateWarning": {},
"@noOtherDevicesFound": {},
"@yourChatBackupHasBeenSetUp": {},
"@redactedBy": {
"type": "text",
"placeholders": {
"username": {}
}
},
"videoCallsBetaWarning": "",
"@videoCallsBetaWarning": {},
"signInWith": "",
"@signInWith": {
"@videoCallsBetaWarning": {},
"@signInWith": {
"type": "text",
"placeholders": {
"provider": {}
}
},
"fileIsTooBigForServer": "",
"@fileIsTooBigForServer": {},
"repeatPassword": "",
"@repeatPassword": {},
"callingPermissions": "",
"@callingPermissions": {},
"readUpToHere": "",
"@readUpToHere": {},
"start": "",
"@start": {},
"unlockOldMessages": "",
"@unlockOldMessages": {},
"numChats": "",
"@numChats": {
"@fileIsTooBigForServer": {},
"@repeatPassword": {},
"@callingPermissions": {},
"@readUpToHere": {},
"@start": {},
"@unlockOldMessages": {},
"@numChats": {
"type": "number",
"placeholders": {
"number": {}
}
},
"optionalRedactReason": "",
"@optionalRedactReason": {},
"dehydrate": "",
"@dehydrate": {},
"locationPermissionDeniedNotice": "",
"@locationPermissionDeniedNotice": {
"@optionalRedactReason": {},
"@dehydrate": {},
"@locationPermissionDeniedNotice": {
"type": "text",
"placeholders": {}
},
"archiveRoomDescription": "",
"@archiveRoomDescription": {},
"exportEmotePack": "",
"@exportEmotePack": {},
"switchToAccount": "",
"@switchToAccount": {
"@archiveRoomDescription": {},
"@exportEmotePack": {},
"@switchToAccount": {
"type": "number",
"placeholders": {
"number": {}
}
},
"locationDisabledNotice": "",
"@locationDisabledNotice": {
"@locationDisabledNotice": {
"type": "text",
"placeholders": {}
},
"experimentalVideoCalls": "",
"@experimentalVideoCalls": {},
"pleaseEnterRecoveryKeyDescription": "",
"@pleaseEnterRecoveryKeyDescription": {},
"openInMaps": "",
"@openInMaps": {
"@experimentalVideoCalls": {},
"@pleaseEnterRecoveryKeyDescription": {},
"@openInMaps": {
"type": "text",
"placeholders": {}
},
"inviteContactToGroupQuestion": "",
"@inviteContactToGroupQuestion": {},
"redactedByBecause": "",
"@redactedByBecause": {
"@inviteContactToGroupQuestion": {},
"@redactedByBecause": {
"type": "text",
"placeholders": {
"username": {},
"reason": {}
}
},
"youHaveWithdrawnTheInvitationFor": "",
"@youHaveWithdrawnTheInvitationFor": {
"@youHaveWithdrawnTheInvitationFor": {
"placeholders": {
"user": {}
}
},
"appearOnTopDetails": "",
"@appearOnTopDetails": {},
"enterRoom": "",
"@enterRoom": {},
"reportUser": "",
"@reportUser": {},
"confirmEventUnpin": "",
"@confirmEventUnpin": {},
"youInvitedUser": "",
"@youInvitedUser": {
"@appearOnTopDetails": {},
"@enterRoom": {},
"@reportUser": {},
"@confirmEventUnpin": {},
"@youInvitedUser": {
"placeholders": {
"user": {}
}
},
"fileHasBeenSavedAt": "",
"@fileHasBeenSavedAt": {
"@fileHasBeenSavedAt": {
"type": "text",
"placeholders": {
"path": {}
}
},
"redactMessageDescription": "",
"@redactMessageDescription": {},
"recoveryKey": "",
"@recoveryKey": {},
"commandHint_discardsession": "",
"@commandHint_discardsession": {
"@redactMessageDescription": {},
"@recoveryKey": {},
"@commandHint_discardsession": {
"type": "text",
"description": "Usage hint for the command /discardsession"
},
"invalidInput": "",
"@invalidInput": {},
"dehydrateTorLong": "",
"@dehydrateTorLong": {},
"doNotShowAgain": "",
"@doNotShowAgain": {},
"report": "",
"@report": {},
"unverified": "",
"@unverified": {},
"serverRequiresEmail": "",
"@serverRequiresEmail": {},
"hideUnimportantStateEvents": "",
"@hideUnimportantStateEvents": {},
"screenSharingTitle": "",
"@screenSharingTitle": {},
"widgetCustom": "",
"@widgetCustom": {},
"addToSpaceDescription": "",
"@addToSpaceDescription": {},
"googlyEyesContent": "",
"@googlyEyesContent": {
"@invalidInput": {},
"@dehydrateTorLong": {},
"@doNotShowAgain": {},
"@report": {},
"@unverified": {},
"@serverRequiresEmail": {},
"@hideUnimportantStateEvents": {},
"@screenSharingTitle": {},
"@widgetCustom": {},
"@addToSpaceDescription": {},
"@googlyEyesContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"youBannedUser": "",
"@youBannedUser": {
"@youBannedUser": {
"placeholders": {
"user": {}
}
},
"addChatDescription": "",
"@addChatDescription": {},
"hasKnocked": "",
"@hasKnocked": {
"@addChatDescription": {},
"@hasKnocked": {
"placeholders": {
"user": {}
}
},
"publish": "",
"@publish": {},
"openLinkInBrowser": "",
"@openLinkInBrowser": {},
"messageInfo": "",
"@messageInfo": {},
"disableEncryptionWarning": "",
"@disableEncryptionWarning": {},
"directChat": "",
"@directChat": {},
"wrongPinEntered": "",
"@wrongPinEntered": {
"@publish": {},
"@openLinkInBrowser": {},
"@messageInfo": {},
"@disableEncryptionWarning": {},
"@directChat": {},
"@wrongPinEntered": {
"type": "text",
"placeholders": {
"seconds": {}
}
},
"sendTypingNotifications": "",
"@sendTypingNotifications": {},
"inviteGroupChat": "",
"@inviteGroupChat": {},
"appearOnTop": "",
"@appearOnTop": {},
"invitePrivateChat": "",
"@invitePrivateChat": {},
"foregroundServiceRunning": "",
"@foregroundServiceRunning": {},
"voiceCall": "",
"@voiceCall": {},
"importEmojis": "",
"@importEmojis": {},
"wasDirectChatDisplayName": "",
"@wasDirectChatDisplayName": {
"@sendTypingNotifications": {},
"@inviteGroupChat": {},
"@appearOnTop": {},
"@invitePrivateChat": {},
"@foregroundServiceRunning": {},
"@voiceCall": {},
"@importEmojis": {},
"@wasDirectChatDisplayName": {
"type": "text",
"placeholders": {
"oldDisplayName": {}
}
},
"noChatDescriptionYet": "",
"@noChatDescriptionYet": {},
"removeFromBundle": "",
"@removeFromBundle": {},
"confirmMatrixId": "",
"@confirmMatrixId": {},
"learnMore": "",
"@learnMore": {},
"notAnImage": "",
"@notAnImage": {},
"users": "",
"@users": {},
"openGallery": "",
"@openGallery": {},
"chatDescriptionHasBeenChanged": "",
"@chatDescriptionHasBeenChanged": {},
"newGroup": "",
"@newGroup": {},
"bundleName": "",
"@bundleName": {},
"dehydrateTor": "",
"@dehydrateTor": {},
"removeFromSpace": "",
"@removeFromSpace": {},
"roomUpgradeDescription": "",
"@roomUpgradeDescription": {},
"scanQrCode": "",
"@scanQrCode": {},
"pleaseEnterANumber": "",
"@pleaseEnterANumber": {},
"youKicked": "",
"@youKicked": {
"@noChatDescriptionYet": {},
"@removeFromBundle": {},
"@confirmMatrixId": {},
"@learnMore": {},
"@notAnImage": {},
"@users": {},
"@openGallery": {},
"@chatDescriptionHasBeenChanged": {},
"@newGroup": {},
"@bundleName": {},
"@dehydrateTor": {},
"@removeFromSpace": {},
"@roomUpgradeDescription": {},
"@scanQrCode": {},
"@pleaseEnterANumber": {},
"@youKicked": {
"placeholders": {
"user": {}
}
},
"profileNotFound": "",
"@profileNotFound": {},
"jump": "",
"@jump": {},
"reactedWith": "",
"@reactedWith": {
"@profileNotFound": {},
"@jump": {},
"@reactedWith": {
"type": "text",
"placeholders": {
"sender": {},
"reaction": {}
}
},
"sorryThatsNotPossible": "",
"@sorryThatsNotPossible": {},
"videoWithSize": "",
"@videoWithSize": {
"@sorryThatsNotPossible": {},
"@videoWithSize": {
"type": "text",
"placeholders": {
"size": {}
}
},
"shareInviteLink": "",
"@shareInviteLink": {},
"commandHint_markasdm": "",
"@commandHint_markasdm": {},
"recoveryKeyLost": "",
"@recoveryKeyLost": {},
"cuddleContent": "",
"@cuddleContent": {
"@shareInviteLink": {},
"@commandHint_markasdm": {},
"@recoveryKeyLost": {},
"@cuddleContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"deviceKeys": "",
"@deviceKeys": {},
"emoteKeyboardNoRecents": "",
"@emoteKeyboardNoRecents": {
"@deviceKeys": {},
"@emoteKeyboardNoRecents": {
"type": "text",
"placeholders": {}
},
"setTheme": "",
"@setTheme": {},
"youJoinedTheChat": "",
"@youJoinedTheChat": {},
"openVideoCamera": "",
"@openVideoCamera": {
"@setTheme": {},
"@youJoinedTheChat": {},
"@openVideoCamera": {
"type": "text",
"placeholders": {}
},
"markAsRead": "",
"@markAsRead": {},
"widgetName": "",
"@widgetName": {},
"errorAddingWidget": "",
"@errorAddingWidget": {},
"commandHint_dm": "",
"@commandHint_dm": {
"@markAsRead": {},
"@widgetName": {},
"@errorAddingWidget": {},
"@commandHint_dm": {
"type": "text",
"description": "Usage hint for the command /dm"
},
"commandHint_hug": "",
"@commandHint_hug": {},
"replace": "",
"@replace": {},
"youUnbannedUser": "",
"@youUnbannedUser": {
"@commandHint_hug": {},
"@replace": {},
"@youUnbannedUser": {
"placeholders": {
"user": {}
}
},
"newSpace": "",
"@newSpace": {},
"emojis": "",
"@emojis": {},
"commandHint_googly": "",
"@commandHint_googly": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "",
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"createGroup": "",
"@createGroup": {},
"hydrateTorLong": "",
"@hydrateTorLong": {},
"time": "",
"@time": {},
"custom": "",
"@custom": {},
"noBackupWarning": "",
"@noBackupWarning": {},
"storeInSecureStorageDescription": "",
"@storeInSecureStorageDescription": {},
"openChat": "",
"@openChat": {},
"kickUserDescription": "",
"@kickUserDescription": {},
"importNow": "",
"@importNow": {},
"pinMessage": "",
"@pinMessage": {},
"invite": "",
"@invite": {},
"enableMultiAccounts": "",
"@enableMultiAccounts": {},
"indexedDbErrorTitle": "",
"@indexedDbErrorTitle": {},
"unsupportedAndroidVersionLong": "",
"@unsupportedAndroidVersionLong": {},
"storeSecurlyOnThisDevice": "",
"@storeSecurlyOnThisDevice": {},
"screenSharingDetail": "",
"@screenSharingDetail": {},
"placeCall": "",
"@placeCall": {}
"@newSpace": {},
"@emojis": {},
"@commandHint_googly": {},
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"@createGroup": {},
"@hydrateTorLong": {},
"@time": {},
"@custom": {},
"@noBackupWarning": {},
"@storeInSecureStorageDescription": {},
"@openChat": {},
"@kickUserDescription": {},
"@importNow": {},
"@pinMessage": {},
"@invite": {},
"@enableMultiAccounts": {},
"@indexedDbErrorTitle": {},
"@unsupportedAndroidVersionLong": {},
"@storeSecurlyOnThisDevice": {},
"@screenSharingDetail": {},
"@placeCall": {}
}

View file

@ -4676,4 +4676,4 @@
"tooltipInstructionsMobileBody": "Mantenga pulsados los elementos para ver la información sobre herramientas.",
"tooltipInstructionsBrowserBody": "Pase el ratón sobre los elementos para ver información sobre herramientas.",
"buildTranslation": "Construye tu traducción a partir de las opciones anteriores"
}
}

View file

@ -2405,7 +2405,7 @@
"@makeAdminDescription": {},
"archiveRoomDescription": "Selle vestluse tõstame nüüd arhiivi. Muud osalejad näevad, et sa oled vestlusest lahkunud.",
"@archiveRoomDescription": {},
"hasKnocked": "{user} on jututoa uksele koputanud",
"hasKnocked": "🚪{user} on jututoa uksele koputanud",
"@hasKnocked": {
"placeholders": {
"user": {}
@ -2436,7 +2436,7 @@
"query": {}
}
},
"block": "blokeeri",
"block": "Blokeeri",
"@block": {},
"yourGlobalUserIdIs": "Sinu üldine kasutajatunnus on: ",
"@yourGlobalUserIdIs": {},
@ -2600,5 +2600,111 @@
"incomingMessages": "Saabuvad sõnumid",
"@incomingMessages": {},
"hidePresences": "Peida olekute loend?",
"@hidePresences": {}
"@hidePresences": {},
"stickers": "Kleepsud",
"@stickers": {},
"discover": "Otsi ja leia",
"@discover": {},
"commandHint_ignore": "Eira seda Matrixi kasutajatunnust",
"@commandHint_ignore": {},
"commandHint_unignore": "Lõpeta selle Matrixi kasutajatunnuse eiramine",
"@commandHint_unignore": {},
"unreadChatsInApp": "{appname}: {unread} lugemata vestlust",
"@unreadChatsInApp": {
"type": "text",
"placeholders": {
"appname": {},
"unread": {}
}
},
"globalChatId": "Üldine vestluse tunnus",
"@globalChatId": {},
"accessAndVisibilityDescription": "Kes võib selle vestlusega liituda ja kuidas on võimalik seda vestlust leida.",
"@accessAndVisibilityDescription": {},
"hideRedactedMessagesBody": "Kui keegi muudab sõnumit, siis teda enam ei kuvataks vestluses.",
"@hideRedactedMessagesBody": {},
"userWouldLikeToChangeTheChat": "{user} soovib liituda vestlusega.",
"@userWouldLikeToChangeTheChat": {
"placeholders": {
"user": {}
}
},
"hideMemberChangesInPublicChats": "Peida avalike vestluste liikmelisuse muutused",
"@hideMemberChangesInPublicChats": {},
"notifyMeFor": "Teavita mind kui",
"@notifyMeFor": {},
"usersMustKnock": "Kasutajad peavad uksele koputama",
"@usersMustKnock": {},
"noOneCanJoin": "Mitte keegi ei saa liituda",
"@noOneCanJoin": {},
"knocking": "Koputus uksele",
"@knocking": {},
"chatCanBeDiscoveredViaSearchOnServer": "Vestluse või jututoa saad leida otsingust serveris {server}",
"@chatCanBeDiscoveredViaSearchOnServer": {
"type": "text",
"placeholders": {
"server": {}
}
},
"publicChatAddresses": "Vestluse avalik aadress",
"@publicChatAddresses": {},
"minimumPowerLevel": "{level} on väikseim võimalik õiguste tase.",
"@minimumPowerLevel": {
"type": "text",
"placeholders": {
"level": {}
}
},
"noDatabaseEncryption": "Andmebaasi krüptimine pole sellel platvormil toetatud",
"@noDatabaseEncryption": {},
"noPublicLinkHasBeenCreatedYet": "Avalikult kasutatavat linki pole veel olemas",
"@noPublicLinkHasBeenCreatedYet": {},
"knock": "Koputa uksele",
"@knock": {},
"appLockDescription": "Kui sa rakendust parasjagu ei kasuta, siis lukusta ta PIN-koodiga",
"@appLockDescription": {},
"accessAndVisibility": "Ligipääsetavus ja nähtavus",
"@accessAndVisibility": {},
"calls": "Kõned",
"@calls": {},
"customEmojisAndStickers": "Kohandatud emotikonid ja kleepsud",
"@customEmojisAndStickers": {},
"customEmojisAndStickersBody": "Lisa või jaga kohandatud emotikone või kleepsupakke, mida võiks kasutada igas vestluses.",
"@customEmojisAndStickersBody": {},
"hideRedactedMessages": "Peida muudetud sõnumid",
"@hideRedactedMessages": {},
"hideInvalidOrUnknownMessageFormats": "Peida vigase või tundmatu vorminguga sõnumid",
"@hideInvalidOrUnknownMessageFormats": {},
"hideMemberChangesInPublicChatsBody": "Parema loetavuse nimel ära näita vestluse ajajoonel avaliku jututoaga liitumisi ja sealt lahkumisi.",
"@hideMemberChangesInPublicChatsBody": {},
"overview": "Ülevaade",
"@overview": {},
"passwordRecoverySettings": "Salasõna taastamise seadistused",
"@passwordRecoverySettings": {},
"createNewAddress": "Loo uus aadress",
"@createNewAddress": {},
"userRole": "Kasutaja roll",
"@userRole": {},
"thereAreCountUsersBlocked": "Hetkel on {count} blokeeritud kasutajat.",
"@thereAreCountUsersBlocked": {
"type": "text",
"count": {}
},
"searchIn": "Otsi vestlusest „{chat}“...",
"@searchIn": {
"type": "text",
"placeholders": {
"chat": {}
}
},
"searchMore": "Otsi veel...",
"@searchMore": {},
"knockRestricted": "Koputa piiratud ligipääsuga jututoa uksele",
"@knockRestricted": {},
"restricted": "Piiratud",
"@restricted": {},
"gallery": "Galerii",
"@gallery": {},
"files": "Failid",
"@files": {}
}

View file

@ -2405,7 +2405,7 @@
"@makeAdminDescription": {},
"archiveRoomDescription": "Txata artxibategira mugituko da. Beste erabiltzaileek txatetik alde egin duzula ikusi ahal izango dute.",
"@archiveRoomDescription": {},
"hasKnocked": "{user}(e)k baimena eskatu du",
"hasKnocked": "🚪 {user}(e)k baimena eskatu du",
"@hasKnocked": {
"placeholders": {
"user": {}
@ -2446,7 +2446,7 @@
"@blockListDescription": {},
"blockedUsers": "Blokeatutako erabiltzaileak",
"@blockedUsers": {},
"block": "blokeatu",
"block": "Blokeatu",
"@block": {},
"blockUsername": "Ezikusi erabiltzaile-izena",
"@blockUsername": {},
@ -2600,5 +2600,107 @@
"incomingMessages": "Jasotako mezuak",
"@incomingMessages": {},
"hidePresences": "Ezkutatu Egoeren Zerrenda?",
"@hidePresences": {}
"@hidePresences": {},
"discover": "Arakatu",
"@discover": {},
"stickers": "Pegatinak",
"@stickers": {},
"commandHint_unignore": "Utzi Matrix ID honi muzin egiteari",
"@commandHint_unignore": {},
"commandHint_ignore": "Muzin egin Matrix ID honi",
"@commandHint_ignore": {},
"unreadChatsInApp": "{appname}: {unread} mezu irakurri gabe",
"@unreadChatsInApp": {
"type": "text",
"placeholders": {
"appname": {},
"unread": {}
}
},
"noDatabaseEncryption": "Plataforma honetan ezin da datu-basea zifratu",
"@noDatabaseEncryption": {},
"usersMustKnock": "Erabiltzaileek baimena eskatu behar dute",
"@usersMustKnock": {},
"userWouldLikeToChangeTheChat": "{user}(e)k txatera batu nahiko luke.",
"@userWouldLikeToChangeTheChat": {
"placeholders": {
"user": {}
}
},
"knock": "Eskatu baimena",
"@knock": {},
"knocking": "Baimena eskatzen",
"@knocking": {},
"chatCanBeDiscoveredViaSearchOnServer": "Txata {server}(e)n bilaketa eginez aurkitu daiteke",
"@chatCanBeDiscoveredViaSearchOnServer": {
"type": "text",
"placeholders": {
"server": {}
}
},
"thereAreCountUsersBlocked": "Une honetan {count} erabiltzaile daude blokeatuta.",
"@thereAreCountUsersBlocked": {
"type": "text",
"count": {}
},
"appLockDescription": "Blokeatu aplikazioa pin kode batekin erabiltzen ari ez zarenean",
"@appLockDescription": {},
"accessAndVisibility": "Sarbidea eta ikusgaitasuna",
"@accessAndVisibility": {},
"accessAndVisibilityDescription": "Nork du txat honetara batzeko baimena eta nola aurkitu daiteke txata.",
"@accessAndVisibilityDescription": {},
"customEmojisAndStickers": "Emoji eta pegatina propioak",
"@customEmojisAndStickers": {},
"customEmojisAndStickersBody": "Gehitu edo partekatu edozein txatetan erabil daitezkeen emoji edo pegatina propioak.",
"@customEmojisAndStickersBody": {},
"hideRedactedMessages": "Ezkutatu atzera botatako mezuak",
"@hideRedactedMessages": {},
"hideRedactedMessagesBody": "Norbaitek mezuren bat atzera botaz gero, mezua txatetik kenduko da, abisurik gabe.",
"@hideRedactedMessagesBody": {},
"hideInvalidOrUnknownMessageFormats": "Ezkutatu mezuen formatu ezezagun edo baliogabea",
"@hideInvalidOrUnknownMessageFormats": {},
"overview": "Ikuspegi orokorra",
"@overview": {},
"notifyMeFor": "Jakinarazi…",
"@notifyMeFor": {},
"passwordRecoverySettings": "Pasahitza berreskuratzeko ezarpenak",
"@passwordRecoverySettings": {},
"hideMemberChangesInPublicChats": "Ezkutatu kideen egoera aldaketak txat publikoetan",
"@hideMemberChangesInPublicChats": {},
"globalChatId": "Txat ID orokorra",
"@globalChatId": {},
"calls": "Deiak",
"@calls": {},
"hideMemberChangesInPublicChatsBody": "Ez erakutsi txataren denbora-lerroan norbait txat publikora batu edo txatetik irteten dela, irakurgaitasuna hobetzeko.",
"@hideMemberChangesInPublicChatsBody": {},
"noOneCanJoin": "Ezin da inor batu",
"@noOneCanJoin": {},
"noPublicLinkHasBeenCreatedYet": "Oraindik ez da esteka publikorik sortu",
"@noPublicLinkHasBeenCreatedYet": {},
"userRole": "Erabiltzailearen rola",
"@userRole": {},
"minimumPowerLevel": "{level} da gutxieneko botere maila.",
"@minimumPowerLevel": {
"type": "text",
"placeholders": {
"level": {}
}
},
"publicChatAddresses": "Txataren helbide publikoak",
"@publicChatAddresses": {},
"createNewAddress": "Sortu helbide berria",
"@createNewAddress": {},
"files": "Fitxategiak",
"@files": {},
"gallery": "Galeria",
"@gallery": {},
"searchIn": "Bilatu {chat}ean...",
"@searchIn": {
"type": "text",
"placeholders": {
"chat": {}
}
},
"searchMore": "Bilatu gehiago...",
"@searchMore": {}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

870
assets/l10n/intl_fil.arb Normal file
View file

@ -0,0 +1,870 @@
{
"remove": "Tanggalin",
"@remove": {
"type": "text",
"placeholders": {}
},
"importNow": "I-import ngayon",
"@importNow": {},
"importEmojis": "I-import ang mga Emoji",
"@importEmojis": {},
"importFromZipFile": "Mag-import mula sa .zip file",
"@importFromZipFile": {},
"exportEmotePack": "I-export ang Emote pack bilang .zip",
"@exportEmotePack": {},
"accept": "Tanggapin",
"@accept": {
"type": "text",
"placeholders": {}
},
"account": "Account",
"@account": {
"type": "text",
"placeholders": {}
},
"addEmail": "Magdagdag ng email",
"@addEmail": {
"type": "text",
"placeholders": {}
},
"confirmMatrixId": "Paki-kumpirma ang iyong Matrix ID para burahin ang iyong account.",
"@confirmMatrixId": {},
"addChatDescription": "Magdagdag ng deskripsyon ng chat...",
"@addChatDescription": {},
"admin": "Admin",
"@admin": {
"type": "text",
"placeholders": {}
},
"alias": "alyas",
"@alias": {
"type": "text",
"placeholders": {}
},
"all": "Lahat",
"@all": {
"type": "text",
"placeholders": {}
},
"allChats": "Lahat ng mga chat",
"@allChats": {
"type": "text",
"placeholders": {}
},
"commandHint_googly": "Magpadala ng mga googly eye",
"@commandHint_googly": {},
"commandHint_cuddle": "Magpadala ng yakap",
"@commandHint_cuddle": {},
"cuddleContent": "Niyakap ka ni {senderName}",
"@cuddleContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"hugContent": "Niyakap ka ni {senderName}",
"@hugContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"anyoneCanJoin": "Pwede sumali ang anumang tao",
"@anyoneCanJoin": {
"type": "text",
"placeholders": {}
},
"appLock": "Lock ng app",
"@appLock": {
"type": "text",
"placeholders": {}
},
"archive": "Archive",
"@archive": {
"type": "text",
"placeholders": {}
},
"areGuestsAllowedToJoin": "Pwede ba sumali ang mga bisita",
"@areGuestsAllowedToJoin": {
"type": "text",
"placeholders": {}
},
"areYouSure": "Sigurado ka?",
"@areYouSure": {
"type": "text",
"placeholders": {}
},
"askVerificationRequest": "Tanggapin ang hiling ng verification mula sa {username}?",
"@askVerificationRequest": {
"type": "text",
"placeholders": {
"username": {}
}
},
"autoplayImages": "Awtomatikong i-play ang mga gumagalaw na sticker at emote",
"@autoplayImages": {
"type": "text",
"placeholder": {}
},
"sendTypingNotifications": "Ipadala ang mga typing notification",
"@sendTypingNotifications": {},
"blockDevice": "I-block ang Device",
"@blockDevice": {
"type": "text",
"placeholders": {}
},
"blocked": "Na-block",
"@blocked": {
"type": "text",
"placeholders": {}
},
"changeDeviceName": "Palitan ang pangalan ng device",
"@changeDeviceName": {
"type": "text",
"placeholders": {}
},
"changedTheChatAvatar": "Pinalitan ni {username} ang avatar ng chat",
"@changedTheChatAvatar": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheGuestAccessRules": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita",
"@changedTheGuestAccessRules": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheHistoryVisibility": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history",
"@changedTheHistoryVisibility": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheHistoryVisibilityTo": "Pinalitan ni {username} ang kakayahan ng pagkikita ng history sa: {rules}",
"@changedTheHistoryVisibilityTo": {
"type": "text",
"placeholders": {
"username": {},
"rules": {}
}
},
"changedTheRoomAliases": "Pinalitan ni {username} ang mga alias ng room",
"@changedTheRoomAliases": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changePassword": "Palitan ang password",
"@changePassword": {
"type": "text",
"placeholders": {}
},
"changeYourAvatar": "Palitan ang iyong avatar",
"@changeYourAvatar": {
"type": "text",
"placeholders": {}
},
"channelCorruptedDecryptError": "Nasira ang encryption",
"@channelCorruptedDecryptError": {
"type": "text",
"placeholders": {}
},
"chat": "Chat",
"@chat": {
"type": "text",
"placeholders": {}
},
"chatBackup": "Pag-backup ng chat",
"@chatBackup": {
"type": "text",
"placeholders": {}
},
"chatDetails": "Mga detalye ng chat",
"@chatDetails": {
"type": "text",
"placeholders": {}
},
"chatHasBeenAddedToThisSpace": "Nadagdag ang chat sa space na ito",
"@chatHasBeenAddedToThisSpace": {},
"chats": "Mga Chat",
"@chats": {
"type": "text",
"placeholders": {}
},
"chooseAStrongPassword": "Pumili ng malakas na password",
"@chooseAStrongPassword": {
"type": "text",
"placeholders": {}
},
"clearArchive": "I-clear ang archive",
"@clearArchive": {},
"close": "Isara",
"@close": {
"type": "text",
"placeholders": {}
},
"commandHint_markasgroup": "Markahan bilang grupo",
"@commandHint_markasgroup": {},
"commandHint_ban": "Pagbawalan ang ibinigay na user sa room na ito",
"@commandHint_ban": {
"type": "text",
"description": "Usage hint for the command /ban"
},
"repeatPassword": "Ulitin ang password",
"@repeatPassword": {},
"notAnImage": "Hindi isang file na larawan.",
"@notAnImage": {},
"replace": "Palitan",
"@replace": {},
"about": "Tungkol sa",
"@about": {
"type": "text",
"placeholders": {}
},
"acceptedTheInvitation": "👍 Tinanggap ni {username} ang imbitasyon",
"@acceptedTheInvitation": {
"type": "text",
"placeholders": {
"username": {}
}
},
"activatedEndToEndEncryption": "🔐 Na-activate ni {username} ang end to end encryption",
"@activatedEndToEndEncryption": {
"type": "text",
"placeholders": {
"username": {}
}
},
"supposedMxid": "Dapat ito ay {mxid}",
"@supposedMxid": {
"type": "text",
"placeholders": {
"mxid": {}
}
},
"addToSpace": "Idagdag sa space",
"@addToSpace": {},
"commandHint_hug": "Magpadala ng yakap",
"@commandHint_hug": {},
"googlyEyesContent": "Nagpadala si {senderName} ng googly eyes",
"@googlyEyesContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"answeredTheCall": "Sinagot ni {senderName} ang tawag",
"@answeredTheCall": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"areYouSureYouWantToLogout": "Sigurado kang gusto mong mag-log out?",
"@areYouSureYouWantToLogout": {
"type": "text",
"placeholders": {}
},
"askSSSSSign": "Para i-sign ang isa pang tao, pakilagay ang iyong secure store passphrase o recovery key.",
"@askSSSSSign": {
"type": "text",
"placeholders": {}
},
"badServerLoginTypesException": "Ang homeserver ay sinusuportahan ang sumusunod na uri ng login:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang:\n{supportedVersions}",
"@badServerLoginTypesException": {
"type": "text",
"placeholders": {
"serverVersions": {},
"supportedVersions": {}
}
},
"sendOnEnter": "Ipadala sa pagpindot ng enter",
"@sendOnEnter": {},
"badServerVersionsException": "Ang homeserver ay sinusuportahan ang mga Spec bersyon:\n{serverVersions}\nNgunit sinusuportahan lang ng app ang {supportedVersions}",
"@badServerVersionsException": {
"type": "text",
"placeholders": {
"serverVersions": {},
"supportedVersions": {}
}
},
"banFromChat": "Pagbawalan sa chat",
"@banFromChat": {
"type": "text",
"placeholders": {}
},
"banned": "Pinagbawalan",
"@banned": {
"type": "text",
"placeholders": {}
},
"botMessages": "Mga mensahe ng bot",
"@botMessages": {
"type": "text",
"placeholders": {}
},
"cancel": "Kanselahin",
"@cancel": {
"type": "text",
"placeholders": {}
},
"bannedUser": "Pinagbawalan ni {username} si {targetName}",
"@bannedUser": {
"type": "text",
"placeholders": {
"username": {},
"targetName": {}
}
},
"cantOpenUri": "Hindi mabuksan ang URI na {uri}",
"@cantOpenUri": {
"type": "text",
"placeholders": {
"uri": {}
}
},
"changedTheJoinRules": "Pinalitan ni {username} ang mga tuntunin sa pagsali",
"@changedTheJoinRules": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheJoinRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pagsali sa: {joinRules}",
"@changedTheJoinRulesTo": {
"type": "text",
"placeholders": {
"username": {},
"joinRules": {}
}
},
"changedTheChatDescriptionTo": "Pinalitan ni {username} ang deskripsyon ng chat sa: '{description}'",
"@changedTheChatDescriptionTo": {
"type": "text",
"placeholders": {
"username": {},
"description": {}
}
},
"changedTheProfileAvatar": "Pinalitan ni {username} ang kanilang avatar",
"@changedTheProfileAvatar": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheChatNameTo": "Pinalitan ni {username} ang pangalan ng chat sa: '{chatname}'",
"@changedTheChatNameTo": {
"type": "text",
"placeholders": {
"username": {},
"chatname": {}
}
},
"changedTheRoomInvitationLink": "Pinalitan ni {username} ang link ng imbitasyon",
"@changedTheRoomInvitationLink": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changeTheHomeserver": "Palitan ang homeserver",
"@changeTheHomeserver": {
"type": "text",
"placeholders": {}
},
"changeTheme": "Palitan ang iyong istilio",
"@changeTheme": {
"type": "text",
"placeholders": {}
},
"changedTheChatPermissions": "Pinalitan ni {username} ang mga pahintulot ng chat",
"@changedTheChatPermissions": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changeTheNameOfTheGroup": "Palitan ng pangalan ng grupo",
"@changeTheNameOfTheGroup": {
"type": "text",
"placeholders": {}
},
"changedTheDisplaynameTo": "Pinalitan ni {username} ang kanilang displayname sa: '{displayname}'",
"@changedTheDisplaynameTo": {
"type": "text",
"placeholders": {
"username": {},
"displayname": {}
}
},
"yourChatBackupHasBeenSetUp": "Na-set up na ang iyong chat backup.",
"@yourChatBackupHasBeenSetUp": {},
"chatBackupDescription": "Naka-secure ang iyong mga lumang mensahe gamit ng recovery key. Siguraduhing hindi mo ito mawalan.",
"@chatBackupDescription": {
"type": "text",
"placeholders": {}
},
"commandHint_markasdm": "Markahan bilang direktang mensahe na room para sa ibinigay na Matrix ID",
"@commandHint_markasdm": {},
"changedTheGuestAccessRulesTo": "Pinalitan ni {username} ang mga tuntunin sa pag-access ng bisita sa: {rules}",
"@changedTheGuestAccessRulesTo": {
"type": "text",
"placeholders": {
"username": {},
"rules": {}
}
},
"commandHint_clearcache": "I-clear ang cache",
"@commandHint_clearcache": {
"type": "text",
"description": "Usage hint for the command /clearcache"
},
"commandHint_discardsession": "Iwaksi ang sesyon",
"@commandHint_discardsession": {
"type": "text",
"description": "Usage hint for the command /discardsession"
},
"commandHint_create": "Gumawa ng walang lamang group chat\nGumamit ng --no-encryption para i-disable ang encryption",
"@commandHint_create": {
"type": "text",
"description": "Usage hint for the command /create"
},
"configureChat": "I-configure ang chat",
"@configureChat": {
"type": "text",
"placeholders": {}
},
"confirm": "Kumpirmahin",
"@confirm": {
"type": "text",
"placeholders": {}
},
"compareNumbersMatch": "Paki-kumpara ang mga numero",
"@compareNumbersMatch": {
"type": "text",
"placeholders": {}
},
"copiedToClipboard": "Kinopya sa clipboard",
"@copiedToClipboard": {
"type": "text",
"placeholders": {}
},
"copy": "Kopyahin",
"@copy": {
"type": "text",
"placeholders": {}
},
"copyToClipboard": "Kopyahin sa clipboard",
"@copyToClipboard": {
"type": "text",
"placeholders": {}
},
"countParticipants": "{count} mga kasali",
"@countParticipants": {
"type": "text",
"placeholders": {
"count": {}
}
},
"createdTheChat": "💬 Ginawa ni {username} ang chat",
"@createdTheChat": {
"type": "text",
"placeholders": {
"username": {}
}
},
"createGroup": "Gumawa ng grupo",
"@createGroup": {},
"createNewSpace": "Bagong space",
"@createNewSpace": {
"type": "text",
"placeholders": {}
},
"currentlyActive": "Kasalukuyang aktibo",
"@currentlyActive": {
"type": "text",
"placeholders": {}
},
"darkTheme": "Madilim",
"@darkTheme": {
"type": "text",
"placeholders": {}
},
"displaynameHasBeenChanged": "Pinalitan na ang display name",
"@displaynameHasBeenChanged": {
"type": "text",
"placeholders": {}
},
"directChats": "Mga Direktang Chat",
"@directChats": {
"type": "text",
"placeholders": {}
},
"allRooms": "Lahat ng Mga Group Chat",
"@allRooms": {
"type": "text",
"placeholders": {}
},
"downloadFile": "I-download ang file",
"@downloadFile": {
"type": "text",
"placeholders": {}
},
"editBlockedServers": "I-edit ang mga naka-block na server",
"@editBlockedServers": {
"type": "text",
"placeholders": {}
},
"chatPermissions": "Mga pahintulot ng chat",
"@chatPermissions": {},
"editDisplayname": "I-edit ang display name",
"@editDisplayname": {
"type": "text",
"placeholders": {}
},
"editRoomAliases": "I-edit ang mga alyas ng room",
"@editRoomAliases": {
"type": "text",
"placeholders": {}
},
"edit": "I-edit",
"@edit": {
"type": "text",
"placeholders": {}
},
"editRoomAvatar": "I-edit ang avatar ng room",
"@editRoomAvatar": {
"type": "text",
"placeholders": {}
},
"emoteExists": "Umiiral na ang emote!",
"@emoteExists": {
"type": "text",
"placeholders": {}
},
"emptyChat": "Walang lamang chat",
"@emptyChat": {
"type": "text",
"placeholders": {}
},
"enableEncryption": "I-enable ang encryption",
"@enableEncryption": {
"type": "text",
"placeholders": {}
},
"encryption": "Pag-encrypt",
"@encryption": {
"type": "text",
"placeholders": {}
},
"encrypted": "Naka-encrypt",
"@encrypted": {
"type": "text",
"placeholders": {}
},
"encryptionNotEnabled": "Hindi naka-enable ang encryption",
"@encryptionNotEnabled": {
"type": "text",
"placeholders": {}
},
"everythingReady": "Handa na ang lahat!",
"@everythingReady": {
"type": "text",
"placeholders": {}
},
"appLockDescription": "I-lock ang app kapag hindi ginagamit sa pamamagitan ng pin code",
"@appLockDescription": {},
"commandHint_dm": "Magsimula ng direktong chat\nGumamit ng --no-encryptiom para i-disable ang encryption",
"@commandHint_dm": {
"type": "text",
"description": "Usage hint for the command /dm"
},
"commandHint_html": "Magpadala ng HTML-formatted na text",
"@commandHint_html": {
"type": "text",
"description": "Usage hint for the command /html"
},
"commandHint_invite": "Imbitahan ang ibinigay na user sa room na ito",
"@commandHint_invite": {
"type": "text",
"description": "Usage hint for the command /invite"
},
"commandHint_join": "Sumali sa ibinigay na room",
"@commandHint_join": {
"type": "text",
"description": "Usage hint for the command /join"
},
"commandHint_kick": "Tanggalin ang ibinigay na user sa room na ito",
"@commandHint_kick": {
"type": "text",
"description": "Usage hint for the command /kick"
},
"commandHint_leave": "Umalis sa room na ito",
"@commandHint_leave": {
"type": "text",
"description": "Usage hint for the command /leave"
},
"commandHint_me": "Ilarawan ang iyong sarili",
"@commandHint_me": {
"type": "text",
"description": "Usage hint for the command /me"
},
"commandHint_myroomavatar": "Ilapat ang iyong larawan para sa room na ito (bilang mxc-uri)",
"@commandHint_myroomavatar": {
"type": "text",
"description": "Usage hint for the command /myroomavatar"
},
"commandHint_myroomnick": "Ilapat ang iyong display name para sa room na ito",
"@commandHint_myroomnick": {
"type": "text",
"description": "Usage hint for the command /myroomnick"
},
"commandHint_op": "Ilapat ang level ng lakas sa ibinigay na user (default: 50)",
"@commandHint_op": {
"type": "text",
"description": "Usage hint for the command /op"
},
"commandHint_react": "Magpadala ng reply bilang reaksyon",
"@commandHint_react": {
"type": "text",
"description": "Usage hint for the command /react"
},
"commandHint_send": "Magpadala ng text",
"@commandHint_send": {
"type": "text",
"description": "Usage hint for the command /send"
},
"commandHint_unban": "I-unban ang ibinigay na user sa room na ito",
"@commandHint_unban": {
"type": "text",
"description": "Usage hint for the command /unban"
},
"commandInvalid": "Hindi wastong command",
"@commandInvalid": {
"type": "text"
},
"compareEmojiMatch": "Paki-kumpara ang mga emoji",
"@compareEmojiMatch": {
"type": "text",
"placeholders": {}
},
"connect": "Kumonekta",
"@connect": {
"type": "text",
"placeholders": {}
},
"containsDisplayName": "Naglalaman ng display name",
"@containsDisplayName": {
"type": "text",
"placeholders": {}
},
"create": "Gumawa",
"@create": {
"type": "text",
"placeholders": {}
},
"dateAndTimeOfDay": "{date}, {timeOfDay}",
"@dateAndTimeOfDay": {
"type": "text",
"placeholders": {
"date": {},
"timeOfDay": {}
}
},
"dateWithoutYear": "{month}/{day}",
"@dateWithoutYear": {
"type": "text",
"placeholders": {
"month": {},
"day": {}
}
},
"dateWithYear": "{month}/{day}/{year}",
"@dateWithYear": {
"type": "text",
"placeholders": {
"year": {},
"month": {},
"day": {}
}
},
"deactivateAccountWarning": "Ide-deactivate nito ang iyong user account. Hindi na ito maaaring bawiin! Sigurado ka?",
"@deactivateAccountWarning": {
"type": "text",
"placeholders": {}
},
"delete": "Burahin",
"@delete": {
"type": "text",
"placeholders": {}
},
"deleteMessage": "Burahin ang mensahe",
"@deleteMessage": {
"type": "text",
"placeholders": {}
},
"device": "Device",
"@device": {
"type": "text",
"placeholders": {}
},
"deviceId": "ID ng Device",
"@deviceId": {
"type": "text",
"placeholders": {}
},
"devices": "Mga Device",
"@devices": {
"type": "text",
"placeholders": {}
},
"emoteInvalid": "Hindi wastong shortcode ng emote!",
"@emoteInvalid": {
"type": "text",
"placeholders": {}
},
"emoteKeyboardNoRecents": "Ang mga kamakailang ginamit na emote ay lalabas dito...",
"@emoteKeyboardNoRecents": {
"type": "text",
"placeholders": {}
},
"calls": "Mga Tawag",
"@calls": {},
"customEmojisAndStickers": "Mga custom emoji at sticker",
"@customEmojisAndStickers": {},
"customEmojisAndStickersBody": "Magdagdag o magbahagi ng mga custom emoji o sticker na maaring gamitin sa anumang chat.",
"@customEmojisAndStickersBody": {},
"emoteShortcode": "Shortcode ng emoji",
"@emoteShortcode": {
"type": "text",
"placeholders": {}
},
"emoteWarnNeedToPick": "Kailangan mong pumili ng emote shortcode at isang larawan!",
"@emoteWarnNeedToPick": {
"type": "text",
"placeholders": {}
},
"enableEmotesGlobally": "I-enable ang emote pack globally",
"@enableEmotesGlobally": {
"type": "text",
"placeholders": {}
},
"endedTheCall": "Tinapos ni {senderName} ang tawag",
"@endedTheCall": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"enterAnEmailAddress": "Maglagay ng email address",
"@enterAnEmailAddress": {
"type": "text",
"placeholders": {}
},
"homeserver": "Homeserver",
"@homeserver": {},
"enterYourHomeserver": "Ilagay ang iyong homeserver",
"@enterYourHomeserver": {
"type": "text",
"placeholders": {}
},
"extremeOffensive": "Lubhang nakakasakit",
"@extremeOffensive": {
"type": "text",
"placeholders": {}
},
"commandHint_plain": "Magpadala ng hindi na-format na text",
"@commandHint_plain": {
"type": "text",
"description": "Usage hint for the command /plain"
},
"commandMissing": "Hindi isang command ang {command}.",
"@commandMissing": {
"type": "text",
"placeholders": {
"command": {}
},
"description": "State that {command} is not a valid /command."
},
"contactHasBeenInvitedToTheGroup": "Inimbita ang contact sa group",
"@contactHasBeenInvitedToTheGroup": {
"type": "text",
"placeholders": {}
},
"containsUserName": "Naglalaman ng username",
"@containsUserName": {
"type": "text",
"placeholders": {}
},
"contentHasBeenReported": "Inulat ang nilalaman sa mga pangangasiwa ng server",
"@contentHasBeenReported": {
"type": "text",
"placeholders": {}
},
"couldNotDecryptMessage": "Hindi ma-decrypt ang mensahe: {error}",
"@couldNotDecryptMessage": {
"type": "text",
"placeholders": {
"error": {}
}
},
"defaultPermissionLevel": "Default na antas ng pahintulot",
"@defaultPermissionLevel": {
"type": "text",
"placeholders": {}
},
"deleteAccount": "Burahin ang account",
"@deleteAccount": {
"type": "text",
"placeholders": {}
},
"emotePacks": "Mga emote pack para sa room",
"@emotePacks": {
"type": "text",
"placeholders": {}
},
"emoteSettings": "Mga Setting ng Emote",
"@emoteSettings": {
"type": "text",
"placeholders": {}
},
"globalChatId": "Global chat ID",
"@globalChatId": {},
"accessAndVisibility": "Pag-access at visibility",
"@accessAndVisibility": {},
"accessAndVisibilityDescription": "Sino ang pinapayagang sumali sa chat at paano matutuklas ang chat.",
"@accessAndVisibilityDescription": {},
"enableEncryptionWarning": "Hindi mo madi-disable ang encryption. Sigurado ka ba?",
"@enableEncryptionWarning": {
"type": "text",
"placeholders": {}
},
"errorObtainingLocation": "Hindi makuha ang lokasyon: {error}",
"@errorObtainingLocation": {
"type": "text",
"placeholders": {
"error": {}
}
},
"fileName": "Pangalan ng file",
"@fileName": {
"type": "text",
"placeholders": {}
},
"fluffychat": "FluffyChat",
"@fluffychat": {
"type": "text",
"placeholders": {}
},
"fontSize": "Laki ng font",
"@fontSize": {
"type": "text",
"placeholders": {}
}
}

View file

@ -2305,118 +2305,75 @@
"@createGroup": {},
"importNow": "Importer maintenant",
"@importNow": {},
"reportErrorDescription": "",
"@reportErrorDescription": {},
"setColorTheme": "",
"@setColorTheme": {},
"banUserDescription": "",
"@banUserDescription": {},
"removeDevicesDescription": "",
"@removeDevicesDescription": {},
"tryAgain": "",
"@tryAgain": {},
"unbanUserDescription": "",
"@unbanUserDescription": {},
"messagesStyle": "",
"@messagesStyle": {},
"chatDescription": "",
"@chatDescription": {},
"pushNotificationsNotAvailable": "",
"@pushNotificationsNotAvailable": {},
"invalidServerName": "",
"@invalidServerName": {},
"signInWithPassword": "",
"@signInWithPassword": {},
"makeAdminDescription": "",
"@makeAdminDescription": {},
"setChatDescription": "",
"@setChatDescription": {},
"redactedBy": "",
"@redactedBy": {
"@reportErrorDescription": {},
"@setColorTheme": {},
"@banUserDescription": {},
"@removeDevicesDescription": {},
"@tryAgain": {},
"@unbanUserDescription": {},
"@messagesStyle": {},
"@chatDescription": {},
"@pushNotificationsNotAvailable": {},
"@invalidServerName": {},
"@signInWithPassword": {},
"@makeAdminDescription": {},
"@setChatDescription": {},
"@redactedBy": {
"type": "text",
"placeholders": {
"username": {}
}
},
"signInWith": "",
"@signInWith": {
"@signInWith": {
"type": "text",
"placeholders": {
"provider": {}
}
},
"optionalRedactReason": "",
"@optionalRedactReason": {},
"archiveRoomDescription": "",
"@archiveRoomDescription": {},
"exportEmotePack": "",
"@exportEmotePack": {},
"redactedByBecause": "",
"@redactedByBecause": {
"@optionalRedactReason": {},
"@archiveRoomDescription": {},
"@exportEmotePack": {},
"@redactedByBecause": {
"type": "text",
"placeholders": {
"username": {},
"reason": {}
}
},
"redactMessageDescription": "",
"@redactMessageDescription": {},
"invalidInput": "",
"@invalidInput": {},
"report": "",
"@report": {},
"addChatDescription": "",
"@addChatDescription": {},
"hasKnocked": "",
"@hasKnocked": {
"@redactMessageDescription": {},
"@invalidInput": {},
"@report": {},
"@addChatDescription": {},
"@hasKnocked": {
"placeholders": {
"user": {}
}
},
"directChat": "",
"@directChat": {},
"wrongPinEntered": "",
"@wrongPinEntered": {
"@directChat": {},
"@wrongPinEntered": {
"type": "text",
"placeholders": {
"seconds": {}
}
},
"sendTypingNotifications": "",
"@sendTypingNotifications": {},
"inviteGroupChat": "",
"@inviteGroupChat": {},
"invitePrivateChat": "",
"@invitePrivateChat": {},
"noChatDescriptionYet": "",
"@noChatDescriptionYet": {},
"learnMore": "",
"@learnMore": {},
"roomUpgradeDescription": "",
"@roomUpgradeDescription": {},
"pleaseEnterANumber": "",
"@pleaseEnterANumber": {},
"profileNotFound": "",
"@profileNotFound": {},
"jump": "",
"@jump": {},
"shareInviteLink": "",
"@shareInviteLink": {},
"emoteKeyboardNoRecents": "",
"@emoteKeyboardNoRecents": {
"@sendTypingNotifications": {},
"@inviteGroupChat": {},
"@invitePrivateChat": {},
"@noChatDescriptionYet": {},
"@learnMore": {},
"@roomUpgradeDescription": {},
"@pleaseEnterANumber": {},
"@profileNotFound": {},
"@jump": {},
"@shareInviteLink": {},
"@emoteKeyboardNoRecents": {
"type": "text",
"placeholders": {}
},
"setTheme": "",
"@setTheme": {},
"replace": "",
"@replace": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "",
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"kickUserDescription": "",
"@kickUserDescription": {},
"invite": "",
"@invite": {},
"openLinkInBrowser": "",
"@openLinkInBrowser": {}
"@setTheme": {},
"@replace": {},
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"@kickUserDescription": {},
"@invite": {},
"@openLinkInBrowser": {}
}

View file

@ -1950,471 +1950,299 @@
"type": "text",
"placeholders": {}
},
"hugContent": "",
"@hugContent": {
"@hugContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"jumpToLastReadMessage": "",
"@jumpToLastReadMessage": {},
"allRooms": "",
"@allRooms": {
"@jumpToLastReadMessage": {},
"@allRooms": {
"type": "text",
"placeholders": {}
},
"commandHint_cuddle": "",
"@commandHint_cuddle": {},
"widgetVideo": "",
"@widgetVideo": {},
"dismiss": "",
"@dismiss": {},
"reportErrorDescription": "",
"@reportErrorDescription": {},
"unsupportedAndroidVersion": "",
"@unsupportedAndroidVersion": {},
"widgetJitsi": "",
"@widgetJitsi": {},
"messageType": "",
"@messageType": {},
"indexedDbErrorLong": "",
"@indexedDbErrorLong": {},
"oneClientLoggedOut": "",
"@oneClientLoggedOut": {},
"startFirstChat": "",
"@startFirstChat": {},
"callingAccount": "",
"@callingAccount": {},
"setColorTheme": "",
"@setColorTheme": {},
"nextAccount": "",
"@nextAccount": {},
"allSpaces": "",
"@allSpaces": {},
"supposedMxid": "",
"@supposedMxid": {
"@commandHint_cuddle": {},
"@widgetVideo": {},
"@dismiss": {},
"@reportErrorDescription": {},
"@unsupportedAndroidVersion": {},
"@widgetJitsi": {},
"@messageType": {},
"@indexedDbErrorLong": {},
"@oneClientLoggedOut": {},
"@startFirstChat": {},
"@callingAccount": {},
"@setColorTheme": {},
"@nextAccount": {},
"@allSpaces": {},
"@supposedMxid": {
"type": "text",
"placeholders": {
"mxid": {}
}
},
"user": "",
"@user": {},
"youAcceptedTheInvitation": "",
"@youAcceptedTheInvitation": {},
"youInvitedBy": "",
"@youInvitedBy": {
"@user": {},
"@youAcceptedTheInvitation": {},
"@youInvitedBy": {
"placeholders": {
"user": {}
}
},
"banUserDescription": "",
"@banUserDescription": {},
"widgetEtherpad": "",
"@widgetEtherpad": {},
"removeDevicesDescription": "",
"@removeDevicesDescription": {},
"separateChatTypes": "",
"@separateChatTypes": {
"@banUserDescription": {},
"@widgetEtherpad": {},
"@removeDevicesDescription": {},
"@separateChatTypes": {
"type": "text",
"placeholders": {}
},
"tryAgain": "",
"@tryAgain": {},
"youKickedAndBanned": "",
"@youKickedAndBanned": {
"@tryAgain": {},
"@youKickedAndBanned": {
"placeholders": {
"user": {}
}
},
"unbanUserDescription": "",
"@unbanUserDescription": {},
"youRejectedTheInvitation": "",
"@youRejectedTheInvitation": {},
"otherCallingPermissions": "",
"@otherCallingPermissions": {},
"messagesStyle": "",
"@messagesStyle": {},
"widgetUrlError": "",
"@widgetUrlError": {},
"newSpaceDescription": "",
"@newSpaceDescription": {},
"chatDescription": "",
"@chatDescription": {},
"callingAccountDetails": "",
"@callingAccountDetails": {},
"enterSpace": "",
"@enterSpace": {},
"encryptThisChat": "",
"@encryptThisChat": {},
"previousAccount": "",
"@previousAccount": {},
"reopenChat": "",
"@reopenChat": {},
"pleaseEnterRecoveryKey": "",
"@pleaseEnterRecoveryKey": {},
"widgetNameError": "",
"@widgetNameError": {},
"addToBundle": "",
"@addToBundle": {},
"addWidget": "",
"@addWidget": {},
"countFiles": "",
"@countFiles": {
"@unbanUserDescription": {},
"@youRejectedTheInvitation": {},
"@otherCallingPermissions": {},
"@messagesStyle": {},
"@widgetUrlError": {},
"@newSpaceDescription": {},
"@chatDescription": {},
"@callingAccountDetails": {},
"@enterSpace": {},
"@encryptThisChat": {},
"@previousAccount": {},
"@reopenChat": {},
"@pleaseEnterRecoveryKey": {},
"@widgetNameError": {},
"@addToBundle": {},
"@addWidget": {},
"@countFiles": {
"placeholders": {
"count": {}
}
},
"noKeyForThisMessage": "",
"@noKeyForThisMessage": {},
"commandHint_markasgroup": "",
"@commandHint_markasgroup": {},
"hydrateTor": "",
"@hydrateTor": {},
"pushNotificationsNotAvailable": "",
"@pushNotificationsNotAvailable": {},
"storeInAppleKeyChain": "",
"@storeInAppleKeyChain": {},
"hydrate": "",
"@hydrate": {},
"invalidServerName": "",
"@invalidServerName": {},
"chatPermissions": "",
"@chatPermissions": {},
"sender": "",
"@sender": {},
"storeInAndroidKeystore": "",
"@storeInAndroidKeystore": {},
"signInWithPassword": "",
"@signInWithPassword": {},
"makeAdminDescription": "",
"@makeAdminDescription": {},
"saveKeyManuallyDescription": "",
"@saveKeyManuallyDescription": {},
"editBundlesForAccount": "",
"@editBundlesForAccount": {},
"whyIsThisMessageEncrypted": "",
"@whyIsThisMessageEncrypted": {},
"setChatDescription": "",
"@setChatDescription": {},
"importFromZipFile": "",
"@importFromZipFile": {},
"dehydrateWarning": "",
"@dehydrateWarning": {},
"noOtherDevicesFound": "",
"@noOtherDevicesFound": {},
"redactedBy": "",
"@redactedBy": {
"@noKeyForThisMessage": {},
"@commandHint_markasgroup": {},
"@hydrateTor": {},
"@pushNotificationsNotAvailable": {},
"@storeInAppleKeyChain": {},
"@hydrate": {},
"@invalidServerName": {},
"@chatPermissions": {},
"@sender": {},
"@storeInAndroidKeystore": {},
"@signInWithPassword": {},
"@makeAdminDescription": {},
"@saveKeyManuallyDescription": {},
"@editBundlesForAccount": {},
"@whyIsThisMessageEncrypted": {},
"@setChatDescription": {},
"@importFromZipFile": {},
"@dehydrateWarning": {},
"@noOtherDevicesFound": {},
"@redactedBy": {
"type": "text",
"placeholders": {
"username": {}
}
},
"signInWith": "",
"@signInWith": {
"@signInWith": {
"type": "text",
"placeholders": {
"provider": {}
}
},
"fileIsTooBigForServer": "",
"@fileIsTooBigForServer": {},
"callingPermissions": "",
"@callingPermissions": {},
"readUpToHere": "",
"@readUpToHere": {},
"start": "",
"@start": {},
"unlockOldMessages": "",
"@unlockOldMessages": {},
"numChats": "",
"@numChats": {
"@fileIsTooBigForServer": {},
"@callingPermissions": {},
"@readUpToHere": {},
"@start": {},
"@unlockOldMessages": {},
"@numChats": {
"type": "number",
"placeholders": {
"number": {}
}
},
"optionalRedactReason": "",
"@optionalRedactReason": {},
"dehydrate": "",
"@dehydrate": {},
"archiveRoomDescription": "",
"@archiveRoomDescription": {},
"exportEmotePack": "",
"@exportEmotePack": {},
"switchToAccount": "",
"@switchToAccount": {
"@optionalRedactReason": {},
"@dehydrate": {},
"@archiveRoomDescription": {},
"@exportEmotePack": {},
"@switchToAccount": {
"type": "number",
"placeholders": {
"number": {}
}
},
"experimentalVideoCalls": "",
"@experimentalVideoCalls": {},
"pleaseEnterRecoveryKeyDescription": "",
"@pleaseEnterRecoveryKeyDescription": {},
"inviteContactToGroupQuestion": "",
"@inviteContactToGroupQuestion": {},
"redactedByBecause": "",
"@redactedByBecause": {
"@experimentalVideoCalls": {},
"@pleaseEnterRecoveryKeyDescription": {},
"@inviteContactToGroupQuestion": {},
"@redactedByBecause": {
"type": "text",
"placeholders": {
"username": {},
"reason": {}
}
},
"youHaveWithdrawnTheInvitationFor": "",
"@youHaveWithdrawnTheInvitationFor": {
"@youHaveWithdrawnTheInvitationFor": {
"placeholders": {
"user": {}
}
},
"appearOnTopDetails": "",
"@appearOnTopDetails": {},
"enterRoom": "",
"@enterRoom": {},
"reportUser": "",
"@reportUser": {},
"confirmEventUnpin": "",
"@confirmEventUnpin": {},
"youInvitedUser": "",
"@youInvitedUser": {
"@appearOnTopDetails": {},
"@enterRoom": {},
"@reportUser": {},
"@confirmEventUnpin": {},
"@youInvitedUser": {
"placeholders": {
"user": {}
}
},
"fileHasBeenSavedAt": "",
"@fileHasBeenSavedAt": {
"@fileHasBeenSavedAt": {
"type": "text",
"placeholders": {
"path": {}
}
},
"redactMessageDescription": "",
"@redactMessageDescription": {},
"recoveryKey": "",
"@recoveryKey": {},
"commandHint_discardsession": "",
"@commandHint_discardsession": {
"@redactMessageDescription": {},
"@recoveryKey": {},
"@commandHint_discardsession": {
"type": "text",
"description": "Usage hint for the command /discardsession"
},
"invalidInput": "",
"@invalidInput": {},
"dehydrateTorLong": "",
"@dehydrateTorLong": {},
"doNotShowAgain": "",
"@doNotShowAgain": {},
"report": "",
"@report": {},
"unverified": "",
"@unverified": {},
"hideUnimportantStateEvents": "",
"@hideUnimportantStateEvents": {},
"screenSharingTitle": "",
"@screenSharingTitle": {},
"widgetCustom": "",
"@widgetCustom": {},
"addToSpaceDescription": "",
"@addToSpaceDescription": {},
"googlyEyesContent": "",
"@googlyEyesContent": {
"@invalidInput": {},
"@dehydrateTorLong": {},
"@doNotShowAgain": {},
"@report": {},
"@unverified": {},
"@hideUnimportantStateEvents": {},
"@screenSharingTitle": {},
"@widgetCustom": {},
"@addToSpaceDescription": {},
"@googlyEyesContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"youBannedUser": "",
"@youBannedUser": {
"@youBannedUser": {
"placeholders": {
"user": {}
}
},
"addChatDescription": "",
"@addChatDescription": {},
"hasKnocked": "",
"@hasKnocked": {
"@addChatDescription": {},
"@hasKnocked": {
"placeholders": {
"user": {}
}
},
"publish": "",
"@publish": {},
"openLinkInBrowser": "",
"@openLinkInBrowser": {},
"messageInfo": "",
"@messageInfo": {},
"disableEncryptionWarning": "",
"@disableEncryptionWarning": {},
"directChat": "",
"@directChat": {},
"wrongPinEntered": "",
"@wrongPinEntered": {
"@publish": {},
"@openLinkInBrowser": {},
"@messageInfo": {},
"@disableEncryptionWarning": {},
"@directChat": {},
"@wrongPinEntered": {
"type": "text",
"placeholders": {
"seconds": {}
}
},
"sendTypingNotifications": "",
"@sendTypingNotifications": {},
"inviteGroupChat": "",
"@inviteGroupChat": {},
"appearOnTop": "",
"@appearOnTop": {},
"invitePrivateChat": "",
"@invitePrivateChat": {},
"foregroundServiceRunning": "",
"@foregroundServiceRunning": {},
"voiceCall": "",
"@voiceCall": {},
"importEmojis": "",
"@importEmojis": {},
"wasDirectChatDisplayName": "",
"@wasDirectChatDisplayName": {
"@sendTypingNotifications": {},
"@inviteGroupChat": {},
"@appearOnTop": {},
"@invitePrivateChat": {},
"@foregroundServiceRunning": {},
"@voiceCall": {},
"@importEmojis": {},
"@wasDirectChatDisplayName": {
"type": "text",
"placeholders": {
"oldDisplayName": {}
}
},
"noChatDescriptionYet": "",
"@noChatDescriptionYet": {},
"removeFromBundle": "",
"@removeFromBundle": {},
"confirmMatrixId": "",
"@confirmMatrixId": {},
"learnMore": "",
"@learnMore": {},
"notAnImage": "",
"@notAnImage": {},
"users": "",
"@users": {},
"openGallery": "",
"@openGallery": {},
"chatDescriptionHasBeenChanged": "",
"@chatDescriptionHasBeenChanged": {},
"newGroup": "",
"@newGroup": {},
"bundleName": "",
"@bundleName": {},
"dehydrateTor": "",
"@dehydrateTor": {},
"removeFromSpace": "",
"@removeFromSpace": {},
"roomUpgradeDescription": "",
"@roomUpgradeDescription": {},
"pleaseEnterANumber": "",
"@pleaseEnterANumber": {},
"youKicked": "",
"@youKicked": {
"@noChatDescriptionYet": {},
"@removeFromBundle": {},
"@confirmMatrixId": {},
"@learnMore": {},
"@notAnImage": {},
"@users": {},
"@openGallery": {},
"@chatDescriptionHasBeenChanged": {},
"@newGroup": {},
"@bundleName": {},
"@dehydrateTor": {},
"@removeFromSpace": {},
"@roomUpgradeDescription": {},
"@pleaseEnterANumber": {},
"@youKicked": {
"placeholders": {
"user": {}
}
},
"profileNotFound": "",
"@profileNotFound": {},
"jump": "",
"@jump": {},
"reactedWith": "",
"@reactedWith": {
"@profileNotFound": {},
"@jump": {},
"@reactedWith": {
"type": "text",
"placeholders": {
"sender": {},
"reaction": {}
}
},
"sorryThatsNotPossible": "",
"@sorryThatsNotPossible": {},
"videoWithSize": "",
"@videoWithSize": {
"@sorryThatsNotPossible": {},
"@videoWithSize": {
"type": "text",
"placeholders": {
"size": {}
}
},
"shareInviteLink": "",
"@shareInviteLink": {},
"commandHint_markasdm": "",
"@commandHint_markasdm": {},
"recoveryKeyLost": "",
"@recoveryKeyLost": {},
"cuddleContent": "",
"@cuddleContent": {
"@shareInviteLink": {},
"@commandHint_markasdm": {},
"@recoveryKeyLost": {},
"@cuddleContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"deviceKeys": "",
"@deviceKeys": {},
"emoteKeyboardNoRecents": "",
"@emoteKeyboardNoRecents": {
"@deviceKeys": {},
"@emoteKeyboardNoRecents": {
"type": "text",
"placeholders": {}
},
"setTheme": "",
"@setTheme": {},
"youJoinedTheChat": "",
"@youJoinedTheChat": {},
"markAsRead": "",
"@markAsRead": {},
"widgetName": "",
"@widgetName": {},
"errorAddingWidget": "",
"@errorAddingWidget": {},
"commandHint_dm": "",
"@commandHint_dm": {
"@setTheme": {},
"@youJoinedTheChat": {},
"@markAsRead": {},
"@widgetName": {},
"@errorAddingWidget": {},
"@commandHint_dm": {
"type": "text",
"description": "Usage hint for the command /dm"
},
"commandHint_hug": "",
"@commandHint_hug": {},
"replace": "",
"@replace": {},
"youUnbannedUser": "",
"@youUnbannedUser": {
"@commandHint_hug": {},
"@replace": {},
"@youUnbannedUser": {
"placeholders": {
"user": {}
}
},
"newSpace": "",
"@newSpace": {},
"emojis": "",
"@emojis": {},
"commandHint_googly": "",
"@commandHint_googly": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "",
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"createGroup": "",
"@createGroup": {},
"hydrateTorLong": "",
"@hydrateTorLong": {},
"time": "",
"@time": {},
"custom": "",
"@custom": {},
"noBackupWarning": "",
"@noBackupWarning": {},
"storeInSecureStorageDescription": "",
"@storeInSecureStorageDescription": {},
"openChat": "",
"@openChat": {},
"kickUserDescription": "",
"@kickUserDescription": {},
"importNow": "",
"@importNow": {},
"pinMessage": "",
"@pinMessage": {},
"invite": "",
"@invite": {},
"indexedDbErrorTitle": "",
"@indexedDbErrorTitle": {},
"unsupportedAndroidVersionLong": "",
"@unsupportedAndroidVersionLong": {},
"storeSecurlyOnThisDevice": "",
"@storeSecurlyOnThisDevice": {},
"screenSharingDetail": "",
"@screenSharingDetail": {},
"placeCall": "",
"@placeCall": {}
"@newSpace": {},
"@emojis": {},
"@commandHint_googly": {},
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"@createGroup": {},
"@hydrateTorLong": {},
"@time": {},
"@custom": {},
"@noBackupWarning": {},
"@storeInSecureStorageDescription": {},
"@openChat": {},
"@kickUserDescription": {},
"@importNow": {},
"@pinMessage": {},
"@invite": {},
"@indexedDbErrorTitle": {},
"@unsupportedAndroidVersionLong": {},
"@storeSecurlyOnThisDevice": {},
"@screenSharingDetail": {},
"@placeCall": {}
}

View file

@ -2398,7 +2398,7 @@
"@archiveRoomDescription": {},
"invalidInput": "Contido non válido!",
"@invalidInput": {},
"hasKnocked": "déronlle unha labazada a {user}",
"hasKnocked": "🚪 {user} petou na porta",
"@hasKnocked": {
"placeholders": {
"user": {}
@ -2446,7 +2446,7 @@
"@blockListDescription": {},
"blockedUsers": "Usuarias bloqueadas",
"@blockedUsers": {},
"block": "bloquear",
"block": "Bloquer",
"@block": {},
"blockUsername": "Ignorar identificador",
"@blockUsername": {},
@ -2600,5 +2600,111 @@
"placeholders": {}
},
"incomingMessages": "Mensaxes recibidas",
"@incomingMessages": {}
"@incomingMessages": {},
"stickers": "Adhesivos",
"@stickers": {},
"discover": "Descubrir",
"@discover": {},
"commandHint_ignore": "Ignorar o ID matrix indicado",
"@commandHint_ignore": {},
"commandHint_unignore": "Non ignorar o ID matrix indicado",
"@commandHint_unignore": {},
"unreadChatsInApp": "{appname}: {unread} chats sen ler",
"@unreadChatsInApp": {
"type": "text",
"placeholders": {
"appname": {},
"unread": {}
}
},
"noDatabaseEncryption": "Nesta plataforma non temos soporte para cifrar a base de datos",
"@noDatabaseEncryption": {},
"accessAndVisibility": "Acceso e Visibilidade",
"@accessAndVisibility": {},
"accessAndVisibilityDescription": "Quen pode unirse a este chat de que xeito pode ser atopado.",
"@accessAndVisibilityDescription": {},
"customEmojisAndStickers": "Emojis personais e adhesivos",
"@customEmojisAndStickers": {},
"calls": "Chamadas",
"@calls": {},
"hideRedactedMessages": "Agochar mensaxes editadas",
"@hideRedactedMessages": {},
"hideRedactedMessagesBody": "Se alguén corrixe unha mensaxe entón esta xa non será visible no chat.",
"@hideRedactedMessagesBody": {},
"hideInvalidOrUnknownMessageFormats": "Agochar formatos de mensaxe non válidos ou descoñecidos",
"@hideInvalidOrUnknownMessageFormats": {},
"hideMemberChangesInPublicChats": "Agochar cambios dos membros nos chats públicos",
"@hideMemberChangesInPublicChats": {},
"notifyMeFor": "Notificarme sobre",
"@notifyMeFor": {},
"hideMemberChangesInPublicChatsBody": "Non mostrar na cronoloxía se alguén se une ou deixa un chat público, para mellorar a lexibilidade.",
"@hideMemberChangesInPublicChatsBody": {},
"usersMustKnock": "As usuarias teñen que pedir entrar",
"@usersMustKnock": {},
"userWouldLikeToChangeTheChat": "{user} quere unirse ao chat.",
"@userWouldLikeToChangeTheChat": {
"placeholders": {
"user": {}
}
},
"knocking": "A solicitar",
"@knocking": {},
"chatCanBeDiscoveredViaSearchOnServer": "O chat pode ser atopado ao buscar en {server}",
"@chatCanBeDiscoveredViaSearchOnServer": {
"type": "text",
"placeholders": {
"server": {}
}
},
"createNewAddress": "Crear novos enderezos",
"@createNewAddress": {},
"appLockDescription": "Bloquear a app cun código PIN cando non a uses",
"@appLockDescription": {},
"globalChatId": "ID Global do chat",
"@globalChatId": {},
"customEmojisAndStickersBody": "Engade ou comparte emojis personais e adhesivos que poden usarse nos chats.",
"@customEmojisAndStickersBody": {},
"overview": "Vista xeral",
"@overview": {},
"passwordRecoverySettings": "Axustes de recuperación do contrasinal",
"@passwordRecoverySettings": {},
"noPublicLinkHasBeenCreatedYet": "Aínda non se creou unha ligazón pública",
"@noPublicLinkHasBeenCreatedYet": {},
"knock": "Solicitar acceso",
"@knock": {},
"noOneCanJoin": "Ninguén pode unirse",
"@noOneCanJoin": {},
"thereAreCountUsersBlocked": "Agora mesmo hai {count} usuarias bloqueadas.",
"@thereAreCountUsersBlocked": {
"type": "text",
"count": {}
},
"publicChatAddresses": "Enderezos públicos do chat",
"@publicChatAddresses": {},
"userRole": "Rol da usuaria",
"@userRole": {},
"minimumPowerLevel": "{level} é o nivel mínimo de responsabilidade.",
"@minimumPowerLevel": {
"type": "text",
"placeholders": {
"level": {}
}
},
"searchIn": "Buscar no chat \"{chat}\"...",
"@searchIn": {
"type": "text",
"placeholders": {
"chat": {}
}
},
"searchMore": "Buscar máis...",
"@searchMore": {},
"gallery": "Galería",
"@gallery": {},
"files": "Ficheiros",
"@files": {},
"knockRestricted": "Peta á porta",
"@knockRestricted": {},
"restricted": "Non accesible",
"@restricted": {}
}

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

View file

@ -51,5 +51,6 @@
"placeholders": {
"mxid": {}
}
}
},
"@custom": {}
}

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

View file

@ -2204,219 +2204,146 @@
},
"signInWithPassword": "パスワードでログイン",
"@signInWithPassword": {},
"hugContent": "",
"@hugContent": {
"@hugContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"jumpToLastReadMessage": "",
"@jumpToLastReadMessage": {},
"allRooms": "",
"@allRooms": {
"@jumpToLastReadMessage": {},
"@allRooms": {
"type": "text",
"placeholders": {}
},
"commandHint_cuddle": "",
"@commandHint_cuddle": {},
"dismiss": "",
"@dismiss": {},
"reportErrorDescription": "",
"@reportErrorDescription": {},
"indexedDbErrorLong": "",
"@indexedDbErrorLong": {},
"setColorTheme": "",
"@setColorTheme": {},
"supposedMxid": "",
"@supposedMxid": {
"@commandHint_cuddle": {},
"@dismiss": {},
"@reportErrorDescription": {},
"@indexedDbErrorLong": {},
"@setColorTheme": {},
"@supposedMxid": {
"type": "text",
"placeholders": {
"mxid": {}
}
},
"banUserDescription": "",
"@banUserDescription": {},
"widgetEtherpad": "",
"@widgetEtherpad": {},
"removeDevicesDescription": "",
"@removeDevicesDescription": {},
"separateChatTypes": "",
"@separateChatTypes": {
"@banUserDescription": {},
"@widgetEtherpad": {},
"@removeDevicesDescription": {},
"@separateChatTypes": {
"type": "text",
"placeholders": {}
},
"tryAgain": "",
"@tryAgain": {},
"unbanUserDescription": "",
"@unbanUserDescription": {},
"messagesStyle": "",
"@messagesStyle": {},
"newSpaceDescription": "",
"@newSpaceDescription": {},
"chatDescription": "",
"@chatDescription": {},
"callingAccountDetails": "",
"@callingAccountDetails": {},
"noKeyForThisMessage": "",
"@noKeyForThisMessage": {},
"pushNotificationsNotAvailable": "",
"@pushNotificationsNotAvailable": {},
"invalidServerName": "",
"@invalidServerName": {},
"chatPermissions": "",
"@chatPermissions": {},
"makeAdminDescription": "",
"@makeAdminDescription": {},
"saveKeyManuallyDescription": "",
"@saveKeyManuallyDescription": {},
"setChatDescription": "",
"@setChatDescription": {},
"importFromZipFile": "",
"@importFromZipFile": {},
"redactedBy": "",
"@redactedBy": {
"@tryAgain": {},
"@unbanUserDescription": {},
"@messagesStyle": {},
"@newSpaceDescription": {},
"@chatDescription": {},
"@callingAccountDetails": {},
"@noKeyForThisMessage": {},
"@pushNotificationsNotAvailable": {},
"@invalidServerName": {},
"@chatPermissions": {},
"@makeAdminDescription": {},
"@saveKeyManuallyDescription": {},
"@setChatDescription": {},
"@importFromZipFile": {},
"@redactedBy": {
"type": "text",
"placeholders": {
"username": {}
}
},
"fileIsTooBigForServer": "",
"@fileIsTooBigForServer": {},
"readUpToHere": "",
"@readUpToHere": {},
"optionalRedactReason": "",
"@optionalRedactReason": {},
"archiveRoomDescription": "",
"@archiveRoomDescription": {},
"exportEmotePack": "",
"@exportEmotePack": {},
"openInMaps": "",
"@openInMaps": {
"@fileIsTooBigForServer": {},
"@readUpToHere": {},
"@optionalRedactReason": {},
"@archiveRoomDescription": {},
"@exportEmotePack": {},
"@openInMaps": {
"type": "text",
"placeholders": {}
},
"inviteContactToGroupQuestion": "",
"@inviteContactToGroupQuestion": {},
"redactedByBecause": "",
"@redactedByBecause": {
"@inviteContactToGroupQuestion": {},
"@redactedByBecause": {
"type": "text",
"placeholders": {
"username": {},
"reason": {}
}
},
"fileHasBeenSavedAt": "",
"@fileHasBeenSavedAt": {
"@fileHasBeenSavedAt": {
"type": "text",
"placeholders": {
"path": {}
}
},
"redactMessageDescription": "",
"@redactMessageDescription": {},
"invalidInput": "",
"@invalidInput": {},
"report": "",
"@report": {},
"googlyEyesContent": "",
"@googlyEyesContent": {
"@redactMessageDescription": {},
"@invalidInput": {},
"@report": {},
"@googlyEyesContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"addChatDescription": "",
"@addChatDescription": {},
"hasKnocked": "",
"@hasKnocked": {
"@addChatDescription": {},
"@hasKnocked": {
"placeholders": {
"user": {}
}
},
"openLinkInBrowser": "",
"@openLinkInBrowser": {},
"commandHint_me": "",
"@commandHint_me": {
"@openLinkInBrowser": {},
"@commandHint_me": {
"type": "text",
"description": "Usage hint for the command /me"
},
"directChat": "",
"@directChat": {},
"wrongPinEntered": "",
"@wrongPinEntered": {
"@directChat": {},
"@wrongPinEntered": {
"type": "text",
"placeholders": {
"seconds": {}
}
},
"sendTypingNotifications": "",
"@sendTypingNotifications": {},
"inviteGroupChat": "",
"@inviteGroupChat": {},
"appearOnTop": "",
"@appearOnTop": {},
"invitePrivateChat": "",
"@invitePrivateChat": {},
"commandHint_kick": "",
"@commandHint_kick": {
"@sendTypingNotifications": {},
"@inviteGroupChat": {},
"@appearOnTop": {},
"@invitePrivateChat": {},
"@commandHint_kick": {
"type": "text",
"description": "Usage hint for the command /kick"
},
"commandHint_unban": "",
"@commandHint_unban": {
"@commandHint_unban": {
"type": "text",
"description": "Usage hint for the command /unban"
},
"importEmojis": "",
"@importEmojis": {},
"noChatDescriptionYet": "",
"@noChatDescriptionYet": {},
"learnMore": "",
"@learnMore": {},
"notAnImage": "",
"@notAnImage": {},
"chatDescriptionHasBeenChanged": "",
"@chatDescriptionHasBeenChanged": {},
"commandHint_op": "",
"@commandHint_op": {
"@importEmojis": {},
"@noChatDescriptionYet": {},
"@learnMore": {},
"@notAnImage": {},
"@chatDescriptionHasBeenChanged": {},
"@commandHint_op": {
"type": "text",
"description": "Usage hint for the command /op"
},
"roomUpgradeDescription": "",
"@roomUpgradeDescription": {},
"pleaseEnterANumber": "",
"@pleaseEnterANumber": {},
"profileNotFound": "",
"@profileNotFound": {},
"jump": "",
"@jump": {},
"shareInviteLink": "",
"@shareInviteLink": {},
"cuddleContent": "",
"@cuddleContent": {
"@roomUpgradeDescription": {},
"@pleaseEnterANumber": {},
"@profileNotFound": {},
"@jump": {},
"@shareInviteLink": {},
"@cuddleContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"emoteKeyboardNoRecents": "",
"@emoteKeyboardNoRecents": {
"@emoteKeyboardNoRecents": {
"type": "text",
"placeholders": {}
},
"setTheme": "",
"@setTheme": {},
"replace": "",
"@replace": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "",
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"createGroup": "",
"@createGroup": {},
"kickUserDescription": "",
"@kickUserDescription": {},
"importNow": "",
"@importNow": {},
"invite": "",
"@invite": {}
"@setTheme": {},
"@replace": {},
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"@createGroup": {},
"@kickUserDescription": {},
"@importNow": {},
"@invite": {}
}

744
assets/l10n/intl_ka.arb Normal file
View file

@ -0,0 +1,744 @@
{
"alias": "მეტსახელი",
"@alias": {
"type": "text",
"placeholders": {}
},
"appLockDescription": "პინკოდის გამოყენების გარეშე აპლიკაციის ბლოკირება",
"@appLockDescription": {},
"commandHint_hug": "მეგობრული ჩახუტვის გაგზავნა",
"@commandHint_hug": {},
"areYouSure": "დარწმუნებული ხართ?",
"@areYouSure": {
"type": "text",
"placeholders": {}
},
"areYouSureYouWantToLogout": "დარწმუნებული ხართ, რომ გამოსვლა გსურთ?",
"@areYouSureYouWantToLogout": {
"type": "text",
"placeholders": {}
},
"hugContent": "{senderName} მეგობრულად გეხუტება",
"@hugContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"askSSSSSign": "სხვა მომხმარებლის დადასტურებლად, გთხოვთ, ჩაწეროთ თქვენი ან საიდუმლო ფრაზა, ან აღდგენის გასაღები.",
"@askSSSSSign": {
"type": "text",
"placeholders": {}
},
"autoplayImages": "ანიმირებული სტიკერებისა და ემოჯების ავტომატური ჩართვა",
"@autoplayImages": {
"type": "text",
"placeholder": {}
},
"banFromChat": "ჩატიდან გაგდება და ბლოკირება",
"@banFromChat": {
"type": "text",
"placeholders": {}
},
"banned": "დაბლოკილია",
"@banned": {
"type": "text",
"placeholders": {}
},
"badServerLoginTypesException": "ამ სერვერს აქვს შესვლის მეთოდების მხარდაჭერა:\n{serverVersions}\nმაგრამ ამ აპლიკაციას აქვს მხარდაჭერა მხოლოდ:\n{supportedVersions}",
"@badServerLoginTypesException": {
"type": "text",
"placeholders": {
"serverVersions": {},
"supportedVersions": {}
}
},
"sendOnEnter": "გაგზავნა enter-ის დაჭერისას",
"@sendOnEnter": {},
"bannedUser": "{username} დაბლოკა {targetName}",
"@bannedUser": {
"type": "text",
"placeholders": {
"username": {},
"targetName": {}
}
},
"blockDevice": "მოწყობილების ბლოკირება",
"@blockDevice": {
"type": "text",
"placeholders": {}
},
"blocked": "დაბლოკილია",
"@blocked": {
"type": "text",
"placeholders": {}
},
"botMessages": "ბოტის შეტყობინებები",
"@botMessages": {
"type": "text",
"placeholders": {}
},
"cancel": "გაუქმება",
"@cancel": {
"type": "text",
"placeholders": {}
},
"changedTheHistoryVisibilityTo": "{username} შეცვალა ისტორიის ხილვადობა: {rules}",
"@changedTheHistoryVisibilityTo": {
"type": "text",
"placeholders": {
"username": {},
"rules": {}
}
},
"changedTheJoinRules": "{username} გაწევრიანების წესები შეცვალა",
"@changedTheJoinRules": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheProfileAvatar": "{username} შეცვალა პროფილის ფოტო",
"@changedTheProfileAvatar": {
"type": "text",
"placeholders": {
"username": {}
}
},
"chat": "ჩატი",
"@chat": {
"type": "text",
"placeholders": {}
},
"changeYourAvatar": "პროფილის ფოტოს შეცვლა",
"@changeYourAvatar": {
"type": "text",
"placeholders": {}
},
"yourChatBackupHasBeenSetUp": "თქვენი ჩატის სარეზერვო საშუალება კონფიგურირებული იქნა.",
"@yourChatBackupHasBeenSetUp": {},
"channelCorruptedDecryptError": "დაშიფვრა დაზიანდა",
"@channelCorruptedDecryptError": {
"type": "text",
"placeholders": {}
},
"chatBackupDescription": "თქვენი ძველი შეტყობინებები დაცულია აღდგების გასაღებით. არ დაკარგოთ ის.",
"@chatBackupDescription": {
"type": "text",
"placeholders": {}
},
"commandHint_discardsession": "სესიის გაუქმება",
"@commandHint_discardsession": {
"type": "text",
"description": "Usage hint for the command /discardsession"
},
"commandHint_invite": "მოცემული მომხმარებლის მოწვევა ამ ოთახში",
"@commandHint_invite": {
"type": "text",
"description": "Usage hint for the command /invite"
},
"commandHint_plain": "არაფორმატირებული ტექსტის გაგზავნა",
"@commandHint_plain": {
"type": "text",
"description": "Usage hint for the command /plain"
},
"commandHint_send": "ტექსტის გაგზავნა",
"@commandHint_send": {
"type": "text",
"description": "Usage hint for the command /send"
},
"commandMissing": "{command} არაა ბრძანება.",
"@commandMissing": {
"type": "text",
"placeholders": {
"command": {}
},
"description": "State that {command} is not a valid /command."
},
"confirm": "დადასტურება",
"@confirm": {
"type": "text",
"placeholders": {}
},
"connect": "დაკავშირება",
"@connect": {
"type": "text",
"placeholders": {}
},
"countParticipants": "{count} მონაწილე",
"@countParticipants": {
"type": "text",
"placeholders": {
"count": {}
}
},
"createGroup": "ჯგუფის შექმნა",
"@createGroup": {},
"deactivateAccountWarning": "ეს გააუქმებს თქვენს ანგარიშს. ამის გაუქმება შეუძლებელია. დარწმუნებული ხართ?",
"@deactivateAccountWarning": {
"type": "text",
"placeholders": {}
},
"devices": "მოწყობილებები",
"@devices": {
"type": "text",
"placeholders": {}
},
"darkTheme": "ბნელი",
"@darkTheme": {
"type": "text",
"placeholders": {}
},
"chatPermissions": "ჩატის უფლებები",
"@chatPermissions": {},
"dateAndTimeOfDay": "{date}, {timeOfDay}",
"@dateAndTimeOfDay": {
"type": "text",
"placeholders": {
"date": {},
"timeOfDay": {}
}
},
"editRoomAliases": "ოთახის მეტსახელების შეცვლა",
"@editRoomAliases": {
"type": "text",
"placeholders": {}
},
"emoteExists": "ეს ემოცია უკვე არსებობს!",
"@emoteExists": {
"type": "text",
"placeholders": {}
},
"emoteInvalid": "ემოციის არასწორი მოკლე კოდი!",
"@emoteInvalid": {
"type": "text",
"placeholders": {}
},
"importNow": "იმპორტი",
"@importNow": {},
"importEmojis": "ემოჯის იმპორტი",
"@importEmojis": {},
"importFromZipFile": "იმპორტი .zip ფაილიდან",
"@importFromZipFile": {},
"exportEmotePack": "ემოციების .zip ფაილში ექსპორტი",
"@exportEmotePack": {},
"replace": "ჩანაცვლება",
"@replace": {},
"accept": "თანხმობა",
"@accept": {
"type": "text",
"placeholders": {}
},
"acceptedTheInvitation": "👍 {username} მიიღო მოწვევა",
"@acceptedTheInvitation": {
"type": "text",
"placeholders": {
"username": {}
}
},
"account": "ანგარიში",
"@account": {
"type": "text",
"placeholders": {}
},
"addEmail": "ელ.ფოსტის დამატება",
"@addEmail": {
"type": "text",
"placeholders": {}
},
"confirmMatrixId": "გთხოვთ, დაადასტუროთ თქვენი Matrix ID ანგარიშის წაშლისათვის.",
"@confirmMatrixId": {},
"addChatDescription": "ჩატის აღწერილობის დამატება...",
"@addChatDescription": {},
"addToSpace": "სივრცეში დამატება",
"@addToSpace": {},
"admin": "ადმინი",
"@admin": {
"type": "text",
"placeholders": {}
},
"all": "ყველა",
"@all": {
"type": "text",
"placeholders": {}
},
"allChats": "ყველა ჩატი",
"@allChats": {
"type": "text",
"placeholders": {}
},
"commandHint_cuddle": "ჩახუტების გაგზავნა",
"@commandHint_cuddle": {},
"answeredTheCall": "{senderName} უპასუხა ზარს",
"@answeredTheCall": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"anyoneCanJoin": "ყველას შეუძლია გაწევრიანება",
"@anyoneCanJoin": {
"type": "text",
"placeholders": {}
},
"appLock": "აპლიკაციის ბლოკირება",
"@appLock": {
"type": "text",
"placeholders": {}
},
"archive": "არქივი",
"@archive": {
"type": "text",
"placeholders": {}
},
"commandHint_googly": "გამოშტერილი თვალების გაგზავნა",
"@commandHint_googly": {},
"googlyEyesContent": "{senderName} გამოშტერილ თვალებს გიგზავნის",
"@googlyEyesContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"cuddleContent": "{senderName} გეხუტება",
"@cuddleContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"areGuestsAllowedToJoin": "შეუძლიათ თუ არა სტუმარ მომხმარებლებს გაწევრიანება",
"@areGuestsAllowedToJoin": {
"type": "text",
"placeholders": {}
},
"askVerificationRequest": "მიიღებთ {username} დადასტურების მოთხოვნას?",
"@askVerificationRequest": {
"type": "text",
"placeholders": {
"username": {}
}
},
"sendTypingNotifications": "წერის შეტყობინების გაგზავნა",
"@sendTypingNotifications": {},
"cantOpenUri": "ვერ იხსნება ბმული {uri}",
"@cantOpenUri": {
"type": "text",
"placeholders": {
"uri": {}
}
},
"changeDeviceName": "მოწყობილების გადარქმევა",
"@changeDeviceName": {
"type": "text",
"placeholders": {}
},
"changedTheChatAvatar": "{username} ჩატის ფოტო შეცვალა",
"@changedTheChatAvatar": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheChatDescriptionTo": "{username} ჩატის ახალი აღწერილობა დააყენა: '{description}'",
"@changedTheChatDescriptionTo": {
"type": "text",
"placeholders": {
"username": {},
"description": {}
}
},
"changedTheChatNameTo": "{username} ჩატი გადაარქვა: '{chatname}'",
"@changedTheChatNameTo": {
"type": "text",
"placeholders": {
"username": {},
"chatname": {}
}
},
"changedTheChatPermissions": "{username} ჩატის უფლებები შეცვალა",
"@changedTheChatPermissions": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheGuestAccessRules": "{username} შეცვალა სტუმრების წვდომის წესები",
"@changedTheGuestAccessRules": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheGuestAccessRulesTo": "{username} შეცვალა სტუმრების წვდომის წესები: {rules}",
"@changedTheGuestAccessRulesTo": {
"type": "text",
"placeholders": {
"username": {},
"rules": {}
}
},
"changedTheHistoryVisibility": "{username} შეცვალა ისტორიის ხილვადობა",
"@changedTheHistoryVisibility": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheJoinRulesTo": "{username} გაწევრიანების წესები შეცვალა: {joinRules}",
"@changedTheJoinRulesTo": {
"type": "text",
"placeholders": {
"username": {},
"joinRules": {}
}
},
"changedTheRoomAliases": "{username} ოთახის მეტსახელები შეცვალა",
"@changedTheRoomAliases": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changedTheRoomInvitationLink": "{username} მოწვევის ბმული შეცვალა",
"@changedTheRoomInvitationLink": {
"type": "text",
"placeholders": {
"username": {}
}
},
"changePassword": "პაროლის შეცვლა",
"@changePassword": {
"type": "text",
"placeholders": {}
},
"changeTheHomeserver": "სახლის სერვერის შეცვლა",
"@changeTheHomeserver": {
"type": "text",
"placeholders": {}
},
"changeTheme": "სტილის შეცვლა",
"@changeTheme": {
"type": "text",
"placeholders": {}
},
"changeTheNameOfTheGroup": "ჯგუფის გადარქმევა",
"@changeTheNameOfTheGroup": {
"type": "text",
"placeholders": {}
},
"chatBackup": "ჩატის სარეზერვო საშუალება",
"@chatBackup": {
"type": "text",
"placeholders": {}
},
"chatDetails": "ჩატის დეტალები",
"@chatDetails": {
"type": "text",
"placeholders": {}
},
"chatHasBeenAddedToThisSpace": "ჩატი დაემატა ამ სივრცეს",
"@chatHasBeenAddedToThisSpace": {},
"chats": "ჩატები",
"@chats": {
"type": "text",
"placeholders": {}
},
"chooseAStrongPassword": "ძლიერი პაროლი აარჩიეთ",
"@chooseAStrongPassword": {
"type": "text",
"placeholders": {}
},
"clearArchive": "არქივის გაწმენდა",
"@clearArchive": {},
"close": "დახურვა",
"@close": {
"type": "text",
"placeholders": {}
},
"commandHint_markasgroup": "აღნიშვნა, როგორც ჯგუფის",
"@commandHint_markasgroup": {},
"commandHint_ban": "მოცემული მომხმარებლის ბლოკირება ამ ოთახში",
"@commandHint_ban": {
"type": "text",
"description": "Usage hint for the command /ban"
},
"commandHint_clearcache": "­ქეშის გაწმენდა",
"@commandHint_clearcache": {
"type": "text",
"description": "Usage hint for the command /clearcache"
},
"commandHint_join": "მოცემულ ოთახში გაწევრიანება",
"@commandHint_join": {
"type": "text",
"description": "Usage hint for the command /join"
},
"commandHint_kick": "მოცემული მომხმარებლის წაშლა ამ ოთახიდან",
"@commandHint_kick": {
"type": "text",
"description": "Usage hint for the command /kick"
},
"commandHint_leave": "ამ ოთახიდან გასვლა",
"@commandHint_leave": {
"type": "text",
"description": "Usage hint for the command /leave"
},
"commandHint_me": "აღწერეთ თქვენი თავი",
"@commandHint_me": {
"type": "text",
"description": "Usage hint for the command /me"
},
"commandHint_unban": "ამ ოთახში მომხმარებლისგან ბლოკის მოხსნა",
"@commandHint_unban": {
"type": "text",
"description": "Usage hint for the command /unban"
},
"commandInvalid": "არასწორი ბრძანება",
"@commandInvalid": {
"type": "text"
},
"compareEmojiMatch": "გთხოვთ, შეადაროთ ეს ემოჯი",
"@compareEmojiMatch": {
"type": "text",
"placeholders": {}
},
"compareNumbersMatch": "გთხოვთ, შეადაროთ ეს რიცხვები",
"@compareNumbersMatch": {
"type": "text",
"placeholders": {}
},
"configureChat": "ჩატის კონფიგურაცია",
"@configureChat": {
"type": "text",
"placeholders": {}
},
"contactHasBeenInvitedToTheGroup": "კონტაქტი მოწვეული იქნა ჯგუფში",
"@contactHasBeenInvitedToTheGroup": {
"type": "text",
"placeholders": {}
},
"containsUserName": "შეიცავს სახელს",
"@containsUserName": {
"type": "text",
"placeholders": {}
},
"copiedToClipboard": "კოპირებულია ბუფერში",
"@copiedToClipboard": {
"type": "text",
"placeholders": {}
},
"copy": "კოპირება",
"@copy": {
"type": "text",
"placeholders": {}
},
"copyToClipboard": "კოპირება ბუფერში",
"@copyToClipboard": {
"type": "text",
"placeholders": {}
},
"couldNotDecryptMessage": "შეტყობინების გაშიფვრის შეცდომა: {error}",
"@couldNotDecryptMessage": {
"type": "text",
"placeholders": {
"error": {}
}
},
"create": "შექმნა",
"@create": {
"type": "text",
"placeholders": {}
},
"createdTheChat": "💬 {username} შექმნა ჩატი",
"@createdTheChat": {
"type": "text",
"placeholders": {
"username": {}
}
},
"createNewSpace": "ახალი სივრცე",
"@createNewSpace": {
"type": "text",
"placeholders": {}
},
"currentlyActive": "ახლა აქტიურია",
"@currentlyActive": {
"type": "text",
"placeholders": {}
},
"dateWithoutYear": "{day}-{month}",
"@dateWithoutYear": {
"type": "text",
"placeholders": {
"month": {},
"day": {}
}
},
"dateWithYear": "{day}-{month}-{year}",
"@dateWithYear": {
"type": "text",
"placeholders": {
"year": {},
"month": {},
"day": {}
}
},
"delete": "წაშლა",
"@delete": {
"type": "text",
"placeholders": {}
},
"deleteAccount": "ანგარიშის წაშლა",
"@deleteAccount": {
"type": "text",
"placeholders": {}
},
"deleteMessage": "შეტყობინების წაშლა",
"@deleteMessage": {
"type": "text",
"placeholders": {}
},
"device": "მოწყობილება",
"@device": {
"type": "text",
"placeholders": {}
},
"deviceId": "მოწყობილების ID",
"@deviceId": {
"type": "text",
"placeholders": {}
},
"directChats": "პირდაპირი ჩატები",
"@directChats": {
"type": "text",
"placeholders": {}
},
"allRooms": "ყველა ჯგუფური ჩატები",
"@allRooms": {
"type": "text",
"placeholders": {}
},
"downloadFile": "ფაილის ჩატვირთვა",
"@downloadFile": {
"type": "text",
"placeholders": {}
},
"edit": "რედაქტირება",
"@edit": {
"type": "text",
"placeholders": {}
},
"editBlockedServers": "ბლოკირებული სერვერების რედაქტირება",
"@editBlockedServers": {
"type": "text",
"placeholders": {}
},
"editRoomAvatar": "ოთახის ფოტოს შეცვლა",
"@editRoomAvatar": {
"type": "text",
"placeholders": {}
},
"emoteSettings": "ემოციების პარამეტრები",
"@emoteSettings": {
"type": "text",
"placeholders": {}
},
"globalChatId": "გლობალური ჩატის ID",
"@globalChatId": {},
"repeatPassword": "გაიმეორეთ პაროლი",
"@repeatPassword": {},
"notAnImage": "ფაილი არაა სურათი.",
"@notAnImage": {},
"remove": "წაშლა",
"@remove": {
"type": "text",
"placeholders": {}
},
"activatedEndToEndEncryption": "🔐 {username} გააქტიურა end to end დაშიფვრა",
"@activatedEndToEndEncryption": {
"type": "text",
"placeholders": {
"username": {}
}
},
"supposedMxid": "ეს უნდა იყოს {mxid}",
"@supposedMxid": {
"type": "text",
"placeholders": {
"mxid": {}
}
},
"about": "შესახებ",
"@about": {
"type": "text",
"placeholders": {}
},
"changedTheDisplaynameTo": "{username} შეცვალა ნაჩვენები სახელი: '{displayname}'",
"@changedTheDisplaynameTo": {
"type": "text",
"placeholders": {
"username": {},
"displayname": {}
}
},
"commandHint_create": "ცარიელი ჯგუფური ჩატის შექმნა\nგამოიენეთ --no-encryption გაშიფვრის გასათიშად",
"@commandHint_create": {
"type": "text",
"description": "Usage hint for the command /create"
},
"commandHint_dm": "პირდაპირი ჩატის დაწყება\nგამოიენეთ --no-encryption გაშიფვრის გასათიშად",
"@commandHint_dm": {
"type": "text",
"description": "Usage hint for the command /dm"
},
"commandHint_html": "HTML ფორმატირებული ტექსტის გაგზავნა",
"@commandHint_html": {
"type": "text",
"description": "Usage hint for the command /html"
},
"commandHint_myroomavatar": "თქვენი ფოტოს დაყენება ამ ოთახისათვის(mxc-uri-ს დახმარებით)",
"@commandHint_myroomavatar": {
"type": "text",
"description": "Usage hint for the command /myroomavatar"
},
"commandHint_myroomnick": "ამ ოთახისათვის ნაჩვენები სახელის დაყენება",
"@commandHint_myroomnick": {
"type": "text",
"description": "Usage hint for the command /myroomnick"
},
"commandHint_op": "მოცემული მომხმარებლისათვის უფლებების დონის დაყენება (ჩვეულებრივ: 50)",
"@commandHint_op": {
"type": "text",
"description": "Usage hint for the command /op"
},
"commandHint_react": "რეაქციის სახით პასუხის გაგზავნა",
"@commandHint_react": {
"type": "text",
"description": "Usage hint for the command /react"
},
"containsDisplayName": "ნაჩვენებ სახელს შეიცავს",
"@containsDisplayName": {
"type": "text",
"placeholders": {}
},
"contentHasBeenReported": "ეს კონტენტი გაგზავნილ იქნა სერვერის ადმინისტრატორებთან",
"@contentHasBeenReported": {
"type": "text",
"placeholders": {}
},
"defaultPermissionLevel": "ნაგულისხმევი უფლების დონე",
"@defaultPermissionLevel": {
"type": "text",
"placeholders": {}
},
"displaynameHasBeenChanged": "ნაჩვენები სახელი შეიცვალა",
"@displaynameHasBeenChanged": {
"type": "text",
"placeholders": {}
},
"editDisplayname": "ნაჩვენები სახელის შეცვლა",
"@editDisplayname": {
"type": "text",
"placeholders": {}
}
}

File diff suppressed because it is too large Load diff

View file

@ -2215,206 +2215,133 @@
},
"hideUnimportantStateEvents": "Slėpti nesvarbius būsenos įvykius",
"@hideUnimportantStateEvents": {},
"hugContent": "",
"@hugContent": {
"@hugContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"jumpToLastReadMessage": "",
"@jumpToLastReadMessage": {},
"allRooms": "",
"@allRooms": {
"@jumpToLastReadMessage": {},
"@allRooms": {
"type": "text",
"placeholders": {}
},
"commandHint_cuddle": "",
"@commandHint_cuddle": {},
"reportErrorDescription": "",
"@reportErrorDescription": {},
"startFirstChat": "",
"@startFirstChat": {},
"setColorTheme": "",
"@setColorTheme": {},
"banUserDescription": "",
"@banUserDescription": {},
"removeDevicesDescription": "",
"@removeDevicesDescription": {},
"tryAgain": "",
"@tryAgain": {},
"unbanUserDescription": "",
"@unbanUserDescription": {},
"messagesStyle": "",
"@messagesStyle": {},
"newSpaceDescription": "",
"@newSpaceDescription": {},
"chatDescription": "",
"@chatDescription": {},
"encryptThisChat": "",
"@encryptThisChat": {},
"reopenChat": "",
"@reopenChat": {},
"pushNotificationsNotAvailable": "",
"@pushNotificationsNotAvailable": {},
"invalidServerName": "",
"@invalidServerName": {},
"chatPermissions": "",
"@chatPermissions": {},
"signInWithPassword": "",
"@signInWithPassword": {},
"makeAdminDescription": "",
"@makeAdminDescription": {},
"setChatDescription": "",
"@setChatDescription": {},
"importFromZipFile": "",
"@importFromZipFile": {},
"noOtherDevicesFound": "",
"@noOtherDevicesFound": {},
"redactedBy": "",
"@redactedBy": {
"@commandHint_cuddle": {},
"@reportErrorDescription": {},
"@startFirstChat": {},
"@setColorTheme": {},
"@banUserDescription": {},
"@removeDevicesDescription": {},
"@tryAgain": {},
"@unbanUserDescription": {},
"@messagesStyle": {},
"@newSpaceDescription": {},
"@chatDescription": {},
"@encryptThisChat": {},
"@reopenChat": {},
"@pushNotificationsNotAvailable": {},
"@invalidServerName": {},
"@chatPermissions": {},
"@signInWithPassword": {},
"@makeAdminDescription": {},
"@setChatDescription": {},
"@importFromZipFile": {},
"@noOtherDevicesFound": {},
"@redactedBy": {
"type": "text",
"placeholders": {
"username": {}
}
},
"signInWith": "",
"@signInWith": {
"@signInWith": {
"type": "text",
"placeholders": {
"provider": {}
}
},
"fileIsTooBigForServer": "",
"@fileIsTooBigForServer": {},
"readUpToHere": "",
"@readUpToHere": {},
"optionalRedactReason": "",
"@optionalRedactReason": {},
"archiveRoomDescription": "",
"@archiveRoomDescription": {},
"exportEmotePack": "",
"@exportEmotePack": {},
"inviteContactToGroupQuestion": "",
"@inviteContactToGroupQuestion": {},
"redactedByBecause": "",
"@redactedByBecause": {
"@fileIsTooBigForServer": {},
"@readUpToHere": {},
"@optionalRedactReason": {},
"@archiveRoomDescription": {},
"@exportEmotePack": {},
"@inviteContactToGroupQuestion": {},
"@redactedByBecause": {
"type": "text",
"placeholders": {
"username": {},
"reason": {}
}
},
"fileHasBeenSavedAt": "",
"@fileHasBeenSavedAt": {
"@fileHasBeenSavedAt": {
"type": "text",
"placeholders": {
"path": {}
}
},
"redactMessageDescription": "",
"@redactMessageDescription": {},
"invalidInput": "",
"@invalidInput": {},
"doNotShowAgain": "",
"@doNotShowAgain": {},
"report": "",
"@report": {},
"googlyEyesContent": "",
"@googlyEyesContent": {
"@redactMessageDescription": {},
"@invalidInput": {},
"@doNotShowAgain": {},
"@report": {},
"@googlyEyesContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"addChatDescription": "",
"@addChatDescription": {},
"hasKnocked": "",
"@hasKnocked": {
"@addChatDescription": {},
"@hasKnocked": {
"placeholders": {
"user": {}
}
},
"openLinkInBrowser": "",
"@openLinkInBrowser": {},
"disableEncryptionWarning": "",
"@disableEncryptionWarning": {},
"directChat": "",
"@directChat": {},
"wrongPinEntered": "",
"@wrongPinEntered": {
"@openLinkInBrowser": {},
"@disableEncryptionWarning": {},
"@directChat": {},
"@wrongPinEntered": {
"type": "text",
"placeholders": {
"seconds": {}
}
},
"sendTypingNotifications": "",
"@sendTypingNotifications": {},
"inviteGroupChat": "",
"@inviteGroupChat": {},
"invitePrivateChat": "",
"@invitePrivateChat": {},
"importEmojis": "",
"@importEmojis": {},
"wasDirectChatDisplayName": "",
"@wasDirectChatDisplayName": {
"@sendTypingNotifications": {},
"@inviteGroupChat": {},
"@invitePrivateChat": {},
"@importEmojis": {},
"@wasDirectChatDisplayName": {
"type": "text",
"placeholders": {
"oldDisplayName": {}
}
},
"noChatDescriptionYet": "",
"@noChatDescriptionYet": {},
"learnMore": "",
"@learnMore": {},
"notAnImage": "",
"@notAnImage": {},
"chatDescriptionHasBeenChanged": "",
"@chatDescriptionHasBeenChanged": {},
"roomUpgradeDescription": "",
"@roomUpgradeDescription": {},
"pleaseEnterANumber": "",
"@pleaseEnterANumber": {},
"profileNotFound": "",
"@profileNotFound": {},
"jump": "",
"@jump": {},
"sorryThatsNotPossible": "",
"@sorryThatsNotPossible": {},
"shareInviteLink": "",
"@shareInviteLink": {},
"cuddleContent": "",
"@cuddleContent": {
"@noChatDescriptionYet": {},
"@learnMore": {},
"@notAnImage": {},
"@chatDescriptionHasBeenChanged": {},
"@roomUpgradeDescription": {},
"@pleaseEnterANumber": {},
"@profileNotFound": {},
"@jump": {},
"@sorryThatsNotPossible": {},
"@shareInviteLink": {},
"@cuddleContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"deviceKeys": "",
"@deviceKeys": {},
"emoteKeyboardNoRecents": "",
"@emoteKeyboardNoRecents": {
"@deviceKeys": {},
"@emoteKeyboardNoRecents": {
"type": "text",
"placeholders": {}
},
"setTheme": "",
"@setTheme": {},
"commandHint_hug": "",
"@commandHint_hug": {},
"replace": "",
"@replace": {},
"commandHint_googly": "",
"@commandHint_googly": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "",
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"createGroup": "",
"@createGroup": {},
"noBackupWarning": "",
"@noBackupWarning": {},
"kickUserDescription": "",
"@kickUserDescription": {},
"importNow": "",
"@importNow": {},
"invite": "",
"@invite": {}
"@setTheme": {},
"@commandHint_hug": {},
"@replace": {},
"@commandHint_googly": {},
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"@createGroup": {},
"@noBackupWarning": {},
"@kickUserDescription": {},
"@importNow": {},
"@invite": {}
}

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

View file

@ -2351,7 +2351,7 @@
"@report": {},
"addChatDescription": "Inserir descrição da conversa...",
"@addChatDescription": {},
"hasKnocked": "{user} bateu na porta",
"hasKnocked": "🚪 {user} bateu na porta",
"@hasKnocked": {
"placeholders": {
"user": {}
@ -2484,5 +2484,209 @@
"searchChatsRooms": "Buscar por #conversas, @usuários...",
"@searchChatsRooms": {},
"databaseMigrationBody": "Por favor, espere. Isto pode demorar um pouco.",
"@databaseMigrationBody": {}
"@databaseMigrationBody": {},
"youInvitedToBy": "Você foi convidado através do link para:\n{alias}",
"@youInvitedToBy": {
"placeholders": {
"alias": {}
}
},
"forwardMessageTo": "Encaminhar mensagem para {roomName}?",
"@forwardMessageTo": {
"type": "text",
"placeholders": {
"roomName": {}
}
},
"formattedMessagesDescription": "Mostrar mensagens ricas com conteúdos tipo negrito usando markdown.",
"@formattedMessagesDescription": {},
"verifyOtherUser": "🔐 Verificar outro usuário",
"@verifyOtherUser": {},
"verifyOtherDevice": "🔐 Verificar outro aparelho",
"@verifyOtherDevice": {},
"acceptedKeyVerification": "{sender} aceitou sua chave de verificação",
"@acceptedKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"startedKeyVerification": "{sender} iniciou a chave de verificação",
"@startedKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"transparent": "Transparente",
"@transparent": {},
"databaseBuildErrorBody": "Não foi possível construir o banco de dados SQLite. O aplicativo tentará utilizar o banco de dados legado por enquanto. Por favor, reporte este erro aos desenvolvedores em {url}. A mensagem de erro é: {error}",
"@databaseBuildErrorBody": {
"type": "text",
"placeholders": {
"url": {},
"error": {}
}
},
"initAppError": "Ocorreu um erro enquanto o aplicativo era iniciado",
"@initAppError": {},
"restoreSessionBody": "O aplicativo tentará agora restaurar sua sessão a partir do backup. Por favor, reporte este ao desenvolvedor em {url}. A mensagem de erro é: {error}",
"@restoreSessionBody": {
"type": "text",
"placeholders": {
"url": {},
"error": {}
}
},
"sendReadReceipts": "Enviar recibos de leitura",
"@sendReadReceipts": {},
"sendTypingNotificationsDescription": "Outros participantes neste chat podem ver quando você está digitando uma nova mensagem.",
"@sendTypingNotificationsDescription": {},
"formattedMessages": "Mensagens formatadas",
"@formattedMessages": {},
"presenceStyle": "Presença:",
"@presenceStyle": {
"type": "text",
"placeholders": {}
},
"presencesToggle": "Mostrar o status das mensagens de outros usuários",
"@presencesToggle": {
"type": "text",
"placeholders": {}
},
"commandHint_ignore": "Ignorar o seguinte ID Matrix",
"@commandHint_ignore": {},
"commandHint_unignore": "Designorar o seguinte ID Matrix",
"@commandHint_unignore": {},
"hidePresences": "Esconder lista de status?",
"@hidePresences": {},
"sessionLostBody": "Sua sessão foi desconectada. Por favor, reporte este ao desenvolvedor em {url}. A mensagem de erro é: {error}",
"@sessionLostBody": {
"type": "text",
"placeholders": {
"url": {},
"error": {}
}
},
"sendReadReceiptsDescription": "Outros participantes neste chat podem ver quando você tiver lido uma mensagem.",
"@sendReadReceiptsDescription": {},
"verifyOtherUserDescription": "Se você verificar outro usuário, você terá certeza que você conhece com quem está conversando. 💪\n\nQuando iniciar uma verificação, você e o outro usuário receberão um popup no aplicativo. Então vocês receberão uma série de emojis ou números para comparar um com o outro.\n\nA melhor maneira de fazer este procedimento é encontrar pessoalmente ou através de um vídeochamada. 👭",
"@verifyOtherUserDescription": {},
"requestedKeyVerification": "{sender} enviou uma chave de verificação",
"@requestedKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"verifyOtherDeviceDescription": "Quando você verifica outro aparelho, estes aparelhos poderão trocar chaves, aumentando sua segurança. 💪\n\nQuando iniciar a verificação, um popup aparecerá no aplicativo em ambos os aparelhos. Então você verá uma série de emojis ou números que você terá que comparar um com o outro.\n\nÉ melhor fazer esse procedimento com ambos os aparelhos em mãos antes de começar a verificação. 🤳",
"@verifyOtherDeviceDescription": {},
"canceledKeyVerification": "{sender} cancelou sua chave de verificação",
"@canceledKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"isReadyForKeyVerification": "{sender} está pronto para a chave de verificação",
"@isReadyForKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"completedKeyVerification": "{sender} completou a chave de verificação",
"@completedKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"stickers": "Stickers",
"@stickers": {},
"discover": "Descubra",
"@discover": {},
"incomingMessages": "Mensagens recebidas",
"@incomingMessages": {},
"unreadChatsInApp": "{appname}: {unread} mensagens não lidas",
"@unreadChatsInApp": {
"type": "text",
"placeholders": {
"appname": {},
"unread": {}
}
},
"appLockDescription": "Bloquear o app com um código PIN quando não estiver usando",
"@appLockDescription": {},
"accessAndVisibilityDescription": "Quem é permitido entrar nesse chat e como pode ser descoberto.",
"@accessAndVisibilityDescription": {},
"calls": "Chamadas",
"@calls": {},
"customEmojisAndStickers": "Emojis e stickers customizados",
"@customEmojisAndStickers": {},
"customEmojisAndStickersBody": "Adicionar ou compartilhar emojis ou stickers customizados que podem ser usados em qualquer chat.",
"@customEmojisAndStickersBody": {},
"hideRedactedMessages": "Esconder mensagens excluídas",
"@hideRedactedMessages": {},
"hideRedactedMessagesBody": "Se alguém excluir uma mensagem, esta mensagem não será mais visível no chat.",
"@hideRedactedMessagesBody": {},
"hideInvalidOrUnknownMessageFormats": "Esconder formatos de mensagem inválidos ou desconhecidos",
"@hideInvalidOrUnknownMessageFormats": {},
"hideMemberChangesInPublicChats": "Esconder mudanças de membro em chats públicos",
"@hideMemberChangesInPublicChats": {},
"hideMemberChangesInPublicChatsBody": "Não mostre se alguém entrou ou saiu no chat para melhorar a legibilidade.",
"@hideMemberChangesInPublicChatsBody": {},
"overview": "Visão geral",
"@overview": {},
"notifyMeFor": "Notificar me para",
"@notifyMeFor": {},
"usersMustKnock": "Usuários devem bater na porta",
"@usersMustKnock": {},
"noOneCanJoin": "Ninguém pode entrar",
"@noOneCanJoin": {},
"knocking": "Batendo na porta",
"@knocking": {},
"chatCanBeDiscoveredViaSearchOnServer": "O chat pode ser descoberto pela pesquisa em {server}",
"@chatCanBeDiscoveredViaSearchOnServer": {
"type": "text",
"placeholders": {
"server": {}
}
},
"publicChatAddresses": "Endereços de chat públicos",
"@publicChatAddresses": {},
"thereAreCountUsersBlocked": "Nesse momento, há {count} usuários bloqueados.",
"@thereAreCountUsersBlocked": {
"type": "text",
"count": {}
},
"globalChatId": "ID de chat global",
"@globalChatId": {},
"accessAndVisibility": "Acesso e visibilidade",
"@accessAndVisibility": {},
"passwordRecoverySettings": "Configurações de recuperação de senha",
"@passwordRecoverySettings": {},
"userWouldLikeToChangeTheChat": "{user} gostaria de entrar no chat.",
"@userWouldLikeToChangeTheChat": {
"placeholders": {
"user": {}
}
},
"noPublicLinkHasBeenCreatedYet": "Nenhum link público foi criado ainda",
"@noPublicLinkHasBeenCreatedYet": {},
"userRole": "Cargo do usuário",
"@userRole": {},
"minimumPowerLevel": "{level} é o nível mínimo de poder.",
"@minimumPowerLevel": {
"type": "text",
"placeholders": {
"level": {}
}
},
"noDatabaseEncryption": "A criptografia do banco de dados não é suportada nesta plataforma",
"@noDatabaseEncryption": {},
"createNewAddress": "Criar um novo endereço",
"@createNewAddress": {},
"knock": "Bater na porta",
"@knock": {}
}

File diff suppressed because it is too large Load diff

View file

@ -2300,122 +2300,77 @@
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"signInWithPassword": "Conectați-vă cu parolă",
"@signInWithPassword": {},
"setColorTheme": "",
"@setColorTheme": {},
"banUserDescription": "",
"@banUserDescription": {},
"removeDevicesDescription": "",
"@removeDevicesDescription": {},
"tryAgain": "",
"@tryAgain": {},
"unbanUserDescription": "",
"@unbanUserDescription": {},
"messagesStyle": "",
"@messagesStyle": {},
"chatDescription": "",
"@chatDescription": {},
"pushNotificationsNotAvailable": "",
"@pushNotificationsNotAvailable": {},
"invalidServerName": "",
"@invalidServerName": {},
"chatPermissions": "",
"@chatPermissions": {},
"makeAdminDescription": "",
"@makeAdminDescription": {},
"setChatDescription": "",
"@setChatDescription": {},
"importFromZipFile": "",
"@importFromZipFile": {},
"redactedBy": "",
"@redactedBy": {
"@setColorTheme": {},
"@banUserDescription": {},
"@removeDevicesDescription": {},
"@tryAgain": {},
"@unbanUserDescription": {},
"@messagesStyle": {},
"@chatDescription": {},
"@pushNotificationsNotAvailable": {},
"@invalidServerName": {},
"@chatPermissions": {},
"@makeAdminDescription": {},
"@setChatDescription": {},
"@importFromZipFile": {},
"@redactedBy": {
"type": "text",
"placeholders": {
"username": {}
}
},
"signInWith": "",
"@signInWith": {
"@signInWith": {
"type": "text",
"placeholders": {
"provider": {}
}
},
"optionalRedactReason": "",
"@optionalRedactReason": {},
"archiveRoomDescription": "",
"@archiveRoomDescription": {},
"exportEmotePack": "",
"@exportEmotePack": {},
"inviteContactToGroupQuestion": "",
"@inviteContactToGroupQuestion": {},
"redactedByBecause": "",
"@redactedByBecause": {
"@optionalRedactReason": {},
"@archiveRoomDescription": {},
"@exportEmotePack": {},
"@inviteContactToGroupQuestion": {},
"@redactedByBecause": {
"type": "text",
"placeholders": {
"username": {},
"reason": {}
}
},
"redactMessageDescription": "",
"@redactMessageDescription": {},
"invalidInput": "",
"@invalidInput": {},
"addChatDescription": "",
"@addChatDescription": {},
"hasKnocked": "",
"@hasKnocked": {
"@redactMessageDescription": {},
"@invalidInput": {},
"@addChatDescription": {},
"@hasKnocked": {
"placeholders": {
"user": {}
}
},
"directChat": "",
"@directChat": {},
"wrongPinEntered": "",
"@wrongPinEntered": {
"@directChat": {},
"@wrongPinEntered": {
"type": "text",
"placeholders": {
"seconds": {}
}
},
"sendTypingNotifications": "",
"@sendTypingNotifications": {},
"inviteGroupChat": "",
"@inviteGroupChat": {},
"invitePrivateChat": "",
"@invitePrivateChat": {},
"importEmojis": "",
"@importEmojis": {},
"noChatDescriptionYet": "",
"@noChatDescriptionYet": {},
"learnMore": "",
"@learnMore": {},
"notAnImage": "",
"@notAnImage": {},
"chatDescriptionHasBeenChanged": "",
"@chatDescriptionHasBeenChanged": {},
"roomUpgradeDescription": "",
"@roomUpgradeDescription": {},
"pleaseEnterANumber": "",
"@pleaseEnterANumber": {},
"profileNotFound": "",
"@profileNotFound": {},
"shareInviteLink": "",
"@shareInviteLink": {},
"emoteKeyboardNoRecents": "",
"@emoteKeyboardNoRecents": {
"@sendTypingNotifications": {},
"@inviteGroupChat": {},
"@invitePrivateChat": {},
"@importEmojis": {},
"@noChatDescriptionYet": {},
"@learnMore": {},
"@notAnImage": {},
"@chatDescriptionHasBeenChanged": {},
"@roomUpgradeDescription": {},
"@pleaseEnterANumber": {},
"@profileNotFound": {},
"@shareInviteLink": {},
"@emoteKeyboardNoRecents": {
"type": "text",
"placeholders": {}
},
"setTheme": "",
"@setTheme": {},
"replace": "",
"@replace": {},
"createGroup": "",
"@createGroup": {},
"kickUserDescription": "",
"@kickUserDescription": {},
"importNow": "",
"@importNow": {},
"invite": "",
"@invite": {}
"@setTheme": {},
"@replace": {},
"@createGroup": {},
"@kickUserDescription": {},
"@importNow": {},
"@invite": {}
}

View file

@ -2275,7 +2275,7 @@
},
"startFirstChat": "Начните Ваш первый чат",
"@startFirstChat": {},
"jumpToLastReadMessage": "Перейти к последнему прочитанному сообщению",
"jumpToLastReadMessage": "Последнее прочитанное сообщение",
"@jumpToLastReadMessage": {},
"wasDirectChatDisplayName": "Пустой чат (был {oldDisplayName})",
"@wasDirectChatDisplayName": {
@ -2405,7 +2405,7 @@
"@makeAdminDescription": {},
"archiveRoomDescription": "Чат переместится в архив. Другим пользователям будет видно, что вы вышли из чата.",
"@archiveRoomDescription": {},
"hasKnocked": "{user} постучался",
"hasKnocked": "🚪 {user} постучался",
"@hasKnocked": {
"placeholders": {
"user": {}
@ -2423,7 +2423,7 @@
"@blockListDescription": {},
"blockedUsers": "Заглушённые пользователи",
"@blockedUsers": {},
"block": "заглушить",
"block": "Заглушить",
"@block": {},
"blockUsername": "Игнорировать имя пользователя",
"@blockUsername": {},
@ -2600,5 +2600,94 @@
"placeholders": {}
},
"hidePresences": "Скрыть список статусов?",
"@hidePresences": {}
"@hidePresences": {},
"stickers": "Стикеры",
"@stickers": {},
"discover": "Исследовать",
"@discover": {},
"globalChatId": "ID глобального чата",
"@globalChatId": {},
"customEmojisAndStickersBody": "Добавить или поделиться пользовательскими эмодзи или стикерами, которые могут быть применены в любом чате.",
"@customEmojisAndStickersBody": {},
"hideMemberChangesInPublicChatsBody": "Для улучшения читаемости не показывать на временной шкале входы и выходы из чата.",
"@hideMemberChangesInPublicChatsBody": {},
"knocking": "Стучаться",
"@knocking": {},
"accessAndVisibility": "Доступность и видимость",
"@accessAndVisibility": {},
"publicChatAddresses": "Адресы публичного чата",
"@publicChatAddresses": {},
"accessAndVisibilityDescription": "Кому разрешено войти в этот чат и как этот чат может быть обнаружен.",
"@accessAndVisibilityDescription": {},
"userRole": "Роль пользователя",
"@userRole": {},
"noDatabaseEncryption": "Шифрование базы данных не поддерживается на этой платформе",
"@noDatabaseEncryption": {},
"appLockDescription": "Заблокировать приложение когда не используется пин код",
"@appLockDescription": {},
"calls": "Звонки",
"@calls": {},
"customEmojisAndStickers": "Пользовательские эмодзи и стикеры",
"@customEmojisAndStickers": {},
"hideRedactedMessages": "Скрыть редактированные сообщения",
"@hideRedactedMessages": {},
"hideInvalidOrUnknownMessageFormats": "Скрыть неправильные или неизвестные форматы сообщения",
"@hideInvalidOrUnknownMessageFormats": {},
"hideRedactedMessagesBody": "Если кто-то редактирует сообщение, оно будет скрыто в чате.",
"@hideRedactedMessagesBody": {},
"hideMemberChangesInPublicChats": "Скрыть изменения участников в публичных чатах",
"@hideMemberChangesInPublicChats": {},
"overview": "Обзор",
"@overview": {},
"notifyMeFor": "Уведомлять меня о",
"@notifyMeFor": {},
"passwordRecoverySettings": "Настройки восстановления пароля",
"@passwordRecoverySettings": {},
"userWouldLikeToChangeTheChat": "{user} желает присоединиться к чату.",
"@userWouldLikeToChangeTheChat": {
"placeholders": {
"user": {}
}
},
"knock": "Постучаться",
"@knock": {},
"usersMustKnock": "Пользователи должны постучаться",
"@usersMustKnock": {},
"noOneCanJoin": "Никто не может присоединиться",
"@noOneCanJoin": {},
"noPublicLinkHasBeenCreatedYet": "Публичная ссылка еще не была создана",
"@noPublicLinkHasBeenCreatedYet": {},
"chatCanBeDiscoveredViaSearchOnServer": "Чат может быть обнаружен через поиск в {server}",
"@chatCanBeDiscoveredViaSearchOnServer": {
"type": "text",
"placeholders": {
"server": {}
}
},
"createNewAddress": "Создать новый адрес",
"@createNewAddress": {},
"minimumPowerLevel": "{level} является минимальным уровнем.",
"@minimumPowerLevel": {
"type": "text",
"placeholders": {
"level": {}
}
},
"commandHint_ignore": "Игнорировать данный matrix ID",
"@commandHint_ignore": {},
"commandHint_unignore": "Не игнорировать данный matrix ID",
"@commandHint_unignore": {},
"unreadChatsInApp": "{appname}: {unread} непрочитанные чаты",
"@unreadChatsInApp": {
"type": "text",
"placeholders": {
"appname": {},
"unread": {}
}
},
"thereAreCountUsersBlocked": "Сейчас заблокировано {count} пользователей.",
"@thereAreCountUsersBlocked": {
"type": "text",
"count": {}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1802,620 +1802,412 @@
"type": "text",
"placeholders": {}
},
"hugContent": "",
"@hugContent": {
"@hugContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"jumpToLastReadMessage": "",
"@jumpToLastReadMessage": {},
"allRooms": "",
"@allRooms": {
"@jumpToLastReadMessage": {},
"@allRooms": {
"type": "text",
"placeholders": {}
},
"obtainingLocation": "",
"@obtainingLocation": {
"@obtainingLocation": {
"type": "text",
"placeholders": {}
},
"commandHint_cuddle": "",
"@commandHint_cuddle": {},
"widgetVideo": "",
"@widgetVideo": {},
"dismiss": "",
"@dismiss": {},
"reportErrorDescription": "",
"@reportErrorDescription": {},
"addAccount": "",
"@addAccount": {},
"chatHasBeenAddedToThisSpace": "",
"@chatHasBeenAddedToThisSpace": {},
"unsupportedAndroidVersion": "",
"@unsupportedAndroidVersion": {},
"widgetJitsi": "",
"@widgetJitsi": {},
"messageType": "",
"@messageType": {},
"indexedDbErrorLong": "",
"@indexedDbErrorLong": {},
"oneClientLoggedOut": "",
"@oneClientLoggedOut": {},
"startFirstChat": "",
"@startFirstChat": {},
"callingAccount": "",
"@callingAccount": {},
"setColorTheme": "",
"@setColorTheme": {},
"nextAccount": "",
"@nextAccount": {},
"commandHint_create": "",
"@commandHint_create": {
"@commandHint_cuddle": {},
"@widgetVideo": {},
"@dismiss": {},
"@reportErrorDescription": {},
"@addAccount": {},
"@chatHasBeenAddedToThisSpace": {},
"@unsupportedAndroidVersion": {},
"@widgetJitsi": {},
"@messageType": {},
"@indexedDbErrorLong": {},
"@oneClientLoggedOut": {},
"@startFirstChat": {},
"@callingAccount": {},
"@setColorTheme": {},
"@nextAccount": {},
"@commandHint_create": {
"type": "text",
"description": "Usage hint for the command /create"
},
"allSpaces": "",
"@allSpaces": {},
"supposedMxid": "",
"@supposedMxid": {
"@allSpaces": {},
"@supposedMxid": {
"type": "text",
"placeholders": {
"mxid": {}
}
},
"user": "",
"@user": {},
"youAcceptedTheInvitation": "",
"@youAcceptedTheInvitation": {},
"noMatrixServer": "",
"@noMatrixServer": {
"@user": {},
"@youAcceptedTheInvitation": {},
"@noMatrixServer": {
"type": "text",
"placeholders": {
"server1": {},
"server2": {}
}
},
"youInvitedBy": "",
"@youInvitedBy": {
"@youInvitedBy": {
"placeholders": {
"user": {}
}
},
"banUserDescription": "",
"@banUserDescription": {},
"widgetEtherpad": "",
"@widgetEtherpad": {},
"removeDevicesDescription": "",
"@removeDevicesDescription": {},
"separateChatTypes": "",
"@separateChatTypes": {
"@banUserDescription": {},
"@widgetEtherpad": {},
"@removeDevicesDescription": {},
"@separateChatTypes": {
"type": "text",
"placeholders": {}
},
"tryAgain": "",
"@tryAgain": {},
"youKickedAndBanned": "",
"@youKickedAndBanned": {
"@tryAgain": {},
"@youKickedAndBanned": {
"placeholders": {
"user": {}
}
},
"unbanUserDescription": "",
"@unbanUserDescription": {},
"saveFile": "",
"@saveFile": {
"@unbanUserDescription": {},
"@saveFile": {
"type": "text",
"placeholders": {}
},
"sendOnEnter": "",
"@sendOnEnter": {},
"youRejectedTheInvitation": "",
"@youRejectedTheInvitation": {},
"otherCallingPermissions": "",
"@otherCallingPermissions": {},
"messagesStyle": "",
"@messagesStyle": {},
"link": "",
"@link": {},
"widgetUrlError": "",
"@widgetUrlError": {},
"emailOrUsername": "",
"@emailOrUsername": {},
"newSpaceDescription": "",
"@newSpaceDescription": {},
"chatDescription": "",
"@chatDescription": {},
"callingAccountDetails": "",
"@callingAccountDetails": {},
"enterSpace": "",
"@enterSpace": {},
"encryptThisChat": "",
"@encryptThisChat": {},
"previousAccount": "",
"@previousAccount": {},
"reopenChat": "",
"@reopenChat": {},
"pleaseEnterRecoveryKey": "",
"@pleaseEnterRecoveryKey": {},
"widgetNameError": "",
"@widgetNameError": {},
"addToBundle": "",
"@addToBundle": {},
"spaceIsPublic": "",
"@spaceIsPublic": {
"@sendOnEnter": {},
"@youRejectedTheInvitation": {},
"@otherCallingPermissions": {},
"@messagesStyle": {},
"@link": {},
"@widgetUrlError": {},
"@emailOrUsername": {},
"@newSpaceDescription": {},
"@chatDescription": {},
"@callingAccountDetails": {},
"@enterSpace": {},
"@encryptThisChat": {},
"@previousAccount": {},
"@reopenChat": {},
"@pleaseEnterRecoveryKey": {},
"@widgetNameError": {},
"@addToBundle": {},
"@spaceIsPublic": {
"type": "text",
"placeholders": {}
},
"addWidget": "",
"@addWidget": {},
"countFiles": "",
"@countFiles": {
"@addWidget": {},
"@countFiles": {
"placeholders": {
"count": {}
}
},
"noKeyForThisMessage": "",
"@noKeyForThisMessage": {},
"shareLocation": "",
"@shareLocation": {
"@noKeyForThisMessage": {},
"@shareLocation": {
"type": "text",
"placeholders": {}
},
"commandHint_markasgroup": "",
"@commandHint_markasgroup": {},
"errorObtainingLocation": "",
"@errorObtainingLocation": {
"@commandHint_markasgroup": {},
"@errorObtainingLocation": {
"type": "text",
"placeholders": {
"error": {}
}
},
"hydrateTor": "",
"@hydrateTor": {},
"pushNotificationsNotAvailable": "",
"@pushNotificationsNotAvailable": {},
"storeInAppleKeyChain": "",
"@storeInAppleKeyChain": {},
"hydrate": "",
"@hydrate": {},
"invalidServerName": "",
"@invalidServerName": {},
"chatPermissions": "",
"@chatPermissions": {},
"cantOpenUri": "",
"@cantOpenUri": {
"@hydrateTor": {},
"@pushNotificationsNotAvailable": {},
"@storeInAppleKeyChain": {},
"@hydrate": {},
"@invalidServerName": {},
"@chatPermissions": {},
"@cantOpenUri": {
"type": "text",
"placeholders": {
"uri": {}
}
},
"sender": "",
"@sender": {},
"storeInAndroidKeystore": "",
"@storeInAndroidKeystore": {},
"signInWithPassword": "",
"@signInWithPassword": {},
"makeAdminDescription": "",
"@makeAdminDescription": {},
"synchronizingPleaseWait": "",
"@synchronizingPleaseWait": {
"@sender": {},
"@storeInAndroidKeystore": {},
"@signInWithPassword": {},
"@makeAdminDescription": {},
"@synchronizingPleaseWait": {
"type": "text",
"placeholders": {}
},
"commandHint_clearcache": "",
"@commandHint_clearcache": {
"@commandHint_clearcache": {
"type": "text",
"description": "Usage hint for the command /clearcache"
},
"saveKeyManuallyDescription": "",
"@saveKeyManuallyDescription": {},
"editBundlesForAccount": "",
"@editBundlesForAccount": {},
"whyIsThisMessageEncrypted": "",
"@whyIsThisMessageEncrypted": {},
"setChatDescription": "",
"@setChatDescription": {},
"spaceName": "",
"@spaceName": {
"@saveKeyManuallyDescription": {},
"@editBundlesForAccount": {},
"@whyIsThisMessageEncrypted": {},
"@setChatDescription": {},
"@spaceName": {
"type": "text",
"placeholders": {}
},
"importFromZipFile": "",
"@importFromZipFile": {},
"dehydrateWarning": "",
"@dehydrateWarning": {},
"noOtherDevicesFound": "",
"@noOtherDevicesFound": {},
"yourChatBackupHasBeenSetUp": "",
"@yourChatBackupHasBeenSetUp": {},
"redactedBy": "",
"@redactedBy": {
"@importFromZipFile": {},
"@dehydrateWarning": {},
"@noOtherDevicesFound": {},
"@yourChatBackupHasBeenSetUp": {},
"@redactedBy": {
"type": "text",
"placeholders": {
"username": {}
}
},
"videoCallsBetaWarning": "",
"@videoCallsBetaWarning": {},
"autoplayImages": "",
"@autoplayImages": {
"@videoCallsBetaWarning": {},
"@autoplayImages": {
"type": "text",
"placeholder": {}
},
"signInWith": "",
"@signInWith": {
"@signInWith": {
"type": "text",
"placeholders": {
"provider": {}
}
},
"fileIsTooBigForServer": "",
"@fileIsTooBigForServer": {},
"homeserver": "",
"@homeserver": {},
"repeatPassword": "",
"@repeatPassword": {},
"callingPermissions": "",
"@callingPermissions": {},
"readUpToHere": "",
"@readUpToHere": {},
"start": "",
"@start": {},
"unlockOldMessages": "",
"@unlockOldMessages": {},
"numChats": "",
"@numChats": {
"@fileIsTooBigForServer": {},
"@homeserver": {},
"@repeatPassword": {},
"@callingPermissions": {},
"@readUpToHere": {},
"@start": {},
"@unlockOldMessages": {},
"@numChats": {
"type": "number",
"placeholders": {
"number": {}
}
},
"optionalRedactReason": "",
"@optionalRedactReason": {},
"dehydrate": "",
"@dehydrate": {},
"locationPermissionDeniedNotice": "",
"@locationPermissionDeniedNotice": {
"@optionalRedactReason": {},
"@dehydrate": {},
"@locationPermissionDeniedNotice": {
"type": "text",
"placeholders": {}
},
"sendAsText": "",
"@sendAsText": {
"@sendAsText": {
"type": "text"
},
"archiveRoomDescription": "",
"@archiveRoomDescription": {},
"exportEmotePack": "",
"@exportEmotePack": {},
"sendSticker": "",
"@sendSticker": {
"@archiveRoomDescription": {},
"@exportEmotePack": {},
"@sendSticker": {
"type": "text",
"placeholders": {}
},
"switchToAccount": "",
"@switchToAccount": {
"@switchToAccount": {
"type": "number",
"placeholders": {
"number": {}
}
},
"commandInvalid": "",
"@commandInvalid": {
"@commandInvalid": {
"type": "text"
},
"locationDisabledNotice": "",
"@locationDisabledNotice": {
"@locationDisabledNotice": {
"type": "text",
"placeholders": {}
},
"experimentalVideoCalls": "",
"@experimentalVideoCalls": {},
"pleaseEnterRecoveryKeyDescription": "",
"@pleaseEnterRecoveryKeyDescription": {},
"openInMaps": "",
"@openInMaps": {
"@experimentalVideoCalls": {},
"@pleaseEnterRecoveryKeyDescription": {},
"@openInMaps": {
"type": "text",
"placeholders": {}
},
"inviteContactToGroupQuestion": "",
"@inviteContactToGroupQuestion": {},
"redactedByBecause": "",
"@redactedByBecause": {
"@inviteContactToGroupQuestion": {},
"@redactedByBecause": {
"type": "text",
"placeholders": {
"username": {},
"reason": {}
}
},
"youHaveWithdrawnTheInvitationFor": "",
"@youHaveWithdrawnTheInvitationFor": {
"@youHaveWithdrawnTheInvitationFor": {
"placeholders": {
"user": {}
}
},
"appearOnTopDetails": "",
"@appearOnTopDetails": {},
"enterRoom": "",
"@enterRoom": {},
"allChats": "",
"@allChats": {
"@appearOnTopDetails": {},
"@enterRoom": {},
"@allChats": {
"type": "text",
"placeholders": {}
},
"reportUser": "",
"@reportUser": {},
"confirmEventUnpin": "",
"@confirmEventUnpin": {},
"youInvitedUser": "",
"@youInvitedUser": {
"@reportUser": {},
"@confirmEventUnpin": {},
"@youInvitedUser": {
"placeholders": {
"user": {}
}
},
"fileHasBeenSavedAt": "",
"@fileHasBeenSavedAt": {
"@fileHasBeenSavedAt": {
"type": "text",
"placeholders": {
"path": {}
}
},
"addToSpace": "",
"@addToSpace": {},
"commandMissing": "",
"@commandMissing": {
"@addToSpace": {},
"@commandMissing": {
"type": "text",
"placeholders": {
"command": {}
},
"description": "State that {command} is not a valid /command."
},
"redactMessageDescription": "",
"@redactMessageDescription": {},
"recoveryKey": "",
"@recoveryKey": {},
"commandHint_discardsession": "",
"@commandHint_discardsession": {
"@redactMessageDescription": {},
"@recoveryKey": {},
"@commandHint_discardsession": {
"type": "text",
"description": "Usage hint for the command /discardsession"
},
"invalidInput": "",
"@invalidInput": {},
"dehydrateTorLong": "",
"@dehydrateTorLong": {},
"doNotShowAgain": "",
"@doNotShowAgain": {},
"report": "",
"@report": {},
"unverified": "",
"@unverified": {},
"serverRequiresEmail": "",
"@serverRequiresEmail": {},
"hideUnimportantStateEvents": "",
"@hideUnimportantStateEvents": {},
"screenSharingTitle": "",
"@screenSharingTitle": {},
"widgetCustom": "",
"@widgetCustom": {},
"addToSpaceDescription": "",
"@addToSpaceDescription": {},
"googlyEyesContent": "",
"@googlyEyesContent": {
"@invalidInput": {},
"@dehydrateTorLong": {},
"@doNotShowAgain": {},
"@report": {},
"@unverified": {},
"@serverRequiresEmail": {},
"@hideUnimportantStateEvents": {},
"@screenSharingTitle": {},
"@widgetCustom": {},
"@addToSpaceDescription": {},
"@googlyEyesContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"youBannedUser": "",
"@youBannedUser": {
"@youBannedUser": {
"placeholders": {
"user": {}
}
},
"addChatDescription": "",
"@addChatDescription": {},
"commandHint_myroomavatar": "",
"@commandHint_myroomavatar": {
"@addChatDescription": {},
"@commandHint_myroomavatar": {
"type": "text",
"description": "Usage hint for the command /myroomavatar"
},
"hasKnocked": "",
"@hasKnocked": {
"@hasKnocked": {
"placeholders": {
"user": {}
}
},
"publish": "",
"@publish": {},
"openLinkInBrowser": "",
"@openLinkInBrowser": {},
"messageInfo": "",
"@messageInfo": {},
"disableEncryptionWarning": "",
"@disableEncryptionWarning": {},
"directChat": "",
"@directChat": {},
"wrongPinEntered": "",
"@wrongPinEntered": {
"@publish": {},
"@openLinkInBrowser": {},
"@messageInfo": {},
"@disableEncryptionWarning": {},
"@directChat": {},
"@wrongPinEntered": {
"type": "text",
"placeholders": {
"seconds": {}
}
},
"sendTypingNotifications": "",
"@sendTypingNotifications": {},
"inviteGroupChat": "",
"@inviteGroupChat": {},
"appearOnTop": "",
"@appearOnTop": {},
"invitePrivateChat": "",
"@invitePrivateChat": {},
"foregroundServiceRunning": "",
"@foregroundServiceRunning": {},
"voiceCall": "",
"@voiceCall": {},
"createNewSpace": "",
"@createNewSpace": {
"@sendTypingNotifications": {},
"@inviteGroupChat": {},
"@appearOnTop": {},
"@invitePrivateChat": {},
"@foregroundServiceRunning": {},
"@voiceCall": {},
"@createNewSpace": {
"type": "text",
"placeholders": {}
},
"importEmojis": "",
"@importEmojis": {},
"wasDirectChatDisplayName": "",
"@wasDirectChatDisplayName": {
"@importEmojis": {},
"@wasDirectChatDisplayName": {
"type": "text",
"placeholders": {
"oldDisplayName": {}
}
},
"noChatDescriptionYet": "",
"@noChatDescriptionYet": {},
"removeFromBundle": "",
"@removeFromBundle": {},
"confirmMatrixId": "",
"@confirmMatrixId": {},
"learnMore": "",
"@learnMore": {},
"notAnImage": "",
"@notAnImage": {},
"users": "",
"@users": {},
"openGallery": "",
"@openGallery": {},
"chatDescriptionHasBeenChanged": "",
"@chatDescriptionHasBeenChanged": {},
"newGroup": "",
"@newGroup": {},
"bundleName": "",
"@bundleName": {},
"dehydrateTor": "",
"@dehydrateTor": {},
"removeFromSpace": "",
"@removeFromSpace": {},
"roomUpgradeDescription": "",
"@roomUpgradeDescription": {},
"scanQrCode": "",
"@scanQrCode": {},
"pleaseEnterANumber": "",
"@pleaseEnterANumber": {},
"youKicked": "",
"@youKicked": {
"@noChatDescriptionYet": {},
"@removeFromBundle": {},
"@confirmMatrixId": {},
"@learnMore": {},
"@notAnImage": {},
"@users": {},
"@openGallery": {},
"@chatDescriptionHasBeenChanged": {},
"@newGroup": {},
"@bundleName": {},
"@dehydrateTor": {},
"@removeFromSpace": {},
"@roomUpgradeDescription": {},
"@scanQrCode": {},
"@pleaseEnterANumber": {},
"@youKicked": {
"placeholders": {
"user": {}
}
},
"profileNotFound": "",
"@profileNotFound": {},
"jump": "",
"@jump": {},
"reactedWith": "",
"@reactedWith": {
"@profileNotFound": {},
"@jump": {},
"@reactedWith": {
"type": "text",
"placeholders": {
"sender": {},
"reaction": {}
}
},
"sorryThatsNotPossible": "",
"@sorryThatsNotPossible": {},
"videoWithSize": "",
"@videoWithSize": {
"@sorryThatsNotPossible": {},
"@videoWithSize": {
"type": "text",
"placeholders": {
"size": {}
}
},
"shareInviteLink": "",
"@shareInviteLink": {},
"commandHint_markasdm": "",
"@commandHint_markasdm": {},
"recoveryKeyLost": "",
"@recoveryKeyLost": {},
"cuddleContent": "",
"@cuddleContent": {
"@shareInviteLink": {},
"@commandHint_markasdm": {},
"@recoveryKeyLost": {},
"@cuddleContent": {
"type": "text",
"placeholders": {
"senderName": {}
}
},
"deviceKeys": "",
"@deviceKeys": {},
"emoteKeyboardNoRecents": "",
"@emoteKeyboardNoRecents": {
"@deviceKeys": {},
"@emoteKeyboardNoRecents": {
"type": "text",
"placeholders": {}
},
"setTheme": "",
"@setTheme": {},
"youJoinedTheChat": "",
"@youJoinedTheChat": {},
"openVideoCamera": "",
"@openVideoCamera": {
"@setTheme": {},
"@youJoinedTheChat": {},
"@openVideoCamera": {
"type": "text",
"placeholders": {}
},
"markAsRead": "",
"@markAsRead": {},
"widgetName": "",
"@widgetName": {},
"errorAddingWidget": "",
"@errorAddingWidget": {},
"commandHint_dm": "",
"@commandHint_dm": {
"@markAsRead": {},
"@widgetName": {},
"@errorAddingWidget": {},
"@commandHint_dm": {
"type": "text",
"description": "Usage hint for the command /dm"
},
"commandHint_hug": "",
"@commandHint_hug": {},
"replace": "",
"@replace": {},
"youUnbannedUser": "",
"@youUnbannedUser": {
"@commandHint_hug": {},
"@replace": {},
"@youUnbannedUser": {
"placeholders": {
"user": {}
}
},
"newSpace": "",
"@newSpace": {},
"emojis": "",
"@emojis": {},
"commandHint_googly": "",
"@commandHint_googly": {},
"pleaseTryAgainLaterOrChooseDifferentServer": "",
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"createGroup": "",
"@createGroup": {},
"hydrateTorLong": "",
"@hydrateTorLong": {},
"time": "",
"@time": {},
"custom": "",
"@custom": {},
"noBackupWarning": "",
"@noBackupWarning": {},
"storeInSecureStorageDescription": "",
"@storeInSecureStorageDescription": {},
"openChat": "",
"@openChat": {},
"kickUserDescription": "",
"@kickUserDescription": {},
"importNow": "",
"@importNow": {},
"pinMessage": "",
"@pinMessage": {},
"invite": "",
"@invite": {},
"enableMultiAccounts": "",
"@enableMultiAccounts": {},
"indexedDbErrorTitle": "",
"@indexedDbErrorTitle": {},
"unsupportedAndroidVersionLong": "",
"@unsupportedAndroidVersionLong": {},
"storeSecurlyOnThisDevice": "",
"@storeSecurlyOnThisDevice": {},
"screenSharingDetail": "",
"@screenSharingDetail": {},
"placeCall": "",
"@placeCall": {}
"@newSpace": {},
"@emojis": {},
"@commandHint_googly": {},
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
"@createGroup": {},
"@hydrateTorLong": {},
"@time": {},
"@custom": {},
"@noBackupWarning": {},
"@storeInSecureStorageDescription": {},
"@openChat": {},
"@kickUserDescription": {},
"@importNow": {},
"@pinMessage": {},
"@invite": {},
"@enableMultiAccounts": {},
"@indexedDbErrorTitle": {},
"@unsupportedAndroidVersionLong": {},
"@storeSecurlyOnThisDevice": {},
"@screenSharingDetail": {},
"@placeCall": {}
}

View file

@ -721,7 +721,7 @@
"type": "text",
"placeholders": {}
},
"inviteText": "{username} bjöd in dig till FluffyChat.\n1. Besök fluffychat.im och installera appen\n2. Registrera dig eller logga in\n3. Öppna inbjudningslänk:\n {link}",
"inviteText": "{username} bjöd in dig till FluffyChat.\n1. Besök fluffychat.im och installera appen\n2. Registrera dig eller logga in\n3. Öppna inbjudningslänk:\n {link}",
"@inviteText": {
"type": "text",
"placeholders": {
@ -2510,5 +2510,98 @@
"searchChatsRooms": "Sök efter #chattar, @användare…",
"@searchChatsRooms": {},
"databaseMigrationBody": "Var vänlig vänta. Detta kan ta en stund.",
"@databaseMigrationBody": {}
"@databaseMigrationBody": {},
"youInvitedToBy": "📩 Du har blivit inbjuden via länk till:\n{alias}",
"@youInvitedToBy": {
"placeholders": {
"alias": {}
}
},
"sendTypingNotificationsDescription": "Andra deltagare i en diskussion kan se när du skriver.",
"@sendTypingNotificationsDescription": {},
"formattedMessagesDescription": "Visa formaterat meddelandeinnehåll som fet stil med markdown.",
"@formattedMessagesDescription": {},
"verifyOtherUser": "🔐 Verifiera användaren",
"@verifyOtherUser": {},
"formattedMessages": "Formaterade meddelanden",
"@formattedMessages": {},
"canceledKeyVerification": "{sender} avbröt nyckelverifieringen",
"@canceledKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"completedKeyVerification": "{sender} fullbordade nyckelverifieringen",
"@completedKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"requestedKeyVerification": "{sender} begärde nyckelverifiering",
"@requestedKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"transparent": "Transparent",
"@transparent": {},
"startedKeyVerification": "{sender} påbörjade nyckelverifiering",
"@startedKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"presenceStyle": "Närvaro:",
"@presenceStyle": {
"type": "text",
"placeholders": {}
},
"presencesToggle": "Visa statusmeddelanden från andra användare",
"@presencesToggle": {
"type": "text",
"placeholders": {}
},
"hidePresences": "Dölj statuslista?",
"@hidePresences": {},
"sendReadReceipts": "Skicka läskvitton",
"@sendReadReceipts": {},
"verifyOtherDevice": "🔐 Verifiera enhet",
"@verifyOtherDevice": {},
"acceptedKeyVerification": "{sender} accepterade nyckelverifieringen",
"@acceptedKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"incomingMessages": "Inkommande meddelanden",
"@incomingMessages": {},
"forwardMessageTo": "Vidarebefordra meddelandet till {roomName}?",
"@forwardMessageTo": {
"type": "text",
"placeholders": {
"roomName": {}
}
},
"verifyOtherUserDescription": "Om du verifierar en användare så kan du vara säker på vem du verkligen skriver till. 💪\n\nNär du påbörjar en verifiering så ser du och den andra användaren en popup-ruta i appen. I den rutan ser du ett antal tecken som du jämför med vad den andra användaren ser.\n\nDet bästa sättet att göra detta är att träffas fysiskt, eller genom att starta ett videosamtal. 👭",
"@verifyOtherUserDescription": {},
"verifyOtherDeviceDescription": "När du verifierar en enhet så kan era enheter utväxla nycklar, vilket förbättrar säkerheten. 💪 När du påbörjar en verifiering så ser du en popup-ruta på båda enheterna. I den rutan ser du ett antal tecken som du jämför med det som visas på den andra enheten. Det är bäst att ha båda enheterna till hands innan du påbörjar verifieringen. 🤳",
"@verifyOtherDeviceDescription": {},
"isReadyForKeyVerification": "{sender} är redo för nyckelverifiering",
"@isReadyForKeyVerification": {
"type": "text",
"placeholders": {
"sender": {}
}
},
"sendReadReceiptsDescription": "Andra deltagare i en diskussion kan se när du läst ett meddelande.",
"@sendReadReceiptsDescription": {},
"stickers": "Klistermärken",
"@stickers": {},
"discover": "Upptäck",
"@discover": {}
}

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

View file

@ -2600,5 +2600,9 @@
"hidePresences": "Сховати список станів?",
"@hidePresences": {},
"incomingMessages": "Вхідні повідомлення",
"@incomingMessages": {}
"@incomingMessages": {},
"discover": "Огляд",
"@discover": {},
"stickers": "Наліпки",
"@stickers": {}
}

File diff suppressed because it is too large Load diff

View file

@ -2600,5 +2600,111 @@
"hidePresences": "隐藏状态列表?",
"@hidePresences": {},
"incomingMessages": "传入消息",
"@incomingMessages": {}
"@incomingMessages": {},
"stickers": "贴纸",
"@stickers": {},
"discover": "发现",
"@discover": {},
"commandHint_ignore": "忽略给定的 matrix ID",
"@commandHint_ignore": {},
"commandHint_unignore": "取消忽略给定的 matrix ID",
"@commandHint_unignore": {},
"unreadChatsInApp": "{appname}: {unread} 未读聊天",
"@unreadChatsInApp": {
"type": "text",
"placeholders": {
"appname": {},
"unread": {}
}
},
"appLockDescription": "用 pin 码在不用 FluffyChat 时锁定它",
"@appLockDescription": {},
"globalChatId": "全局聊天 ID",
"@globalChatId": {},
"accessAndVisibility": "访问和可见性",
"@accessAndVisibility": {},
"accessAndVisibilityDescription": "谁可以加入此聊天以及怎样发现该聊天。",
"@accessAndVisibilityDescription": {},
"calls": "通话",
"@calls": {},
"customEmojisAndStickers": "自定义表情符号和贴纸",
"@customEmojisAndStickers": {},
"hideRedactedMessages": "隐藏被涂黑的消息",
"@hideRedactedMessages": {},
"overview": "概览",
"@overview": {},
"notifyMeFor": "提示内容",
"@notifyMeFor": {},
"passwordRecoverySettings": "密码发现设置",
"@passwordRecoverySettings": {},
"noPublicLinkHasBeenCreatedYet": "尚未创建公开链接",
"@noPublicLinkHasBeenCreatedYet": {},
"knock": "请求",
"@knock": {},
"noOneCanJoin": "无人可以加入",
"@noOneCanJoin": {},
"knocking": "正在请求",
"@knocking": {},
"chatCanBeDiscoveredViaSearchOnServer": "可通过搜索 {server} 发现聊天",
"@chatCanBeDiscoveredViaSearchOnServer": {
"type": "text",
"placeholders": {
"server": {}
}
},
"thereAreCountUsersBlocked": "目前有 {count} 名用户被封禁。",
"@thereAreCountUsersBlocked": {
"type": "text",
"count": {}
},
"hideRedactedMessagesBody": "如果某人涂黑了一条消息,那么在聊天中再也看不到这条消息。",
"@hideRedactedMessagesBody": {},
"hideInvalidOrUnknownMessageFormats": "隐藏无效或未知的消息格式",
"@hideInvalidOrUnknownMessageFormats": {},
"hideMemberChangesInPublicChats": "在公开聊天中隐藏成员变化",
"@hideMemberChangesInPublicChats": {},
"hideMemberChangesInPublicChatsBody": "不在聊天时间线中显示某人是否加入或离开了公开聊天来改进可读性。",
"@hideMemberChangesInPublicChatsBody": {},
"userWouldLikeToChangeTheChat": "{user} 想加入聊天。",
"@userWouldLikeToChangeTheChat": {
"placeholders": {
"user": {}
}
},
"customEmojisAndStickersBody": "添加或分享可用于任何聊天的表情符号或贴纸。",
"@customEmojisAndStickersBody": {},
"usersMustKnock": "用户必须请求加入",
"@usersMustKnock": {},
"noDatabaseEncryption": "数据库加密在此平台上不受支持",
"@noDatabaseEncryption": {},
"userRole": "用户角色",
"@userRole": {},
"minimumPowerLevel": "{level} 是最低权限等级。",
"@minimumPowerLevel": {
"type": "text",
"placeholders": {
"level": {}
}
},
"publicChatAddresses": "公开聊天的地址",
"@publicChatAddresses": {},
"createNewAddress": "新建地址",
"@createNewAddress": {},
"searchMore": "搜索更多…",
"@searchMore": {},
"gallery": "图库",
"@gallery": {},
"files": "文件",
"@files": {},
"searchIn": "在 “{chat}” 聊天中搜索…",
"@searchIn": {
"type": "text",
"placeholders": {
"chat": {}
}
},
"knockRestricted": "“请求加入”请求受限",
"@knockRestricted": {},
"restricted": "受限",
"@restricted": {}
}

File diff suppressed because it is too large Load diff

3
devtools_options.yaml Normal file
View file

@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:

View file

@ -156,7 +156,8 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.2.5)
rexml (3.2.8)
strscan (>= 3.0.9)
rouge (2.0.7)
ruby2_keywords (0.0.4)
rubyzip (2.3.0)
@ -169,6 +170,7 @@ GEM
simctl (1.6.8)
CFPropertyList
naturally
strscan (3.1.0)
terminal-notifier (2.0.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)

View file

@ -197,6 +197,7 @@
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */,
064CBD7CE0D4CD6850C6880A /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@ -288,6 +289,23 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
064CBD7CE0D4CD6850C6880A /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;

View file

@ -62,10 +62,11 @@ abstract class AppConfig {
host: 'github.com',
path: '/krille-chan/fluffychat/issues/new',
);
// #Pangea
// static bool renderHtml = true;
static const bool enableSentry = true;
static const String sentryDns =
'https://8591d0d863b646feb4f3dda7e5dcab38@o256755.ingest.sentry.io/5243143';
// #Pangea
static bool renderHtml = false;
// static bool renderHtml = true;
// Pangea#
@ -75,11 +76,12 @@ abstract class AppConfig {
static bool separateChatTypes = false;
static bool autoplayImages = true;
static bool sendTypingNotifications = true;
static bool sendPublicReadReceipts = true;
static bool swipeRightToLeftToReply = true;
//#Pangea
static bool sendOnEnter = true;
// static bool sendOnEnter = false;
//Pangea#
static bool sendPublicReadReceipts = true;
static bool showPresences = true;
static bool experimentalVoip = false;
static const bool hideTypingUsernames = false;
@ -115,7 +117,6 @@ abstract class AppConfig {
host: 'servers.joinmatrix.org',
path: 'servers.json',
);
// #Pangea
static String googlePlayMangementUrl =
"https://play.google.com/store/account/subscriptions";

View file

@ -3,10 +3,12 @@ import 'dart:async';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pages/archive/archive.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart';
import 'package:fluffychat/pages/chat_details/chat_details.dart';
import 'package:fluffychat/pages/chat_list/chat_list.dart';
import 'package:fluffychat/pages/chat_members/chat_members.dart';
import 'package:fluffychat/pages/chat_permissions_settings/chat_permissions_settings.dart';
import 'package:fluffychat/pages/chat_search/chat_search_page.dart';
import 'package:fluffychat/pages/device_settings/device_settings.dart';
import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart';
import 'package:fluffychat/pages/invitation_selection/invitation_selection.dart';
@ -261,6 +263,7 @@ abstract class AppRoutes {
state,
ChatPage(
roomId: state.pathParameters['roomid']!,
eventId: state.uri.queryParameters['event'],
),
),
redirect: loggedOutRedirect,
@ -510,10 +513,22 @@ abstract class AppRoutes {
ChatPage(
roomId: state.pathParameters['roomid']!,
shareText: state.uri.queryParameters['body'],
eventId: state.uri.queryParameters['event'],
),
),
redirect: loggedOutRedirect,
routes: [
GoRoute(
path: 'search',
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
ChatSearchPage(
roomId: state.pathParameters['roomid']!,
),
),
redirect: loggedOutRedirect,
),
// #Pangea
// GoRoute(
// path: 'encryption',
@ -546,6 +561,17 @@ abstract class AppRoutes {
),
),
routes: [
GoRoute(
path: 'access',
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
ChatAccessSettings(
roomId: state.pathParameters['roomid']!,
),
),
redirect: loggedOutRedirect,
),
GoRoute(
path: 'members',
pageBuilder: (context, state) => defaultPageBuilder(
@ -621,13 +647,10 @@ abstract class AppRoutes {
Widget child,
) =>
FluffyThemes.isColumnMode(context)
? CustomTransitionPage(
? NoTransitionPage(
key: state.pageKey,
restorationId: state.pageKey.value,
child: child,
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(opacity: animation, child: child),
)
: MaterialPage(
key: state.pageKey,

View file

@ -26,8 +26,12 @@ abstract class SettingKeys {
static const String sendPublicReadReceipts =
'chat.fluffy.send_public_read_receipts';
static const String sendOnEnter = 'chat.fluffy.send_on_enter';
static const String swipeRightToLeftToReply =
'chat.fluffy.swipeRightToLeftToReply';
static const String experimentalVoip = 'chat.fluffy.experimental_voip';
static const String showPresences = 'chat.fluffy.show_presences';
static const String displayChatDetailsColumn =
'chat.fluffy.display_chat_details_column';
static const String noEncryptionWarningShown =
'chat.fluffy.no_encryption_warning_shown';
}

View file

@ -90,7 +90,8 @@ abstract class FluffyThemes {
),
),
textSelectionTheme: TextSelectionThemeData(
selectionColor: colorScheme.onBackground.withAlpha(128),
selectionColor: colorScheme.onSurface.withAlpha(128),
selectionHandleColor: colorScheme.secondary,
),
inputDecorationTheme: InputDecorationTheme(
border: OutlineInputBorder(
@ -106,13 +107,15 @@ abstract class FluffyThemes {
? Colors.grey.withAlpha(64)
: null,
surfaceTintColor:
FluffyThemes.isColumnMode(context) ? colorScheme.background : null,
FluffyThemes.isColumnMode(context) ? colorScheme.surface : null,
backgroundColor:
FluffyThemes.isColumnMode(context) ? colorScheme.surface : null,
systemOverlayStyle: SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarIconBrightness: brightness.reversed,
statusBarBrightness: brightness,
systemNavigationBarIconBrightness: brightness.reversed,
systemNavigationBarColor: colorScheme.background,
systemNavigationBarColor: colorScheme.surface,
),
),
textButtonTheme: TextButtonThemeData(
@ -141,6 +144,9 @@ abstract class FluffyThemes {
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: colorScheme.secondaryContainer,
foregroundColor: colorScheme.onSecondaryContainer,
elevation: 0,
padding: const EdgeInsets.all(16),
textStyle: const TextStyle(fontSize: 16),
shape: RoundedRectangleBorder(

View file

@ -386,7 +386,10 @@ class BootstrapDialogState extends State<BootstrapDialog> {
const SizedBox(height: 16),
ElevatedButton.icon(
style: ElevatedButton.styleFrom(
foregroundColor: Colors.red,
backgroundColor:
Theme.of(context).colorScheme.errorContainer,
foregroundColor:
Theme.of(context).colorScheme.onErrorContainer,
),
icon: const Icon(Icons.delete_outlined),
label: Text(L10n.of(context)!.recoveryKeyLost),

View file

@ -37,7 +37,6 @@ import 'package:fluffychat/widgets/app_lock.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:future_loading_dialog/future_loading_dialog.dart';
@ -57,10 +56,12 @@ import 'send_location_dialog.dart';
class ChatPage extends StatelessWidget {
final String roomId;
final String? shareText;
final String? eventId;
const ChatPage({
super.key,
required this.roomId,
this.eventId,
this.shareText,
});
@ -84,9 +85,10 @@ class ChatPage extends StatelessWidget {
}
return ChatPageWithRoom(
key: Key('chat_page_$roomId'),
key: Key('chat_page_${roomId}_$eventId'),
room: room,
shareText: shareText,
eventId: eventId,
);
}
}
@ -94,11 +96,13 @@ class ChatPage extends StatelessWidget {
class ChatPageWithRoom extends StatefulWidget {
final Room room;
final String? shareText;
final String? eventId;
const ChatPageWithRoom({
super.key,
required this.room,
this.shareText,
this.eventId,
});
@override
@ -298,12 +302,14 @@ class ChatController extends State<ChatPageWithRoom>
void initState() {
scrollController.addListener(_updateScrollController);
inputFocus.addListener(_inputFocusListener);
_loadDraft();
super.initState();
_displayChatDetailsColumn = ValueNotifier(
Matrix.of(context).store.getBool(SettingKeys.displayChatDetailsColumn) ??
false,
);
sendingClient = Matrix.of(context).client;
WidgetsBinding.instance.addObserver(this);
// #Pangea
@ -354,15 +360,19 @@ class ChatController extends State<ChatPageWithRoom>
}
void _tryLoadTimeline() async {
final initialEventId = widget.eventId;
loadTimelineFuture = _getTimeline();
try {
await loadTimelineFuture;
if (initialEventId != null) scrollToEventId(initialEventId);
final fullyRead = room.fullyRead;
if (fullyRead.isEmpty) {
setReadMarker();
return;
}
if (timeline!.events.any((event) => event.eventId == fullyRead)) {
if (timeline?.events.any((event) => event.eventId == fullyRead) ??
false) {
Logs().v('Scroll up to visible event', fullyRead);
setReadMarker();
return;
@ -458,18 +468,6 @@ class ChatController extends State<ChatPageWithRoom>
timeline!.requestKeys(onlineKeyBackupOnly: false);
if (room.markedUnread) room.markUnread(false);
// 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 (mounted) {
final event = GoRouterState.of(context).uri.queryParameters['event'];
if (event != null) {
scrollToEventId(event);
}
}
});
return;
}
@ -800,7 +798,7 @@ class ChatController extends State<ChatPageWithRoom>
}
// #Pangea
// if (await Record().hasPermission() == false) return;
// if (await AudioRecorder().hasPermission() == false) return;
// Pangea#
final result = await showDialog<RecordingResult>(
context: context,
@ -981,7 +979,7 @@ class ChatController extends State<ChatPageWithRoom>
);
}
for (final event in selectedEvents) {
await event.remove();
await event.cancelSend();
}
setState(selectedEvents.clear);
} catch (e, s) {
@ -1031,7 +1029,7 @@ class ChatController extends State<ChatPageWithRoom>
);
}
} else {
await event.remove();
await event.cancelSend();
}
},
);
@ -1512,25 +1510,12 @@ class ChatController extends State<ChatPageWithRoom>
);
if (callType == null) return;
final success = await showFutureLoadingDialog(
context: context,
future: () =>
Matrix.of(context).voipPlugin!.voip.requestTurnServerCredentials(),
);
if (success.result != null) {
final voipPlugin = Matrix.of(context).voipPlugin;
try {
await voipPlugin!.voip.inviteToCall(room.id, callType);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(e.toLocalizedString(context))),
);
}
} else {
await showOkAlertDialog(
context: context,
title: L10n.of(context)!.unavailable,
okLabel: L10n.of(context)!.next,
final voipPlugin = Matrix.of(context).voipPlugin;
try {
await voipPlugin!.voip.inviteToCall(room, callType);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(e.toLocalizedString(context))),
);
}
}

View file

@ -58,11 +58,11 @@ class ChatEmojiPicker extends StatelessWidget {
),
skinToneConfig: SkinToneConfig(
dialogBackgroundColor: Color.lerp(
theme.colorScheme.background,
theme.colorScheme.surface,
theme.colorScheme.primaryContainer,
0.75,
)!,
indicatorColor: theme.colorScheme.onBackground,
indicatorColor: theme.colorScheme.onSurface,
),
),
),

View file

@ -128,7 +128,6 @@ class ChatView extends StatelessWidget {
),
];
}
// else if (!controller.room.isArchived) {
// return [
// if (Matrix.of(context).voipPlugin != null &&
@ -175,7 +174,8 @@ class ChatView extends StatelessWidget {
}
},
child: StreamBuilder(
stream: controller.room.onUpdate.stream
stream: controller.room.client.onRoomState.stream
.where((update) => update.roomId == controller.room.id)
.rateLimit(const Duration(seconds: 1)),
builder: (context, snapshot) => FutureBuilder(
future: controller.loadTimelineFuture,
@ -212,7 +212,7 @@ class ChatView extends StatelessWidget {
// #Pangea
&&
!r.isAnalyticsRoom,
// Pangea#,
// Pangea#
badgePosition: BadgePosition.topEnd(end: 8, top: 4),
child: const Center(child: BackButton()),
),
@ -364,6 +364,7 @@ class ChatView extends StatelessWidget {
clipBehavior: Clip.hardEdge,
color: Theme.of(context)
.colorScheme
// ignore: deprecated_member_use
.surfaceVariant,
borderRadius: const BorderRadius.all(
Radius.circular(24),
@ -456,8 +457,8 @@ class ChatView extends StatelessWidget {
// #Pangea
// if (controller.dragging)
// Container(
// color: Theme.of(context)
// .scaffoldBackgroundColor
// color: Theme.of(context)
// .scaffoldBackgroundColor
// .withOpacity(0.9),
// alignment: Alignment.center,
// child: const Icon(
@ -511,4 +512,4 @@ class ConditionalScroll extends StatelessWidget {
return child;
}
}
// #Pangea
// Pangea#

View file

@ -2,6 +2,28 @@
import 'package:flutter_gen/gen_l10n/l10n.dart';
String commandExample(String command) {
switch (command) {
case 'markasdm':
case 'kick':
case 'dm':
case 'ban':
case 'unban':
case 'ignore':
case 'unignore':
case 'invite':
return '/$command <matrix-id>';
case 'html':
case 'sendraw':
case 'plain':
return '/$command <message>';
case 'op':
return '/$command <matrix-id> <power-level>';
default:
return '/$command';
}
}
String commandHint(L10n l10n, String command) {
switch (command) {
case "ban":

View file

@ -72,11 +72,16 @@ class EventInfoDialog extends StatelessWidget {
padding: const EdgeInsets.all(12.0),
child: Material(
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
color: Theme.of(context).colorScheme.surface,
color: Theme.of(context).colorScheme.inverseSurface,
child: SingleChildScrollView(
padding: const EdgeInsets.all(8),
scrollDirection: Axis.horizontal,
child: SelectableText(prettyJson),
child: SelectableText(
prettyJson,
style: TextStyle(
color: Theme.of(context).colorScheme.onInverseSurface,
),
),
),
),
),

View file

@ -241,6 +241,9 @@ class AudioPlayerState extends State<AudioPlayerWidget> {
if (audioPlayer == null) return;
switch (audioPlayer.speed) {
case 1.0:
await audioPlayer.setSpeed(1.25);
break;
case 1.25:
await audioPlayer.setSpeed(1.5);
break;
case 1.5:
@ -295,7 +298,7 @@ class AudioPlayerState extends State<AudioPlayerWidget> {
final statusText = this.statusText ??= _durationString ?? '00:00';
final audioPlayer = this.audioPlayer;
return Padding(
padding: const EdgeInsets.all(16),
padding: const EdgeInsets.all(12.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
@ -330,80 +333,75 @@ class AudioPlayerState extends State<AudioPlayerWidget> {
),
),
const SizedBox(width: 8),
Expanded(
child: Row(
children: [
for (var i = 0; i < AudioPlayerWidget.wavesCount; i++)
Expanded(
child: GestureDetector(
onTapDown: (_) => audioPlayer?.seek(
Duration(
milliseconds:
(maxPosition / AudioPlayerWidget.wavesCount)
.round() *
i,
),
),
child: Container(
height: 32,
alignment: Alignment.center,
child: Opacity(
opacity: currentPosition > i ? 1 : 0.5,
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 1),
decoration: BoxDecoration(
color: widget.color,
borderRadius: BorderRadius.circular(64),
),
height: 32 * (waveform[i] / 1024),
),
),
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
for (var i = 0; i < AudioPlayerWidget.wavesCount; i++)
GestureDetector(
onTapDown: (_) => audioPlayer?.seek(
Duration(
milliseconds:
(maxPosition / AudioPlayerWidget.wavesCount).round() *
i,
),
),
],
),
),
const SizedBox(width: 8),
Container(
alignment: Alignment.centerRight,
width: 42,
child: Text(
statusText,
style: TextStyle(
color: widget.color,
),
),
),
const SizedBox(width: 4),
Stack(
children: [
SizedBox(
width: buttonSize,
height: buttonSize,
child: InkWell(
splashColor: widget.color.withAlpha(128),
borderRadius: BorderRadius.circular(64),
onTap: audioPlayer == null ? null : _toggleSpeed,
child: Icon(Icons.mic_none_outlined, color: widget.color),
),
),
if (audioPlayer != null)
Positioned(
bottom: 0,
left: 0,
right: 0,
child: Text(
'${audioPlayer.speed.toString()}x',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 9.0,
color: widget.color,
child: Container(
height: 32,
color: widget.color.withAlpha(0),
alignment: Alignment.center,
child: Opacity(
opacity: currentPosition > i ? 1 : 0.5,
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 1),
decoration: BoxDecoration(
color: widget.color,
borderRadius: BorderRadius.circular(2),
),
// #Pangea
// width: 2,
width: 1,
// Pangea#
height: 32 * (waveform[i] / 1024),
),
),
),
),
],
),
const SizedBox(width: 8),
SizedBox(
width: 36,
child: Text(
statusText,
style: TextStyle(
color: widget.color,
fontSize: 12,
),
),
),
// #Pangea
// const SizedBox(width: 8),
// Badge(
// isLabelVisible: audioPlayer != null,
// label: audioPlayer == null
// ? null
// : Text(
// '${audioPlayer.speed.toString()}x',
// ),
// backgroundColor: Theme.of(context).colorScheme.secondary,
// textColor: Theme.of(context).colorScheme.onSecondary,
// child: InkWell(
// splashColor: widget.color.withAlpha(128),
// borderRadius: BorderRadius.circular(64),
// onTap: audioPlayer == null ? null : _toggleSpeed,
// child: Icon(
// Icons.mic_none_outlined,
// color: widget.color,
// ),
// ),
// ),
// const SizedBox(width: 8),
// Pangea#
],
),
);

View file

@ -58,22 +58,6 @@ class HtmlMessage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// riot-web is notorious for creating bad reply fallback events from invalid messages which, if
// not handled properly, can lead to impersination. As such, we strip the entire `<mx-reply>` tags
// here already, to prevent that from happening.
// We do *not* do this in an AST and just with simple regex here, as riot-web tends to create
// miss-matching tags, and this way we actually correctly identify what we want to strip and, well,
// strip it.
final renderHtml = html.replaceAll(
RegExp(
'<mx-reply>.*</mx-reply>',
caseSensitive: false,
multiLine: false,
dotAll: true,
),
'',
);
final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor;
final linkColor = textColor.withAlpha(150);
@ -88,7 +72,7 @@ class HtmlMessage extends StatelessWidget {
padding: HtmlPaddings.only(left: 6, bottom: 0),
);
final element = _linkifyHtml(HtmlParser.parseHTML(renderHtml));
final element = _linkifyHtml(HtmlParser.parseHTML(html));
// there is no need to pre-validate the html, as we validate it while rendering
// #Pangea

View file

@ -70,6 +70,8 @@ class ImageBubble extends StatelessWidget {
final borderRadius =
this.borderRadius ?? BorderRadius.circular(AppConfig.borderRadius);
return Material(
color: Colors.transparent,
clipBehavior: Clip.hardEdge,
shape: RoundedRectangleBorder(
borderRadius: borderRadius,
side: BorderSide(

View file

@ -7,7 +7,6 @@ import 'package:fluffychat/pangea/widgets/chat/message_toolbar.dart';
import 'package:fluffychat/utils/date_time_extension.dart';
import 'package:fluffychat/utils/string_color.dart';
import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/hover_builder.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@ -62,13 +61,13 @@ class Message extends StatelessWidget {
this.highlightMarker = false,
this.animateIn = false,
this.resetAnimateIn,
this.avatarPresenceBackgroundColor,
// #Pangea
required this.selectedDisplayLang,
required this.immersionMode,
required this.definitions,
required this.controller,
// Pangea#
this.avatarPresenceBackgroundColor,
super.key,
});
@ -108,6 +107,7 @@ class Message extends StatelessWidget {
final client = Matrix.of(context).client;
final ownMessage = event.senderId == client.userID;
final alignment = ownMessage ? Alignment.topRight : Alignment.topLeft;
// ignore: deprecated_member_use
var color = Theme.of(context).colorScheme.surfaceVariant;
final displayTime = event.type == EventTypes.RoomCreate ||
nextEvent == null ||
@ -132,7 +132,7 @@ class Message extends StatelessWidget {
final textColor = ownMessage
? Theme.of(context).colorScheme.onPrimary
: Theme.of(context).colorScheme.onBackground;
: Theme.of(context).colorScheme.onSurface;
final rowMainAxisAlignment =
ownMessage ? MainAxisAlignment.end : MainAxisAlignment.start;
@ -190,268 +190,334 @@ class Message extends StatelessWidget {
setState(resetAnimateIn);
});
}
return AnimatedSlide(
offset: Offset(0, animateIn ? 1 : 0),
return AnimatedSize(
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: rowMainAxisAlignment,
children: [
if (longPressSelect)
SizedBox(
height: 32,
width: Avatar.defaultSize,
child: Checkbox.adaptive(
value: selected,
shape: const CircleBorder(),
onChanged: (_) => onSelect(event),
),
)
else if (nextEventSameSender || ownMessage)
SizedBox(
width: Avatar.defaultSize,
child: Center(
child: SizedBox(
width: 16,
height: 16,
child: event.status == EventStatus.error
? const Icon(Icons.error, color: Colors.red)
: event.fileSendingStatus != null
? const CircularProgressIndicator.adaptive(
strokeWidth: 1,
)
: null,
),
),
)
else
FutureBuilder<User?>(
future: event.fetchSenderUser(),
builder: (context, snapshot) {
final user =
snapshot.data ?? event.senderFromMemoryOrFallback;
return Avatar(
mxContent: user.avatarUrl,
name: user.calcDisplayname(),
presenceUserId: user.stateKey,
presenceBackgroundColor: avatarPresenceBackgroundColor,
onTap: () => onAvatarTab(event),
);
},
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
clipBehavior: Clip.none,
alignment: ownMessage ? Alignment.bottomRight : Alignment.bottomLeft,
child: animateIn
? const SizedBox(height: 0, width: double.infinity)
: Stack(
children: [
if (!nextEventSameSender)
Padding(
padding: const EdgeInsets.only(left: 8.0, bottom: 4),
child: ownMessage || event.room.isDirectChat
? const SizedBox(height: 12)
: FutureBuilder<User?>(
future: event.fetchSenderUser(),
builder: (context, snapshot) {
final displayname =
snapshot.data?.calcDisplayname() ??
event.senderFromMemoryOrFallback
.calcDisplayname();
return Text(
displayname,
style: TextStyle(
fontSize: 12,
color: (Theme.of(context).brightness ==
Brightness.light
? displayname.color
: displayname.lightColorText),
),
);
},
),
),
Container(
alignment: alignment,
padding: const EdgeInsets.only(left: 8),
child: GestureDetector(
// #Pangea
onTap: () => toolbarController?.showToolbar(context),
onDoubleTap: () =>
toolbarController?.showToolbar(context),
// Pangea#
onLongPress: longPressSelect
? null
: () {
HapticFeedback.heavyImpact();
onSelect(event);
},
child: AnimatedOpacity(
opacity: animateIn
? 0
: event.redacted ||
event.messageType ==
MessageTypes.BadEncrypted ||
event.status.isSending
? 0.5
: 1,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
child: Material(
color: noBubble ? Colors.transparent : color,
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: borderRadius,
),
// #Pangea
child: CompositedTransformTarget(
link: MatrixState.pAnyState
.layerLinkAndKey(event.eventId)
.link,
child: Container(
key: MatrixState.pAnyState
.layerLinkAndKey(event.eventId)
.key,
// Pangea#
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
AppConfig.borderRadius,
),
),
padding: noBubble || noPadding
? EdgeInsets.zero
: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth * 1.5,
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
if (event.relationshipType ==
RelationshipTypes.reply)
FutureBuilder<Event?>(
future: event.getReplyEvent(timeline),
builder:
(BuildContext context, snapshot) {
final replyEvent = snapshot.hasData
? snapshot.data!
: Event(
eventId: event
.relationshipEventId!,
content: {
'msgtype': 'm.text',
'body': '...',
},
senderId: event.senderId,
type: 'm.room.message',
room: event.room,
status: EventStatus.sent,
originServerTs:
DateTime.now(),
);
return Padding(
padding: const EdgeInsets.only(
bottom: 4.0,
),
child: InkWell(
borderRadius:
ReplyContent.borderRadius,
onTap: () => scrollToEventId(
replyEvent.eventId,
),
child: AbsorbPointer(
child: ReplyContent(
replyEvent,
ownMessage: ownMessage,
timeline: timeline,
),
),
),
);
},
),
MessageContent(
displayEvent,
textColor: textColor,
onInfoTab: onInfoTab,
borderRadius: borderRadius,
// #Pangea
selected: selected,
pangeaMessageEvent:
toolbarController?.pangeaMessageEvent,
immersionMode: immersionMode,
toolbarController: toolbarController,
// Pangea#
),
if (event.hasAggregatedEvents(
timeline,
RelationshipTypes.edit,
) // #Pangea
||
(toolbarController
?.pangeaMessageEvent
.showUseType ??
false)
// Pangea#
)
Padding(
padding: const EdgeInsets.only(
top: 4.0,
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
// #Pangea
if (toolbarController
?.pangeaMessageEvent
.showUseType ??
false) ...[
toolbarController!
.pangeaMessageEvent.useType
.iconView(
context,
textColor.withAlpha(164),
),
const SizedBox(width: 4),
],
if (event.hasAggregatedEvents(
timeline,
RelationshipTypes.edit,
)) ...[
// Pangea#
Icon(
Icons.edit_outlined,
color: textColor.withAlpha(164),
size: 14,
),
Text(
' - ${displayEvent.originServerTs.localizedTimeShort(context)}',
style: TextStyle(
color:
textColor.withAlpha(164),
fontSize: 12,
),
),
],
],
),
),
],
),
),
),
),
Positioned(
top: 0,
bottom: 0,
left: 0,
right: 0,
child: InkWell(
onTap: () => onSelect(event),
onLongPress: () => onSelect(event),
borderRadius:
BorderRadius.circular(AppConfig.borderRadius / 2),
child: Material(
borderRadius:
BorderRadius.circular(AppConfig.borderRadius / 2),
color: selected
? Theme.of(context)
.colorScheme
.secondaryContainer
.withAlpha(100)
: highlightMarker
? Theme.of(context)
.colorScheme
.tertiaryContainer
.withAlpha(100)
: Colors.transparent,
),
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: rowMainAxisAlignment,
children: [
if (longPressSelect)
SizedBox(
height: 32,
width: Avatar.defaultSize,
child: Checkbox.adaptive(
value: selected,
shape: const CircleBorder(),
onChanged: (_) => onSelect(event),
),
)
else if (nextEventSameSender || ownMessage)
SizedBox(
width: Avatar.defaultSize,
child: Center(
child: SizedBox(
width: 16,
height: 16,
child: event.status == EventStatus.error
? const Icon(Icons.error, color: Colors.red)
: event.fileSendingStatus != null
? const CircularProgressIndicator
.adaptive(
strokeWidth: 1,
)
: null,
),
),
)
else
FutureBuilder<User?>(
future: event.fetchSenderUser(),
builder: (context, snapshot) {
final user = snapshot.data ??
event.senderFromMemoryOrFallback;
return Avatar(
mxContent: user.avatarUrl,
name: user.calcDisplayname(),
presenceUserId: user.stateKey,
presenceBackgroundColor:
avatarPresenceBackgroundColor,
onTap: () => onAvatarTab(event),
);
},
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
if (!nextEventSameSender)
Padding(
padding: const EdgeInsets.only(
left: 8.0,
bottom: 4,
),
child: ownMessage || event.room.isDirectChat
? const SizedBox(height: 12)
: FutureBuilder<User?>(
future: event.fetchSenderUser(),
builder: (context, snapshot) {
final displayname = snapshot.data
?.calcDisplayname() ??
event.senderFromMemoryOrFallback
.calcDisplayname();
return Text(
displayname,
style: TextStyle(
fontSize: 12,
color: (Theme.of(context)
.brightness ==
Brightness.light
? displayname.color
: displayname
.lightColorText),
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
);
},
),
),
Container(
alignment: alignment,
padding: const EdgeInsets.only(left: 8),
child: GestureDetector(
// #Pangea
onTap: () =>
toolbarController?.showToolbar(context),
onDoubleTap: () =>
toolbarController?.showToolbar(context),
// Pangea#
onLongPress: longPressSelect
? null
: () {
HapticFeedback.heavyImpact();
onSelect(event);
},
child: AnimatedOpacity(
opacity: animateIn
? 0
: event.redacted ||
event.messageType ==
MessageTypes.BadEncrypted ||
event.status.isSending
? 0.5
: 1,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
child: Material(
color:
noBubble ? Colors.transparent : color,
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: borderRadius,
),
// #Pangea
child: CompositedTransformTarget(
link: MatrixState.pAnyState
.layerLinkAndKey(event.eventId)
.link,
child: Container(
key: MatrixState.pAnyState
.layerLinkAndKey(event.eventId)
.key,
// Pangea#
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
AppConfig.borderRadius,
),
),
padding: noBubble || noPadding
? EdgeInsets.zero
: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 8,
),
constraints: const BoxConstraints(
maxWidth:
FluffyThemes.columnWidth * 1.5,
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
if (event.relationshipType ==
RelationshipTypes.reply)
FutureBuilder<Event?>(
future: event
.getReplyEvent(timeline),
builder: (
BuildContext context,
snapshot,
) {
final replyEvent = snapshot
.hasData
? snapshot.data!
: Event(
eventId: event
.relationshipEventId!,
content: {
'msgtype':
'm.text',
'body': '...',
},
senderId:
event.senderId,
type:
'm.room.message',
room: event.room,
status: EventStatus
.sent,
originServerTs:
DateTime.now(),
);
return Padding(
padding:
const EdgeInsets.only(
bottom: 4.0,
),
child: InkWell(
borderRadius:
ReplyContent
.borderRadius,
onTap: () =>
scrollToEventId(
replyEvent.eventId,
),
child: AbsorbPointer(
child: ReplyContent(
replyEvent,
ownMessage:
ownMessage,
timeline: timeline,
),
),
),
);
},
),
MessageContent(
displayEvent,
textColor: textColor,
onInfoTab: onInfoTab,
borderRadius: borderRadius,
// #Pangea
selected: selected,
pangeaMessageEvent:
pangeaMessageEvent,
immersionMode: immersionMode,
toolbarController:
toolbarController,
// Pangea#
),
if (event.hasAggregatedEvents(
timeline,
RelationshipTypes.edit,
)
// #Pangea
||
(pangeaMessageEvent
?.showUseType ??
false)
// Pangea#
)
Padding(
padding:
const EdgeInsets.only(
top: 4.0,
),
child: Row(
mainAxisSize:
MainAxisSize.min,
children: [
// #Pangea
if (pangeaMessageEvent
?.showUseType ??
false) ...[
pangeaMessageEvent!
.useType
.iconView(
context,
textColor
.withAlpha(164),
),
const SizedBox(
width: 4,
),
],
if (event
.hasAggregatedEvents(
timeline,
RelationshipTypes.edit,
)) ...[
// Pangea#
Icon(
Icons.edit_outlined,
color: textColor
.withAlpha(164),
size: 14,
),
Text(
' - ${displayEvent.originServerTs.localizedTimeShort(context)}',
style: TextStyle(
color: textColor
.withAlpha(164),
fontSize: 12,
),
),
],
],
),
),
],
),
),
),
),
),
),
),
],
),
),
],
),
],
),
),
],
),
);
},
);
@ -472,11 +538,8 @@ class Message extends StatelessWidget {
child: Center(
child: Material(
color: displayTime
? Theme.of(context).colorScheme.background
: Theme.of(context)
.colorScheme
.background
.withOpacity(0.33),
? Theme.of(context).colorScheme.surface
: Theme.of(context).colorScheme.surface.withOpacity(0.33),
borderRadius:
BorderRadius.circular(AppConfig.borderRadius / 2),
clipBehavior: Clip.antiAlias,
@ -544,13 +607,7 @@ class Message extends StatelessWidget {
container = row;
}
return Container(
alignment: Alignment.center,
color: selected
? Theme.of(context).colorScheme.secondaryContainer.withAlpha(100)
: highlightMarker
? Theme.of(context).colorScheme.tertiaryContainer.withAlpha(100)
: Colors.transparent,
return Center(
child: Swipeable(
key: ValueKey(event.eventId),
background: const Padding(
@ -559,91 +616,21 @@ class Message extends StatelessWidget {
child: Icon(Icons.check_outlined),
),
),
direction: SwipeDirection.endToStart,
direction: AppConfig.swipeRightToLeftToReply
? SwipeDirection.endToStart
: SwipeDirection.startToEnd,
onSwipe: (_) => onSwipe(),
child: HoverBuilder(
builder: (context, hovered) => Stack(
children: [
Container(
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth * 2.5,
),
padding: EdgeInsets.only(
left: 8.0,
right: 8.0,
top: nextEventSameSender ? 1.0 : 4.0,
bottom: previousEventSameSender ? 1.0 : 4.0,
),
child: container,
),
// #Pangea
// Positioned(
// left: ownMessage ? null : 48,
// right: ownMessage ? 4 : null,
// top: displayTime ? 38 : 0,
// child: AnimatedScale(
// duration: Duration(
// milliseconds:
// (FluffyThemes.animationDuration.inMilliseconds / 2)
// .floor(),
// ),
// curve: FluffyThemes.animationCurve,
// scale: !longPressSelect && hovered ? 1 : 0,
// alignment: Alignment.center,
// child: Material(
// color: Theme.of(context)
// .colorScheme
// .secondaryContainer
// .withOpacity(0.9),
// elevation:
// Theme.of(context).appBarTheme.scrolledUnderElevation ??
// 4,
// borderRadius: BorderRadius.circular(AppConfig.borderRadius),
// shadowColor: Theme.of(context).appBarTheme.shadowColor,
// child: Row(
// mainAxisSize: MainAxisSize.min,
// children: [
// if (event.room.canSendDefaultMessages)
// SizedBox(
// width: 32,
// height: 32,
// child: IconButton(
// icon: Icon(
// Icons.reply_outlined,
// size: 16,
// color: Theme.of(context)
// .colorScheme
// .onTertiaryContainer,
// ),
// tooltip: L10n.of(context)!.reply,
// onPressed: event.room.canSendDefaultMessages
// ? () => onSwipe()
// : null,
// ),
// ),
// SizedBox(
// width: 32,
// height: 32,
// child: IconButton(
// icon: Icon(
// Icons.more_vert,
// size: 16,
// color: Theme.of(context)
// .colorScheme
// .onTertiaryContainer,
// ),
// tooltip: L10n.of(context)!.select,
// onPressed: () => onSelect(event),
// ),
// ),
// ],
// ),
// ),
// ),
// ),
// Pangea#
],
child: Container(
constraints: const BoxConstraints(
maxWidth: FluffyThemes.columnWidth * 2.5,
),
padding: EdgeInsets.only(
left: 8.0,
right: 8.0,
top: nextEventSameSender ? 1.0 : 4.0,
bottom: previousEventSameSender ? 1.0 : 4.0,
),
child: container,
),
),
);

View file

@ -188,10 +188,7 @@ class MessageContent extends StatelessWidget {
}
return MessageDownloadContent(event, textColor);
case MessageTypes.Video:
if (PlatformInfos.isMobile || PlatformInfos.isWeb) {
return EventVideoPlayer(event);
}
return MessageDownloadContent(event, textColor);
return EventVideoPlayer(event);
case MessageTypes.File:
return MessageDownloadContent(event, textColor);
@ -290,6 +287,7 @@ class MessageContent extends StatelessWidget {
event.numberEmotes > 0 &&
event.numberEmotes <= 10;
// #Pangea
// return Linkify(
final messageTextStyle = TextStyle(
color: textColor,
fontSize: bigEmotes ? fontSize * 3 : fontSize,
@ -305,90 +303,61 @@ class MessageContent extends StatelessWidget {
);
} else if (pangeaMessageEvent != null) {
toolbarController?.toolbar?.textSelection.setMessageText(
pangeaMessageEvent!.body,
(event.getDisplayEvent(pangeaMessageEvent!.timeline).body),
);
}
// Pangea#
return FutureBuilder<String>(
future: event.calcLocalizedBody(
return SelectableLinkify(
onSelectionChanged: (selection, cause) {
if (cause == SelectionChangedCause.longPress &&
toolbarController != null &&
pangeaMessageEvent != null &&
!(toolbarController!.highlighted) &&
!selected) {
toolbarController!.controller.onSelectMessage(
pangeaMessageEvent!.event,
);
return;
}
toolbarController?.toolbar?.textSelection
.onTextSelection(selection);
},
onTap: () => toolbarController?.showToolbar(context),
contextMenuBuilder: (context, state) =>
(toolbarController?.highlighted ?? false)
? const SizedBox.shrink()
: MessageContextMenu.contextMenuOverride(
context: context,
textSelection: state,
onDefine: () => toolbarController?.showToolbar(
context,
mode: MessageMode.definition,
),
onListen: () => toolbarController?.showToolbar(
context,
mode: MessageMode.textToSpeech,
),
),
enableInteractiveSelection:
toolbarController?.highlighted ?? false,
// Pangea#
text: event.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
hideReply: true,
),
builder: (context, snapshot) {
// #Pangea
if (!snapshot.hasData) {
return Text(
// Pangea#
event.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
hideReply: true,
),
// #Pangea
style: messageTextStyle,
);
}
// return Linkify(
final String messageText = snapshot.data ??
event.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
hideReply: true,
);
return SelectableLinkify(
onSelectionChanged: (selection, cause) {
if (cause == SelectionChangedCause.longPress &&
toolbarController != null &&
pangeaMessageEvent != null &&
!(toolbarController!.highlighted) &&
!selected) {
toolbarController!.controller.onSelectMessage(
pangeaMessageEvent!.event,
);
return;
}
toolbarController?.toolbar?.textSelection
.onTextSelection(selection);
},
onTap: () => toolbarController?.showToolbar(context),
text: messageText,
contextMenuBuilder: (context, state) =>
(toolbarController?.highlighted ?? false)
? const SizedBox.shrink()
: MessageContextMenu.contextMenuOverride(
context: context,
textSelection: state,
onDefine: () => toolbarController?.showToolbar(
context,
mode: MessageMode.definition,
),
onListen: () => toolbarController?.showToolbar(
context,
mode: MessageMode.textToSpeech,
),
),
enableInteractiveSelection:
toolbarController?.highlighted ?? false,
// text: snapshot.data ??
// event.calcLocalizedBodyFallback(
// MatrixLocals(L10n.of(context)!),
// hideReply: true,
// ),
// Pangea#
style: TextStyle(
color: textColor,
fontSize: bigEmotes ? fontSize * 3 : fontSize,
decoration:
event.redacted ? TextDecoration.lineThrough : null,
),
options: const LinkifyOptions(humanize: false),
linkStyle: TextStyle(
color: textColor.withAlpha(150),
fontSize: bigEmotes ? fontSize * 3 : fontSize,
decoration: TextDecoration.underline,
decorationColor: textColor.withAlpha(150),
),
onOpen: (url) => UrlLauncher(context, url.url).launchUrl(),
);
},
style: TextStyle(
color: textColor,
fontSize: bigEmotes ? fontSize * 3 : fontSize,
decoration: event.redacted ? TextDecoration.lineThrough : null,
),
options: const LinkifyOptions(humanize: false),
linkStyle: TextStyle(
color: textColor.withAlpha(150),
fontSize: bigEmotes ? fontSize * 3 : fontSize,
decoration: TextDecoration.underline,
decorationColor: textColor.withAlpha(150),
),
onOpen: (url) => UrlLauncher(context, url.url).launchUrl(),
);
}
case EventTypes.CallInvite:

View file

@ -68,7 +68,7 @@ class MessageReactions extends StatelessWidget {
);
}
} else {
event.room.sendReaction(event.eventId, r.key!);
event.room.sendReaction(event.eventId, r.key);
}
},
onLongPress: () async => await _AdaptableReactorsDialog(
@ -92,7 +92,7 @@ class MessageReactions extends StatelessWidget {
}
class _Reaction extends StatelessWidget {
final String? reactionKey;
final String reactionKey;
final int count;
final bool? reacted;
final void Function()? onTap;
@ -111,17 +111,17 @@ class _Reaction extends StatelessWidget {
final textColor = Theme.of(context).brightness == Brightness.dark
? Colors.white
: Colors.black;
final color = Theme.of(context).colorScheme.background;
final fontSize = DefaultTextStyle.of(context).style.fontSize;
final color = Theme.of(context).colorScheme.surface;
Widget content;
if (reactionKey!.startsWith('mxc://')) {
if (reactionKey.startsWith('mxc://')) {
content = Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
MxcImage(
uri: Uri.parse(reactionKey!),
width: 9999,
height: fontSize,
uri: Uri.parse(reactionKey),
width: 20,
height: 20,
animated: false,
),
if (count > 1) ...[
const SizedBox(width: 4),
@ -136,7 +136,7 @@ class _Reaction extends StatelessWidget {
],
);
} else {
var renderKey = Characters(reactionKey!);
var renderKey = Characters(reactionKey);
if (renderKey.length > 10) {
renderKey = renderKey.getRange(0, 9) + Characters('');
}
@ -171,13 +171,13 @@ class _Reaction extends StatelessWidget {
}
class _ReactionEntry {
String? key;
String key;
int count;
bool reacted;
List<User>? reactors;
_ReactionEntry({
this.key,
required this.key,
required this.count,
required this.reacted,
this.reactors,
@ -222,7 +222,7 @@ class _AdaptableReactorsDialog extends StatelessWidget {
),
);
final title = Center(child: Text(reactionEntry!.key!));
final title = Center(child: Text(reactionEntry!.key));
return AlertDialog.adaptive(
title: title,

View file

@ -39,7 +39,7 @@ class ReplyContent extends StatelessWidget {
color: backgroundColor ??
Theme.of(context)
.colorScheme
.background
.surface
.withOpacity(ownMessage ? 0.2 : 0.33),
borderRadius: borderRadius,
child: Row(
@ -82,7 +82,7 @@ class ReplyContent extends StatelessWidget {
style: TextStyle(
color: ownMessage
? Theme.of(context).colorScheme.onPrimary
: Theme.of(context).colorScheme.onBackground,
: Theme.of(context).colorScheme.onSurface,
fontSize: fontSize,
),
),

View file

@ -18,25 +18,18 @@ class StateMessage extends StatelessWidget {
child: Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2),
),
child: FutureBuilder<String>(
future: event.calcLocalizedBody(MatrixLocals(L10n.of(context)!)),
builder: (context, snapshot) {
return Text(
snapshot.data ??
event.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 12 * AppConfig.fontSizeFactor,
decoration:
event.redacted ? TextDecoration.lineThrough : null,
),
);
},
child: Text(
event.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 12 * AppConfig.fontSizeFactor,
decoration: event.redacted ? TextDecoration.lineThrough : null,
),
),
),
),

View file

@ -39,7 +39,7 @@ class VerificationRequestContent extends StatelessWidget {
color: Theme.of(context).dividerColor,
),
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
),
child: Row(
mainAxisSize: MainAxisSize.min,

View file

@ -10,9 +10,11 @@ import 'package:path_provider/path_provider.dart';
import 'package:universal_html/html.dart' as html;
import 'package:video_player/video_player.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pages/chat/events/image_bubble.dart';
import 'package:fluffychat/utils/localized_exception_extension.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/blur_hash.dart';
import '../../../utils/error_reporter.dart';
@ -31,6 +33,10 @@ class EventVideoPlayerState extends State<EventVideoPlayer> {
File? _tmpFile;
void _downloadAction() async {
if (PlatformInfos.isDesktop) {
widget.event.saveFile(context);
return;
}
setState(() => _isDownloading = true);
try {
final videoFile = await widget.event.downloadAndDecryptAttachment();
@ -98,6 +104,7 @@ class EventVideoPlayerState extends State<EventVideoPlayer> {
final chewieManager = _chewieManager;
return Material(
color: Colors.black,
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
child: SizedBox(
height: 300,
child: chewieManager != null
@ -114,8 +121,8 @@ class EventVideoPlayerState extends State<EventVideoPlayer> {
else
BlurHash(blurhash: blurHash, width: 300, height: 300),
Center(
child: OutlinedButton.icon(
style: OutlinedButton.styleFrom(
child: IconButton(
style: IconButton.styleFrom(
backgroundColor: Theme.of(context).colorScheme.surface,
),
icon: _isDownloading
@ -126,14 +133,12 @@ class EventVideoPlayerState extends State<EventVideoPlayer> {
strokeWidth: 2,
),
)
: const Icon(Icons.download_outlined),
label: Text(
_isDownloading
? L10n.of(context)!.loadingPleaseWait
: L10n.of(context)!.videoWithSize(
widget.event.sizeString ?? '?MB',
),
),
: const Icon(Icons.play_circle_outlined),
tooltip: _isDownloading
? L10n.of(context)!.loadingPleaseWait
: L10n.of(context)!.videoWithSize(
widget.event.sizeString ?? '?MB',
),
onPressed: _isDownloading ? null : _downloadAction,
),
),

View file

@ -1,7 +1,6 @@
import 'package:emojis/emoji.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/widgets/igc/pangea_text_controller.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@ -50,12 +49,12 @@ class InputBar extends StatelessWidget {
List<Map<String, String?>> getSuggestions(String text) {
// #Pangea
final List<Map<String, String?>> ret = <Map<String, String?>>[];
// Pangea#
if (controller!.selection.baseOffset !=
controller!.selection.extentOffset ||
controller!.selection.baseOffset < 0) {
return []; // no entries if there is selected text
}
// Pangea#
final searchText =
controller!.text.substring(0, controller!.selection.baseOffset);
// #Pangea
@ -241,7 +240,7 @@ class InputBar extends StatelessWidget {
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Text(
// '/$command',
// commandExample(command),
// style: const TextStyle(fontFamily: 'monospace'),
// ),
// Text(
@ -479,8 +478,11 @@ class InputBar extends StatelessWidget {
mimeType: content.mimeType,
bytes: data,
name: content.uri.split('/').last,
).detectFileType;
room.sendFileEvent(file, shrinkImageMaxDimension: 1600);
);
room.sendFileEvent(
file,
shrinkImageMaxDimension: 1600,
);
},
),
minLines: minLines,
@ -488,6 +490,9 @@ class InputBar extends StatelessWidget {
keyboardType: keyboardType!,
textInputAction: textInputAction,
autofocus: autofocus!,
inputFormatters: [
LengthLimitingTextInputFormatter((maxPDUSize / 3).floor()),
],
onSubmitted: (text) {
// fix for library for now
// it sets the types for the callback incorrectly

View file

@ -63,33 +63,24 @@ class PinnedEvents extends StatelessWidget {
future: controller.room.getEventById(pinnedEventIds.last),
builder: (context, snapshot) {
final event = snapshot.data;
return FutureBuilder<String>(
future: event?.calcLocalizedBody(
MatrixLocals(L10n.of(context)!),
withSenderNamePrefix: true,
hideReply: true,
),
builder: (context, snapshot) => ChatAppBarListTile(
title: snapshot.data ??
event?.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
withSenderNamePrefix: true,
hideReply: true,
) ??
L10n.of(context)!.loadingPleaseWait,
leading: IconButton(
splashRadius: 20,
iconSize: 20,
color: Theme.of(context).colorScheme.onSurfaceVariant,
icon: const Icon(Icons.push_pin),
tooltip: L10n.of(context)!.unpin,
onPressed:
controller.room.canSendEvent(EventTypes.RoomPinnedEvents)
? () => controller.unpinEvent(event!.eventId)
: null,
),
onTap: () => _displayPinnedEventsDialog(context),
return ChatAppBarListTile(
title: event?.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
withSenderNamePrefix: true,
hideReply: true,
) ??
L10n.of(context)!.loadingPleaseWait,
leading: IconButton(
splashRadius: 20,
iconSize: 20,
color: Theme.of(context).colorScheme.onSurfaceVariant,
icon: const Icon(Icons.push_pin),
tooltip: L10n.of(context)!.unpin,
onPressed: controller.room.canSendEvent(EventTypes.RoomPinnedEvents)
? () => controller.unpinEvent(event!.eventId)
: null,
),
onTap: () => _displayPinnedEventsDialog(context),
);
},
);

View file

@ -31,14 +31,14 @@ class RecordingDialogState extends State<RecordingDialog> {
bool error = false;
String? _recordedPath;
// #Pangea
// final _audioRecorder = Record();
final _audioRecorder = AudioRecorder();
// Pangea#
final List<double> amplitudeTimeline = [];
static const int bitRate = 64000;
// #Pangea
// static const int samplingRate = 44100;
static const int samplingRate = 22050;
// Pangea#
Future<void> startRecording() async {
try {
@ -67,8 +67,13 @@ class RecordingDialogState extends State<RecordingDialog> {
const RecordConfig(
bitRate: bitRate,
sampleRate: samplingRate,
encoder: AudioEncoder.wav,
numChannels: 1,
autoGain: true,
echoCancel: true,
noiseSuppress: true,
// #Pangea
encoder: AudioEncoder.wav,
// Pangea#
),
),
// #Pangea

View file

@ -66,27 +66,17 @@ class _EditContent extends StatelessWidget {
color: Theme.of(context).colorScheme.primary,
),
Container(width: 15.0),
FutureBuilder<String>(
future: event.calcLocalizedBody(
Text(
event.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
withSenderNamePrefix: false,
hideReply: true,
),
builder: (context, snapshot) {
return Text(
snapshot.data ??
event.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
withSenderNamePrefix: false,
hideReply: true,
),
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: TextStyle(
color: Theme.of(context).textTheme.bodyMedium!.color,
),
);
},
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: TextStyle(
color: Theme.of(context).textTheme.bodyMedium!.color,
),
),
],
);

View file

@ -1,10 +1,9 @@
import 'package:flutter/material.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/utils/room_status_extension.dart';
import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart';
class SeenByRow extends StatelessWidget {
final ChatController controller;
@ -42,7 +41,6 @@ class SeenByRow extends StatelessWidget {
mxContent: user.avatarUrl,
name: user.calcDisplayname(),
size: 16,
fontSize: 9,
),
),
if (seenByUsers.length > maxAvatars)
@ -50,7 +48,7 @@ class SeenByRow extends StatelessWidget {
width: 16,
height: 16,
child: Material(
color: Theme.of(context).colorScheme.background,
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(32),
child: Center(
child: Text(

View file

@ -14,80 +14,87 @@ class TypingIndicators extends StatelessWidget {
@override
Widget build(BuildContext context) {
final typingUsers = controller.room.typingUsers
..removeWhere((u) => u.stateKey == Matrix.of(context).client.userID);
const topPadding = 20.0;
const bottomPadding = 4.0;
const avatarSize = Avatar.defaultSize / 2;
return Container(
width: double.infinity,
alignment: Alignment.center,
child: AnimatedContainer(
constraints:
const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5),
height: typingUsers.isEmpty ? 0 : Avatar.defaultSize + bottomPadding,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
alignment: controller.timeline!.events.isNotEmpty &&
controller.timeline!.events.first.senderId ==
Matrix.of(context).client.userID
? Alignment.topRight
: Alignment.topLeft,
clipBehavior: Clip.hardEdge,
decoration: const BoxDecoration(),
padding: const EdgeInsets.only(
left: 8.0,
bottom: bottomPadding,
),
child: Row(
children: [
SizedBox(
height: Avatar.defaultSize,
width: typingUsers.length < 2
? Avatar.defaultSize
: Avatar.defaultSize + 16,
child: Stack(
children: [
if (typingUsers.isNotEmpty)
Avatar(
mxContent: typingUsers.first.avatarUrl,
name: typingUsers.first.calcDisplayname(),
),
if (typingUsers.length == 2)
Padding(
padding: const EdgeInsets.only(left: 16),
child: Avatar(
mxContent: typingUsers.length == 2
? typingUsers.last.avatarUrl
: null,
name: typingUsers.length == 2
? typingUsers.last.calcDisplayname()
: '+${typingUsers.length - 1}',
),
),
],
),
),
const SizedBox(width: 8),
Padding(
padding: const EdgeInsets.only(top: topPadding),
child: Material(
color: Theme.of(context).colorScheme.surfaceVariant,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(2),
topRight: Radius.circular(AppConfig.borderRadius),
bottomLeft: Radius.circular(AppConfig.borderRadius),
bottomRight: Radius.circular(AppConfig.borderRadius),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: typingUsers.isEmpty ? null : const _TypingDots(),
),
),
),
],
),
return StreamBuilder<Object>(
stream: controller.room.client.onSync.stream.where(
(syncUpdate) =>
syncUpdate.rooms?.join?[controller.room.id]?.ephemeral
?.any((ephemeral) => ephemeral.type == 'm.typing') ??
false,
),
builder: (context, _) {
final typingUsers = controller.room.typingUsers
..removeWhere((u) => u.stateKey == Matrix.of(context).client.userID);
return Container(
width: double.infinity,
alignment: Alignment.center,
child: AnimatedContainer(
constraints:
const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5),
height: typingUsers.isEmpty ? 0 : avatarSize + 8,
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
alignment: controller.timeline!.events.isNotEmpty &&
controller.timeline!.events.first.senderId ==
Matrix.of(context).client.userID
? Alignment.topRight
: Alignment.topLeft,
clipBehavior: Clip.hardEdge,
decoration: const BoxDecoration(),
padding: const EdgeInsets.symmetric(
horizontal: 8.0,
vertical: 4.0,
),
child: Row(
children: [
Container(
alignment: Alignment.center,
height: avatarSize,
width: Avatar.defaultSize,
child: Stack(
children: [
if (typingUsers.isNotEmpty)
Avatar(
size: avatarSize,
mxContent: typingUsers.first.avatarUrl,
name: typingUsers.first.calcDisplayname(),
),
if (typingUsers.length == 2)
Padding(
padding: const EdgeInsets.only(left: 16),
child: Avatar(
size: avatarSize,
mxContent: typingUsers.length == 2
? typingUsers.last.avatarUrl
: null,
name: typingUsers.length == 2
? typingUsers.last.calcDisplayname()
: '+${typingUsers.length - 1}',
),
),
],
),
),
const SizedBox(width: 8),
Material(
color:
// ignore: deprecated_member_use
Theme.of(context).colorScheme.surfaceVariant,
borderRadius: const BorderRadius.all(
Radius.circular(AppConfig.borderRadius),
),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: typingUsers.isEmpty ? null : const _TypingDots(),
),
),
],
),
),
);
},
);
}
}

View file

@ -0,0 +1,267 @@
import 'package:flutter/material.dart' hide Visibility;
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:future_loading_dialog/future_loading_dialog.dart';
import 'package:matrix/matrix.dart';
import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_page.dart';
import 'package:fluffychat/utils/localized_exception_extension.dart';
import 'package:fluffychat/widgets/matrix.dart';
class ChatAccessSettings extends StatefulWidget {
final String roomId;
const ChatAccessSettings({required this.roomId, super.key});
@override
State<ChatAccessSettings> createState() => ChatAccessSettingsController();
}
class ChatAccessSettingsController extends State<ChatAccessSettings> {
bool joinRulesLoading = false;
bool visibilityLoading = false;
bool historyVisibilityLoading = false;
bool guestAccessLoading = false;
Room get room => Matrix.of(context).client.getRoomById(widget.roomId)!;
void setJoinRule(JoinRules? newJoinRules) async {
if (newJoinRules == null) return;
setState(() {
joinRulesLoading = true;
});
try {
await room.setJoinRules(newJoinRules);
} catch (e, s) {
Logs().w('Unable to change join rules', e, s);
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
e.toLocalizedString(context),
),
),
);
}
} finally {
if (mounted) {
setState(() {
joinRulesLoading = false;
});
}
}
}
void setHistoryVisibility(HistoryVisibility? historyVisibility) async {
if (historyVisibility == null) return;
setState(() {
historyVisibilityLoading = true;
});
try {
await room.setHistoryVisibility(historyVisibility);
} catch (e, s) {
Logs().w('Unable to change history visibility', e, s);
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
e.toLocalizedString(context),
),
),
);
}
} finally {
if (mounted) {
setState(() {
historyVisibilityLoading = false;
});
}
}
}
void setGuestAccess(GuestAccess? guestAccess) async {
if (guestAccess == null) return;
setState(() {
guestAccessLoading = true;
});
try {
await room.setGuestAccess(guestAccess);
} catch (e, s) {
Logs().w('Unable to change guest access', e, s);
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
e.toLocalizedString(context),
),
),
);
}
} finally {
if (mounted) {
setState(() {
guestAccessLoading = false;
});
}
}
}
void updateRoomAction() async {
final roomVersion = room
.getState(EventTypes.RoomCreate)!
.content
.tryGet<String>('room_version');
final capabilitiesResult = await showFutureLoadingDialog(
context: context,
future: () => room.client.getCapabilities(),
);
final capabilities = capabilitiesResult.result;
if (capabilities == null) return;
final newVersion = await showConfirmationDialog<String>(
context: context,
title: L10n.of(context)!.replaceRoomWithNewerVersion,
actions: capabilities.mRoomVersions!.available.entries
.where((r) => r.key != roomVersion)
.map(
(version) => AlertDialogAction(
key: version.key,
label:
'${version.key} (${version.value.toString().split('.').last})',
),
)
.toList(),
);
if (newVersion == null ||
OkCancelResult.cancel ==
await showOkCancelAlertDialog(
useRootNavigator: false,
context: context,
okLabel: L10n.of(context)!.yes,
cancelLabel: L10n.of(context)!.cancel,
title: L10n.of(context)!.areYouSure,
message: L10n.of(context)!.roomUpgradeDescription,
isDestructiveAction: true,
)) {
return;
}
await showFutureLoadingDialog(
context: context,
future: () => room.client.upgradeRoom(room.id, newVersion),
);
}
Future<void> addAlias() async {
final domain = room.client.userID?.domain;
if (domain == null) {
throw Exception('userID or domain is null! This should never happen.');
}
final input = await showTextInputDialog(
context: context,
title: L10n.of(context)!.editRoomAliases,
textFields: [
DialogTextField(
prefixText: '#',
suffixText: domain,
hintText: L10n.of(context)!.alias,
),
],
);
final aliasLocalpart = input?.singleOrNull?.trim();
if (aliasLocalpart == null || aliasLocalpart.isEmpty) return;
final alias = '#$aliasLocalpart:$domain';
final result = await showFutureLoadingDialog(
context: context,
future: () => room.client.setRoomAlias(alias, room.id),
);
if (result.error != null) return;
setState(() {});
if (!room.canChangeStateEvent(EventTypes.RoomCanonicalAlias)) return;
final canonicalAliasConsent = await showOkCancelAlertDialog(
context: context,
title: L10n.of(context)!.setAsCanonicalAlias,
message: alias,
okLabel: L10n.of(context)!.yes,
cancelLabel: L10n.of(context)!.no,
);
final altAliases = room
.getState(EventTypes.RoomCanonicalAlias)
?.content
.tryGetList<String>('alt_aliases')
?.toSet() ??
{};
if (room.canonicalAlias.isNotEmpty) altAliases.add(room.canonicalAlias);
altAliases.add(alias);
if (canonicalAliasConsent == OkCancelResult.ok) {
altAliases.remove(alias);
} else {
altAliases.remove(room.canonicalAlias);
}
await showFutureLoadingDialog(
context: context,
future: () => room.client.setRoomStateWithKey(
room.id,
EventTypes.RoomCanonicalAlias,
'',
{
'alias': canonicalAliasConsent == OkCancelResult.ok
? alias
: room.canonicalAlias,
if (altAliases.isNotEmpty) 'alt_aliases': altAliases.toList(),
},
),
);
}
void deleteAlias(String alias) async {
await showFutureLoadingDialog(
context: context,
future: () => room.client.deleteRoomAlias(alias),
);
setState(() {});
}
void setChatVisibilityOnDirectory(bool? visibility) async {
if (visibility == null) return;
setState(() {
visibilityLoading = true;
});
try {
await room.client.setRoomVisibilityOnDirectory(
room.id,
visibility: visibility == true ? Visibility.public : Visibility.private,
);
setState(() {});
} catch (e, s) {
Logs().w('Unable to change visibility', e, s);
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
e.toLocalizedString(context),
),
),
);
}
} finally {
if (mounted) {
setState(() {
visibilityLoading = false;
});
}
}
}
@override
Widget build(BuildContext context) {
return ChatAccessSettingsPageView(this);
}
}

View file

@ -0,0 +1,275 @@
import 'package:flutter/material.dart' hide Visibility;
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix/matrix.dart';
import 'package:fluffychat/pages/chat_access_settings/chat_access_settings_controller.dart';
import 'package:fluffychat/utils/fluffy_share.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/widgets/layouts/max_width_body.dart';
class ChatAccessSettingsPageView extends StatelessWidget {
final ChatAccessSettingsController controller;
const ChatAccessSettingsPageView(this.controller, {super.key});
@override
Widget build(BuildContext context) {
final room = controller.room;
return Scaffold(
appBar: AppBar(
leading: const Center(child: BackButton()),
title: Text(L10n.of(context)!.accessAndVisibility),
),
body: MaxWidthBody(
child: StreamBuilder<Object>(
stream: room.client.onRoomState.stream
.where((update) => update.roomId == controller.room.id),
builder: (context, snapshot) {
final canonicalAlias = room.canonicalAlias;
final altAliases = room
.getState(EventTypes.RoomCanonicalAlias)
?.content
.tryGetList<String>('alt_aliases') ??
[];
return Column(
mainAxisSize: MainAxisSize.min,
children: [
ListTile(
title: Text(
L10n.of(context)!.visibilityOfTheChatHistory,
style: TextStyle(
color: Theme.of(context).colorScheme.secondary,
fontWeight: FontWeight.bold,
),
),
),
for (final historyVisibility in HistoryVisibility.values)
RadioListTile<HistoryVisibility>.adaptive(
title: Text(
historyVisibility
.getLocalizedString(MatrixLocals(L10n.of(context)!)),
),
value: historyVisibility,
groupValue: room.historyVisibility,
onChanged: controller.historyVisibilityLoading ||
!room.canChangeHistoryVisibility
? null
: controller.setHistoryVisibility,
),
Divider(color: Theme.of(context).dividerColor),
ListTile(
title: Text(
L10n.of(context)!.whoIsAllowedToJoinThisGroup,
style: TextStyle(
color: Theme.of(context).colorScheme.secondary,
fontWeight: FontWeight.bold,
),
),
),
for (final joinRule in JoinRules.values)
if (joinRule != JoinRules.private)
RadioListTile<JoinRules>.adaptive(
title: Text(
joinRule.localizedString(L10n.of(context)!),
),
value: joinRule,
groupValue: room.joinRules,
onChanged: controller.joinRulesLoading ||
!room.canChangeJoinRules
? null
: controller.setJoinRule,
),
Divider(color: Theme.of(context).dividerColor),
if ({JoinRules.public, JoinRules.knock}
.contains(room.joinRules)) ...[
ListTile(
title: Text(
L10n.of(context)!.areGuestsAllowedToJoin,
style: TextStyle(
color: Theme.of(context).colorScheme.secondary,
fontWeight: FontWeight.bold,
),
),
),
for (final guestAccess in GuestAccess.values)
RadioListTile<GuestAccess>.adaptive(
title: Text(
guestAccess.getLocalizedString(
MatrixLocals(L10n.of(context)!),
),
),
value: guestAccess,
groupValue: room.guestAccess,
onChanged: controller.guestAccessLoading ||
!room.canChangeGuestAccess
? null
: controller.setGuestAccess,
),
Divider(color: Theme.of(context).dividerColor),
ListTile(
title: Text(
L10n.of(context)!.publicChatAddresses,
style: TextStyle(
color: Theme.of(context).colorScheme.secondary,
fontWeight: FontWeight.bold,
),
),
trailing: IconButton(
icon: const Icon(Icons.add_outlined),
tooltip: L10n.of(context)!.createNewAddress,
onPressed: controller.addAlias,
),
),
if (canonicalAlias.isNotEmpty)
_AliasListTile(
alias: canonicalAlias,
onDelete: room.canChangeStateEvent(
EventTypes.RoomCanonicalAlias,
)
? () => controller.deleteAlias(canonicalAlias)
: null,
isCanonicalAlias: true,
),
for (final alias in altAliases)
_AliasListTile(
alias: alias,
onDelete: room.canChangeStateEvent(
EventTypes.RoomCanonicalAlias,
)
? () => controller.deleteAlias(alias)
: null,
),
FutureBuilder(
future: room.client.getLocalAliases(room.id),
builder: (context, snapshot) {
final localAddresses = snapshot.data;
if (localAddresses == null) {
return const SizedBox.shrink();
}
localAddresses.remove(room.canonicalAlias);
localAddresses
.removeWhere((alias) => altAliases.contains(alias));
return Column(
mainAxisSize: MainAxisSize.min,
children: localAddresses
.map(
(alias) => _AliasListTile(
alias: alias,
published: false,
onDelete: () => controller.deleteAlias(alias),
),
)
.toList(),
);
},
),
Divider(color: Theme.of(context).dividerColor),
FutureBuilder(
future: room.client.getRoomVisibilityOnDirectory(room.id),
builder: (context, snapshot) => SwitchListTile.adaptive(
value: snapshot.data == Visibility.public,
title: Text(
L10n.of(context)!.chatCanBeDiscoveredViaSearchOnServer(
room.client.userID!.domain!,
),
),
onChanged: controller.setChatVisibilityOnDirectory,
),
),
],
ListTile(
title: Text(L10n.of(context)!.globalChatId),
subtitle: SelectableText(room.id),
trailing: IconButton(
icon: const Icon(Icons.copy_outlined),
onPressed: () => FluffyShare.share(room.id, context),
),
),
ListTile(
title: Text(L10n.of(context)!.roomVersion),
subtitle: SelectableText(
room
.getState(EventTypes.RoomCreate)!
.content
.tryGet<String>('room_version') ??
'Unknown',
),
trailing: room.canSendEvent(EventTypes.RoomTombstone)
? IconButton(
icon: const Icon(Icons.upgrade_outlined),
onPressed: controller.updateRoomAction,
)
: null,
),
],
);
},
),
),
);
}
}
class _AliasListTile extends StatelessWidget {
const _AliasListTile({
required this.alias,
required this.onDelete,
this.isCanonicalAlias = false,
this.published = true,
});
final String alias;
final void Function()? onDelete;
final bool isCanonicalAlias;
final bool published;
@override
Widget build(BuildContext context) {
return ListTile(
leading: isCanonicalAlias
? const Icon(Icons.star)
: const Icon(Icons.link_outlined),
title: InkWell(
onTap: () => FluffyShare.share(
'https://matrix.to/#/$alias',
context,
),
child: Text(
'https://matrix.to/#/$alias',
style: TextStyle(
decoration: TextDecoration.underline,
decorationColor: Theme.of(context).colorScheme.primary,
color: Theme.of(context).colorScheme.primary,
fontSize: 14,
),
),
),
trailing: onDelete != null
? IconButton(
color: Theme.of(context).colorScheme.error,
icon: const Icon(Icons.delete_outlined),
onPressed: onDelete,
)
: null,
);
}
}
extension JoinRulesDisplayString on JoinRules {
String localizedString(L10n l10n) {
switch (this) {
case JoinRules.public:
return l10n.anyoneCanJoin;
case JoinRules.invite:
return l10n.invitedUsersOnly;
case JoinRules.knock:
return l10n.usersMustKnock;
case JoinRules.private:
return l10n.noOneCanJoin;
case JoinRules.restricted:
return l10n.restricted;
case JoinRules.knockRestricted:
return l10n.knockRestricted;
}
}
}

View file

@ -7,17 +7,14 @@ import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/class_des
import 'package:fluffychat/pangea/utils/set_class_name.dart';
import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart';
import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_settings.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/app_lock.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:future_loading_dialog/future_loading_dialog.dart';
import 'package:go_router/go_router.dart';
import 'package:image_picker/image_picker.dart';
import 'package:matrix/matrix.dart' as matrix;
import 'package:matrix/matrix.dart';
enum AliasActions { copy, delete, setCanonical }
@ -83,122 +80,6 @@ class ChatDetailsController extends State<ChatDetails> {
// }
// Pangea#
void editAliases() async {
final room = Matrix.of(context).client.getRoomById(roomId!);
final aliasesResult = await showFutureLoadingDialog(
context: context,
future: () => room!.client.getLocalAliases(room.id),
);
final aliases = aliasesResult.result;
if (aliases == null) return;
final adminMode = room!.canSendEvent(EventTypes.RoomCanonicalAlias);
if (aliases.isEmpty && (room.canonicalAlias.isNotEmpty)) {
aliases.add(room.canonicalAlias);
}
if (aliases.isEmpty && adminMode) {
return setAliasAction();
}
final select = await showConfirmationDialog(
// #Pangea
useRootNavigator: false,
// Pangea#
context: context,
title: L10n.of(context)!.editRoomAliases,
actions: [
if (adminMode)
AlertDialogAction(label: L10n.of(context)!.create, key: 'new'),
...aliases.map((alias) => AlertDialogAction(key: alias, label: alias)),
],
);
if (select == null) return;
if (select == 'new') {
return setAliasAction();
}
final option = await showConfirmationDialog<AliasActions>(
context: context,
title: select,
actions: [
AlertDialogAction(
label: L10n.of(context)!.copyToClipboard,
key: AliasActions.copy,
isDefaultAction: true,
),
if (adminMode) ...{
AlertDialogAction(
label: L10n.of(context)!.setAsCanonicalAlias,
key: AliasActions.setCanonical,
isDestructiveAction: true,
),
AlertDialogAction(
label: L10n.of(context)!.delete,
key: AliasActions.delete,
isDestructiveAction: true,
),
},
],
);
if (option == null) return;
switch (option) {
case AliasActions.copy:
await Clipboard.setData(ClipboardData(text: select));
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(L10n.of(context)!.copiedToClipboard)),
);
break;
case AliasActions.delete:
await showFutureLoadingDialog(
context: context,
future: () => room.client.deleteRoomAlias(select),
);
break;
case AliasActions.setCanonical:
await showFutureLoadingDialog(
context: context,
future: () => room.client.setRoomStateWithKey(
room.id,
EventTypes.RoomCanonicalAlias,
'',
{
'alias': select,
},
),
);
break;
}
}
void setAliasAction() async {
final room = Matrix.of(context).client.getRoomById(roomId!)!;
final domain = room.client.userID!.domain;
final input = await showTextInputDialog(
// #Pangea
useRootNavigator: false,
// Pangea#
context: context,
title: L10n.of(context)!.setInvitationLink,
okLabel: L10n.of(context)!.ok,
cancelLabel: L10n.of(context)!.cancel,
textFields: [
DialogTextField(
prefixText: '#',
suffixText: domain,
hintText: L10n.of(context)!.alias,
initialText: room.canonicalAlias.localpart,
),
],
);
if (input == null) return;
await showFutureLoadingDialog(
context: context,
future: () =>
room.client.setRoomAlias('#${input.single}:${domain!}', room.id),
);
}
void setTopicAction() async {
final room = Matrix.of(context).client.getRoomById(roomId!)!;
// #Pangea
@ -232,91 +113,6 @@ class ChatDetailsController extends State<ChatDetails> {
// Pangea#
}
void setGuestAccess() async {
final room = Matrix.of(context).client.getRoomById(roomId!)!;
final currentGuestAccess = room.guestAccess;
final newGuestAccess = await showConfirmationDialog<GuestAccess>(
context: context,
title: L10n.of(context)!.areGuestsAllowedToJoin,
actions: GuestAccess.values
.map(
(guestAccess) => AlertDialogAction(
key: guestAccess,
label: guestAccess
.getLocalizedString(MatrixLocals(L10n.of(context)!)),
isDefaultAction: guestAccess == currentGuestAccess,
),
)
.toList(),
);
if (newGuestAccess == null || newGuestAccess == currentGuestAccess) return;
await showFutureLoadingDialog(
context: context,
future: () => room.setGuestAccess(newGuestAccess),
);
}
void setHistoryVisibility() async {
final room = Matrix.of(context).client.getRoomById(roomId!)!;
final currentHistoryVisibility = room.historyVisibility;
final newHistoryVisibility =
await showConfirmationDialog<HistoryVisibility>(
context: context,
title: L10n.of(context)!.visibilityOfTheChatHistory,
actions: HistoryVisibility.values
.map(
(visibility) => AlertDialogAction(
key: visibility,
label: visibility
.getLocalizedString(MatrixLocals(L10n.of(context)!)),
isDefaultAction: visibility == currentHistoryVisibility,
),
)
.toList(),
);
if (newHistoryVisibility == null ||
newHistoryVisibility == currentHistoryVisibility) return;
await showFutureLoadingDialog(
context: context,
future: () => room.setHistoryVisibility(newHistoryVisibility),
);
}
void setJoinRules() async {
final room = Matrix.of(context).client.getRoomById(roomId!)!;
final currentJoinRule = room.joinRules;
final newJoinRule = await showConfirmationDialog<JoinRules>(
context: context,
title: L10n.of(context)!.whoIsAllowedToJoinThisGroup,
actions: JoinRules.values
.map(
(joinRule) => AlertDialogAction(
key: joinRule,
label:
joinRule.getLocalizedString(MatrixLocals(L10n.of(context)!)),
isDefaultAction: joinRule == currentJoinRule,
),
)
.toList(),
);
if (newJoinRule == null || newJoinRule == currentJoinRule) return;
await showFutureLoadingDialog(
context: context,
future: () async {
await room.setJoinRules(newJoinRule);
room.client.setRoomVisibilityOnDirectory(
roomId!,
visibility: {
JoinRules.public,
JoinRules.knock,
}.contains(newJoinRule)
? matrix.Visibility.public
: matrix.Visibility.private,
);
},
);
}
void goToEmoteSettings() async {
final room = Matrix.of(context).client.getRoomById(roomId!)!;
// okay, we need to test if there are any emote state events other than the default one

View file

@ -50,7 +50,8 @@ class ChatDetailsView extends StatelessWidget {
}
return StreamBuilder(
stream: room.onUpdate.stream,
stream: room.client.onRoomState.stream
.where((update) => update.roomId == room.id),
builder: (context, snapshot) {
var members = room.getParticipants().toList()
..sort((b, a) => a.powerLevel.compareTo(b.powerLevel));
@ -80,17 +81,16 @@ class ChatDetailsView extends StatelessWidget {
elevation: Theme.of(context).appBarTheme.elevation,
actions: <Widget>[
// #Pangea
//if (room.canonicalAlias.isNotEmpty)
// IconButton(
// tooltip: L10n.of(context)!.share,
// icon: Icon(Icons.adaptive.share_outlined),
// onPressed: () => FluffyShare.share(
// L10n.of(context)!.youInvitedToBy(
// AppConfig.inviteLinkPrefix + room.canonicalAlias,
// ),
// context,
// ),
// ),
// if (room.canonicalAlias.isNotEmpty)
// IconButton(
// tooltip: L10n.of(context)!.share,
// icon: Icon(Icons.adaptive.share_outlined),
// onPressed: () => FluffyShare.share(
// AppConfig.inviteLinkPrefix + room.canonicalAlias,
// context,
// ),
// ),
// Pangea#
if (controller.widget.embeddedCloseButton == null)
ChatSettingsPopupMenu(room, false),
],
@ -144,7 +144,6 @@ class ChatDetailsView extends StatelessWidget {
mxContent: room.avatar,
name: displayname,
size: Avatar.defaultSize * 2.5,
fontSize: 18 * 2.5,
),
),
),
@ -196,7 +195,7 @@ class ChatDetailsView extends StatelessWidget {
style: TextButton.styleFrom(
foregroundColor: Theme.of(context)
.colorScheme
.onBackground,
.onSurface,
),
label: Text(
room.isDirectChat
@ -285,7 +284,7 @@ class ChatDetailsView extends StatelessWidget {
roomId: controller.roomId,
startOpen: false,
),
if (room.pangeaRoomRules != null && room.isRoomAdmin)
if (room.pangeaRoomRules != null)
RoomRulesEditor(
roomId: controller.roomId,
startOpen: false,
@ -303,10 +302,18 @@ class ChatDetailsView extends StatelessWidget {
// else
// Padding(
// padding: const EdgeInsets.all(16.0),
// child: OutlinedButton.icon(
// child: TextButton.icon(
// onPressed: controller.setTopicAction,
// label: Text(L10n.of(context)!.setChatDescription),
// icon: const Icon(Icons.edit_outlined),
// style: TextButton.styleFrom(
// backgroundColor: Theme.of(context)
// .colorScheme
// .secondaryContainer,
// foregroundColor: Theme.of(context)
// .colorScheme
// .onSecondaryContainer,
// ),
// ),
// ),
// Padding(
@ -341,23 +348,6 @@ class ChatDetailsView extends StatelessWidget {
// height: 1,
// color: Theme.of(context).dividerColor,
// ),
// if (room.joinRules == JoinRules.public)
// ListTile(
// leading: CircleAvatar(
// backgroundColor:
// Theme.of(context).scaffoldBackgroundColor,
// foregroundColor: iconColor,
// child: const Icon(Icons.link_outlined),
// ),
// trailing: const Icon(Icons.chevron_right_outlined),
// onTap: controller.editAliases,
// title: Text(L10n.of(context)!.editRoomAliases),
// subtitle: Text(
// (room.canonicalAlias.isNotEmpty)
// ? room.canonicalAlias
// : L10n.of(context)!.none,
// ),
// ),
// ListTile(
// leading: CircleAvatar(
// backgroundColor:
@ -367,7 +357,8 @@ class ChatDetailsView extends StatelessWidget {
// Icons.insert_emoticon_outlined,
// ),
// ),
// title: Text(L10n.of(context)!.emoteSettings),
// title:
// Text(L10n.of(context)!.customEmojisAndStickers),
// subtitle: Text(L10n.of(context)!.setCustomEmotes),
// onTap: controller.goToEmoteSettings,
// trailing: const Icon(Icons.chevron_right_outlined),
@ -381,71 +372,16 @@ class ChatDetailsView extends StatelessWidget {
// child: const Icon(Icons.shield_outlined),
// ),
// title: Text(
// L10n.of(context)!.whoIsAllowedToJoinThisGroup,
// L10n.of(context)!.accessAndVisibility,
// ),
// trailing: room.canChangeJoinRules
// ? const Icon(Icons.chevron_right_outlined)
// : null,
// subtitle: Text(
// room.joinRules?.getLocalizedString(
// MatrixLocals(L10n.of(context)!),
// ) ??
// L10n.of(context)!.none,
// L10n.of(context)!.accessAndVisibilityDescription,
// ),
// onTap: room.canChangeJoinRules
// ? controller.setJoinRules
// : null,
// onTap: () => context
// .push('/rooms/${room.id}/details/access'),
// trailing: const Icon(Icons.chevron_right_outlined),
// ),
// if (!room.isDirectChat)
// ListTile(
// leading: CircleAvatar(
// backgroundColor:
// Theme.of(context).scaffoldBackgroundColor,
// foregroundColor: iconColor,
// child: const Icon(Icons.visibility_outlined),
// ),
// trailing: room.canChangeHistoryVisibility
// ? const Icon(Icons.chevron_right_outlined)
// : null,
// title: Text(
// L10n.of(context)!.visibilityOfTheChatHistory,
// ),
// subtitle: Text(
// room.historyVisibility?.getLocalizedString(
// MatrixLocals(L10n.of(context)!),
// ) ??
// L10n.of(context)!.none,
// ),
// onTap: room.canChangeHistoryVisibility
// ? controller.setHistoryVisibility
// : null,
// ),
// if (room.jsoinRules == JoinRules.public)
// ListTile(
// leading: CircleAvatar(
// backgroundColor:
// Theme.of(context).scaffoldBackgroundColor,
// foregroundColor: iconColor,
// child: const Icon(
// Icons.person_add_alt_1_outlined,
// ),
// ),
// trailing: room.canChangeGuestAccess
// ? const Icon(Icons.chevron_right_outlined)
// : null,
// title: Text(
// L10n.of(context)!.areGuestsAllowedToJoin,
// ),
// subtitle: Text(
// room.guestAccess.getLocalizedString(
// MatrixLocals(L10n.of(context)!),
// ),
// ),
// onTap: room.canChangeGuestAccess
// ? controller.setGuestAccess
// : null,
// ),
// if (!room.isDirectChat)
if (!room.isDirectChat &&
!room.isSpace &&
room.isRoomAdmin)
@ -710,9 +646,12 @@ class ChatDetailsView extends StatelessWidget {
// ListTile(
// title: Text(L10n.of(context)!.inviteContact),
// leading: CircleAvatar(
// backgroundColor:
// Theme.of(context).colorScheme.primary,
// foregroundColor: Colors.white,
// backgroundColor: Theme.of(context)
// .colorScheme
// .primaryContainer,
// foregroundColor: Theme.of(context)
// .colorScheme
// .onPrimaryContainer,
// radius: Avatar.defaultSize / 2,
// child: const Icon(Icons.add_outlined),
// ),

View file

@ -13,12 +13,14 @@ class ParticipantListItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final membershipBatch = <Membership, String>{
Membership.join: '',
Membership.ban: L10n.of(context)!.banned,
Membership.invite: L10n.of(context)!.invited,
Membership.leave: L10n.of(context)!.leftTheChat,
final membershipBatch = switch (user.membership) {
Membership.ban => L10n.of(context)!.banned,
Membership.invite => L10n.of(context)!.invited,
Membership.join => null,
Membership.knock => L10n.of(context)!.knocking,
Membership.leave => L10n.of(context)!.leftTheChat,
};
final permissionBatch = user.powerLevel == 100
? L10n.of(context)!.admin
: user.powerLevel >= 50
@ -70,7 +72,7 @@ class ParticipantListItem extends StatelessWidget {
// Pangea#
),
),
membershipBatch[user.membership]!.isEmpty
membershipBatch == null
? const SizedBox.shrink()
: Container(
padding: const EdgeInsets.all(4),
@ -79,8 +81,7 @@ class ParticipantListItem extends StatelessWidget {
color: Theme.of(context).secondaryHeaderColor,
borderRadius: BorderRadius.circular(8),
),
child:
Center(child: Text(membershipBatch[user.membership]!)),
child: Center(child: Text(membershipBatch)),
),
],
),

View file

@ -83,7 +83,8 @@ class ChatEncryptionSettingsView extends StatelessWidget {
),
),
StreamBuilder(
stream: room.onUpdate.stream,
stream: room.client.onRoomState.stream
.where((update) => update.roomId == controller.room.id),
builder: (context, snapshot) =>
FutureBuilder<List<DeviceKeys>>(
future: room.getUserDeviceKeys(),

View file

@ -166,6 +166,11 @@ class ChatListController extends State<ChatList>
// Pangea#
selectedRoomIds.clear();
activeFilter = getActiveFilterByDestination(i);
// #Pangea
if (activeFilter != ActiveFilter.spaces) {
activeSpaceId = null;
}
// Pangea#
});
// #Pangea
final bool clickedAllSpaces = (!AppConfig.separateChatTypes && i == 1) ||
@ -523,6 +528,9 @@ class ChatListController extends State<ChatList>
// if (event["activeSpaceId"] != null && mounted) {
if (mounted) {
setActiveSpace(event["activeSpaceId"]);
if (event["activeSpaceId"] != null) {
context.go("/rooms/${event["activeSpaceId"]}/details");
}
}
});

View file

@ -7,7 +7,6 @@ import 'package:fluffychat/pages/chat_list/utils/on_chat_tap.dart';
import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart';
import 'package:fluffychat/pangea/widgets/chat_list/chat_list_body_text.dart';
import 'package:fluffychat/utils/adaptive_bottom_sheet.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/utils/stream_extension.dart';
import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/public_room_bottom_sheet.dart';
@ -40,7 +39,7 @@ class ChatListViewBody extends StatelessWidget {
Theme.of(context).textTheme.bodyLarge!.color!.withAlpha(100);
final subtitleColor =
Theme.of(context).textTheme.bodyLarge!.color!.withAlpha(50);
final filter = controller.searchController.text.toLowerCase();
return PageTransitionSwitcher(
transitionBuilder: (
Widget child,
@ -245,35 +244,23 @@ class ChatListViewBody extends StatelessWidget {
),
),
if (client.prevBatch != null)
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int i) {
if (!rooms[i]
.getLocalizedDisplayname(
MatrixLocals(L10n.of(context)!),
)
.toLowerCase()
.contains(
controller.searchController.text.toLowerCase(),
)) {
return const SizedBox.shrink();
}
final activeChat = controller.activeChat == rooms[i].id;
return ChatListItem(
rooms[i],
key: Key('chat_list_item_${rooms[i].id}'),
selected:
controller.selectedRoomIds.contains(rooms[i].id),
onTap: controller.selectMode == SelectMode.select
? () => controller.toggleSelection(rooms[i].id)
: () => onChatTap(rooms[i], context),
onLongPress: () =>
controller.toggleSelection(rooms[i].id),
activeChat: activeChat,
);
},
childCount: rooms.length,
),
SliverList.builder(
itemCount: rooms.length,
itemBuilder: (BuildContext context, int i) {
return ChatListItem(
rooms[i],
key: Key('chat_list_item_${rooms[i].id}'),
filter: filter,
selected:
controller.selectedRoomIds.contains(rooms[i].id),
onTap: controller.selectMode == SelectMode.select
? () => controller.toggleSelection(rooms[i].id)
: () => onChatTap(rooms[i], context),
onLongPress: () =>
controller.toggleSelection(rooms[i].id),
activeChat: controller.activeChat == rooms[i].id,
);
},
),
],
),

View file

@ -5,6 +5,7 @@ import 'package:fluffychat/pangea/utils/get_chat_list_item_subtitle.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/utils/room_status_extension.dart';
import 'package:fluffychat/widgets/hover_builder.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:future_loading_dialog/future_loading_dialog.dart';
@ -13,7 +14,6 @@ import 'package:matrix/matrix.dart';
import '../../config/themes.dart';
import '../../utils/date_time_extension.dart';
import '../../widgets/avatar.dart';
import '../../widgets/matrix.dart';
enum ArchivedRoomAction { delete, rejoin }
@ -24,6 +24,7 @@ class ChatListItem extends StatelessWidget {
final void Function()? onLongPress;
final void Function()? onForget;
final void Function() onTap;
final String? filter;
const ChatListItem(
this.room, {
@ -32,6 +33,7 @@ class ChatListItem extends StatelessWidget {
required this.onTap,
this.onLongPress,
this.onForget,
this.filter,
super.key,
});
@ -69,8 +71,11 @@ class ChatListItem extends StatelessWidget {
final isMuted = room.pushRuleState != PushRuleState.notify;
final typingText = room.getLocalizedTypingText(context);
final lastEvent = room.lastEvent;
final ownMessage = lastEvent?.senderId == Matrix.of(context).client.userID;
final ownMessage = lastEvent?.senderId == room.client.userID;
final unread = room.isUnread || room.membership == Membership.invite;
final theme = Theme.of(context);
final directChatMatrixId = room.directChatMatrixID;
final isDirectChat = directChatMatrixId != null;
final unreadBubbleSize = unread || room.hasNewMessages
? room.notificationCount > 0
? 20.0
@ -78,13 +83,22 @@ class ChatListItem extends StatelessWidget {
: 0.0;
final hasNotifications = room.notificationCount > 0;
final backgroundColor = selected
? Theme.of(context).colorScheme.primaryContainer
? theme.colorScheme.primaryContainer
: activeChat
? Theme.of(context).colorScheme.secondaryContainer
? theme.colorScheme.secondaryContainer
: null;
final displayname = room.getLocalizedDisplayname(
MatrixLocals(L10n.of(context)!),
);
final filter = this.filter;
if (filter != null && !displayname.toLowerCase().contains(filter)) {
return const SizedBox.shrink();
}
final needLastEventSender = lastEvent == null
? false
: room.getState(EventTypes.RoomMember, lastEvent.senderId) == null;
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 8,
@ -101,14 +115,46 @@ class ChatListItem extends StatelessWidget {
visualDensity: const VisualDensity(vertical: -0.5),
contentPadding: const EdgeInsets.symmetric(horizontal: 8),
onLongPress: onLongPress,
leading: Avatar(
mxContent: room.avatar,
name: displayname,
//#Pangea
littleIcon: room.roomTypeIcon,
// Pangea#
presenceUserId: room.directChatMatrixID,
presenceBackgroundColor: backgroundColor,
leading: Stack(
clipBehavior: Clip.none,
children: [
HoverBuilder(
builder: (context, hovered) => AnimatedScale(
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
scale: hovered ? 1.1 : 1.0,
child: Avatar(
mxContent: room.avatar,
name: displayname,
//#Pangea
littleIcon: room.roomTypeIcon,
// Pangea#
presenceUserId: directChatMatrixId,
presenceBackgroundColor: backgroundColor,
onTap: onLongPress,
),
),
),
Positioned(
bottom: -2,
right: -2,
child: AnimatedScale(
duration: FluffyThemes.animationDuration,
curve: FluffyThemes.animationCurve,
scale: (hovered || selected) ? 1.0 : 0.0,
child: Material(
color: backgroundColor,
borderRadius: BorderRadius.circular(16),
child: Icon(
selected
? Icons.check_circle
: Icons.check_circle_outlined,
size: 18,
),
),
),
),
],
),
title: Row(
children: <Widget>[
@ -139,7 +185,7 @@ class ChatListItem extends StatelessWidget {
child: Icon(
Icons.push_pin,
size: 16,
color: Theme.of(context).colorScheme.primary,
color: theme.colorScheme.primary,
),
),
if (lastEvent != null && room.membership != Membership.invite)
@ -150,8 +196,8 @@ class ChatListItem extends StatelessWidget {
style: TextStyle(
fontSize: 13,
color: unread
? Theme.of(context).colorScheme.secondary
: Theme.of(context).textTheme.bodyMedium!.color,
? theme.colorScheme.secondary
: theme.textTheme.bodyMedium!.color,
),
),
),
@ -179,7 +225,7 @@ class ChatListItem extends StatelessWidget {
padding: const EdgeInsets.only(right: 4),
child: Icon(
Icons.edit_outlined,
color: Theme.of(context).colorScheme.secondary,
color: theme.colorScheme.secondary,
size: 14,
),
),
@ -188,24 +234,13 @@ class ChatListItem extends StatelessWidget {
? Text(
typingText,
style: TextStyle(
color: Theme.of(context).colorScheme.primary,
color: theme.colorScheme.primary,
),
maxLines: 1,
softWrap: false,
)
// #Pangea
: FutureBuilder<String>(
// #Pangea
// future: room.lastEvent?.calcLocalizedBody(
// MatrixLocals(L10n.of(context)!),
// hideReply: true,
// hideEdit: true,
// plaintextBody: true,
// removeMarkdown: true,
// withSenderNamePrefix: !room.isDirectChat ||
// room.directChatMatrixID !=
// room.lastEvent?.senderId,
// ) ??
// Future.value(L10n.of(context)!.emptyChat),
future: room.lastEvent != null
? GetChatListItemSubtitle().getSubtitle(
L10n.of(context)!,
@ -213,14 +248,16 @@ class ChatListItem extends StatelessWidget {
MatrixState.pangeaController,
)
: Future.value(L10n.of(context)!.emptyChat),
// Pangea#
builder: (context, snapshot) {
// Pangea#
return Text(
room.membership == Membership.invite
? room.isDirectChat
? isDirectChat
? L10n.of(context)!.invitePrivateChat
: L10n.of(context)!.inviteGroupChat
// #Pangea
: snapshot.data ??
// Pangea#
room.lastEvent
?.calcLocalizedBodyFallback(
MatrixLocals(L10n.of(context)!),
@ -228,10 +265,9 @@ class ChatListItem extends StatelessWidget {
hideEdit: true,
plaintextBody: true,
removeMarkdown: true,
withSenderNamePrefix:
!room.isDirectChat ||
room.directChatMatrixID !=
room.lastEvent?.senderId,
withSenderNamePrefix: !isDirectChat ||
directChatMatrixId !=
room.lastEvent?.senderId,
) ??
L10n.of(context)!.emptyChat,
softWrap: false,
@ -241,9 +277,7 @@ class ChatListItem extends StatelessWidget {
fontWeight: unread || room.hasNewMessages
? FontWeight.bold
: null,
color: Theme.of(context)
.colorScheme
.onSurfaceVariant,
color: theme.colorScheme.onSurfaceVariant,
decoration: room.lastEvent?.redacted == true
? TextDecoration.lineThrough
: null,
@ -278,8 +312,8 @@ class ChatListItem extends StatelessWidget {
room.membership == Membership.invite
? Colors.red
: hasNotifications || room.markedUnread
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.primaryContainer,
? theme.colorScheme.primary
: theme.colorScheme.primaryContainer,
borderRadius:
BorderRadius.circular(AppConfig.borderRadius),
),
@ -291,12 +325,8 @@ class ChatListItem extends StatelessWidget {
color: room.highlightCount > 0
? Colors.white
: hasNotifications
? Theme.of(context)
.colorScheme
.onPrimary
: Theme.of(context)
.colorScheme
.onPrimaryContainer,
? theme.colorScheme.onPrimary
: theme.colorScheme.onPrimaryContainer,
fontSize: 13,
),
)
@ -307,19 +337,7 @@ class ChatListItem extends StatelessWidget {
),
onTap: onTap,
trailing: onForget == null
? hovered || selected
? IconButton(
color: selected
? Theme.of(context).colorScheme.primary
: null,
icon: Icon(
selected
? Icons.check_circle
: Icons.check_circle_outlined,
),
onPressed: onLongPress,
)
: null
? null
: IconButton(
icon: const Icon(Icons.delete_outlined),
onPressed: onForget,

View file

@ -30,13 +30,13 @@ class ChatListView extends StatelessWidget {
badgePosition: badgePosition,
filter:
controller.getRoomFilterByActiveFilter(ActiveFilter.messages),
child: const Icon(Icons.forum_outlined),
child: const Icon(Icons.chat_outlined),
),
selectedIcon: UnreadRoomsBadge(
badgePosition: badgePosition,
filter:
controller.getRoomFilterByActiveFilter(ActiveFilter.messages),
child: const Icon(Icons.forum),
child: const Icon(Icons.chat),
),
//#Pangea
// label: L10n.of(context)!.messages,
@ -62,13 +62,13 @@ class ChatListView extends StatelessWidget {
badgePosition: badgePosition,
filter:
controller.getRoomFilterByActiveFilter(ActiveFilter.allChats),
child: const Icon(Icons.forum_outlined),
child: const Icon(Icons.chat_outlined),
),
selectedIcon: UnreadRoomsBadge(
badgePosition: badgePosition,
filter:
controller.getRoomFilterByActiveFilter(ActiveFilter.allChats),
child: const Icon(Icons.forum),
child: const Icon(Icons.chat),
),
// #Pangea
// label: L10n.of(context)!.chats,
@ -195,7 +195,6 @@ class ChatListView extends StatelessWidget {
MatrixLocals(L10n.of(context)!),
),
size: 32,
fontSize: 12,
// #Pangea
littleIcon: room?.roomTypeIcon,
// Pangea#
@ -222,10 +221,11 @@ class ChatListView extends StatelessWidget {
? NavigationBar(
elevation: 4,
labelBehavior:
NavigationDestinationLabelBehavior.alwaysHide,
height: 64,
NavigationDestinationLabelBehavior.alwaysShow,
shadowColor:
Theme.of(context).colorScheme.onSurface,
backgroundColor:
Theme.of(context).colorScheme.surface,
surfaceTintColor:
Theme.of(context).colorScheme.surface,
selectedIndex: controller.selectedIndex,

View file

@ -217,7 +217,6 @@ class ClientChooserButton extends StatelessWidget {
// name:
// snapshot.data?.displayName ?? client.userID!.localpart,
// size: 32,
// fontSize: 12,
// ),
// const SizedBox(width: 12),
// Expanded(
@ -323,20 +322,19 @@ class ClientChooserButton extends StatelessWidget {
leading: const Icon(Icons.settings_outlined),
title: Text(L10n.of(context)!.mainMenu),
),
// child: Material(
// color: Colors.transparent,
// borderRadius: BorderRadius.circular(99),
// child: Avatar(
// mxContent: snapshot.data?.avatarUrl,
// name: snapshot.data?.displayName ??
// matrix.client.userID!.localpart,
// size: 32,
// ),
// ),
// Pangea#
),
),
// child: Material(
// color: Colors.transparent,
// borderRadius: BorderRadius.circular(99),
// child: Avatar(
// mxContent: snapshot.data?.avatarUrl,
// name: snapshot.data?.displayName ??
// matrix.client.userID!.localpart,
// size: 32,
// fontSize: 12,
// ),
// ),
// Pangea#
),
],
),

View file

@ -67,7 +67,7 @@ class _NaviRailItemState extends State<NaviRailItem> {
borderRadius: borderRadius,
color: widget.isSelected
? Theme.of(context).colorScheme.primaryContainer
: Theme.of(context).colorScheme.background,
: Theme.of(context).colorScheme.surface,
child: Tooltip(
message: widget.toolTip,
child: InkWell(

View file

@ -239,7 +239,9 @@ class _SpaceViewState extends State<SpaceView> {
room?.getLocalizedDisplayname(
MatrixLocals(L10n.of(context)!),
),
message: spaceChild?.topic ?? room?.topic,
// #Pangea
// message: spaceChild?.topic ?? room?.topic,
// Pangea#
actions: [
// #Pangea
// if (room == null)
@ -255,7 +257,7 @@ class _SpaceViewState extends State<SpaceView> {
room != null &&
room.ownPowerLevel >= ClassDefaultValues.powerLevelOfAdmin &&
// Pangea#
(activeSpace?.canChangeStateEvent(EventTypes.spaceChild) ?? false))
(activeSpace?.canChangeStateEvent(EventTypes.SpaceChild) ?? false))
SheetAction(
key: SpaceChildContextAction.removeFromSpace,
label: L10n.of(context)!.removeFromSpace,
@ -338,6 +340,16 @@ class _SpaceViewState extends State<SpaceView> {
widget.controller.cancelAction();
// #Pangea
if (room == null || room.membership == Membership.leave) return;
if (room.isSpace) {
await room.archiveSpace(
context,
Matrix.of(context).client,
onlyAdmin: false,
);
} else {
widget.controller.toggleSelection(room.id);
await widget.controller.archiveAction();
}
// Pangea#
_refresh();
break;
@ -824,7 +836,6 @@ class _SpaceViewState extends State<SpaceView> {
size: 24,
mxContent: spaceChild.avatarUrl,
name: spaceChild.name,
fontSize: 9,
),
),
color: Theme.of(context)
@ -847,7 +858,7 @@ class _SpaceViewState extends State<SpaceView> {
),
// #Pangea
// if (activeSpace?.canChangeStateEvent(
// EventTypes.spaceChild,
// EventTypes.SpaceChild,
// ) ==
// true)
// Material(

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