Compare commits
139 commits
krille/cle
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
03c0b8736c | ||
|
|
9fde066a5b | ||
|
|
344e84ae3e | ||
|
|
7128ba98b2 | ||
|
|
2f35f07252 | ||
|
|
9e29533502 | ||
|
|
e0738cca97 | ||
|
|
14ef8a1d0e | ||
|
|
0134e9c367 | ||
|
|
682090c6d7 | ||
|
|
6223ea85b5 | ||
|
|
0493e24b08 | ||
|
|
8aee82dd6f | ||
|
|
eab984541e | ||
|
|
dda8e6cbc7 | ||
|
|
f9bb2715b0 | ||
|
|
f6c4e69302 | ||
|
|
b8a2d19d2f | ||
|
|
df9325a5e4 | ||
|
|
b333d78c8c | ||
|
|
358c7f25d4 | ||
|
|
1bd1298443 | ||
|
|
f6a739b78e | ||
|
|
4a8773c67b | ||
|
|
ac24b86a3a | ||
|
|
17b5304995 | ||
|
|
74c3277eb6 | ||
|
|
c9e16cc469 | ||
|
|
4b676cc23b | ||
|
|
f961b22435 | ||
|
|
de96b27e29 | ||
|
|
06827038d8 | ||
|
|
3b204373e9 | ||
|
|
aa605ae0c1 | ||
|
|
f64cc1e996 | ||
|
|
25814f4a52 | ||
|
|
77fbf33f90 | ||
|
|
46b1a4846d | ||
|
|
33d28c2f94 | ||
|
|
1157cf96b3 | ||
|
|
0294b8d29b | ||
|
|
4f09b43f0e | ||
|
|
e68424e1e8 | ||
|
|
54a7b4ea69 | ||
|
|
1f42aa3605 | ||
|
|
9c28e5ed6e | ||
|
|
54ba19d39e | ||
|
|
eea4e431b4 | ||
|
|
e95069478d | ||
|
|
9ede56427f | ||
|
|
6c05ed8aaa | ||
|
|
76fdabecaa | ||
|
|
4ed353fbbd | ||
|
|
9724b852bb | ||
|
|
a8a0212d3d | ||
|
|
5c88133691 | ||
|
|
9b531179a4 | ||
|
|
a8aadc834f | ||
|
|
38cda39672 | ||
|
|
1770f3e17c | ||
|
|
096a995b89 | ||
|
|
5cc8ab636c | ||
|
|
922156498f | ||
|
|
ba06e09b9e | ||
|
|
b99b23c652 | ||
|
|
0eecc9597b | ||
|
|
5fd377a611 | ||
|
|
26e72d789f | ||
|
|
04edda0b1a | ||
|
|
657143b3b6 | ||
|
|
d1c96b1c45 | ||
|
|
2d9710d2b4 | ||
|
|
46bf54e540 | ||
|
|
5e368b9df0 | ||
|
|
150ab800ee | ||
|
|
14ce0a5927 | ||
|
|
57044f01d8 | ||
|
|
a7c89418eb | ||
|
|
210ebdae6e | ||
|
|
cd99f6a460 | ||
|
|
a490a40379 | ||
|
|
c90fdc3e75 | ||
|
|
e8ee58d6d9 | ||
|
|
8571c42ba4 | ||
|
|
a2857ef36a | ||
|
|
1e763f05f5 | ||
|
|
47ac9c8f97 | ||
|
|
85c21e61c3 | ||
|
|
fc7eb6954c | ||
|
|
084801fd84 | ||
|
|
d2cb802436 | ||
|
|
9438594fa2 | ||
|
|
1cfda2e338 | ||
|
|
4825135de2 | ||
|
|
8f8309aa63 | ||
|
|
a3a2a37a14 | ||
|
|
bad0a549cb | ||
|
|
71bbe4ad74 | ||
|
|
aba8c3faf2 | ||
|
|
9c49141f9e | ||
|
|
d2777cacee | ||
|
|
c9e32cdad8 | ||
|
|
e0c20f249b | ||
|
|
ece4628751 | ||
|
|
edf7d81b60 | ||
|
|
9d229e04c6 | ||
|
|
89864cfd0c | ||
|
|
9f9111dac2 | ||
|
|
43ba692a21 | ||
|
|
39845d95ab | ||
|
|
d0901da51e | ||
|
|
424d4eef40 | ||
|
|
dba3553a59 | ||
|
|
cb8b3be205 | ||
|
|
661339f7ab | ||
|
|
0fe91bfe14 | ||
|
|
993e12a946 | ||
|
|
18d98d96c6 | ||
|
|
d1abd71527 | ||
|
|
febd0e6b41 | ||
|
|
d69b42e1c5 | ||
|
|
bfcd78fcdf | ||
|
|
58d5de4aba | ||
|
|
e311c9573e | ||
|
|
8fdf58e071 | ||
|
|
a22c8fa6fa | ||
|
|
9d8c332fc3 | ||
|
|
9f5250ee04 | ||
|
|
386d01296f | ||
|
|
127c3fd7bf | ||
|
|
c206a51515 | ||
|
|
3165cd6fb6 | ||
|
|
de76969993 | ||
|
|
4bbba18cc0 | ||
|
|
03f8f98e03 | ||
|
|
3c77e2f457 | ||
|
|
4dfa9873ee | ||
|
|
08e396c02c | ||
|
|
7f7e7eb928 |
120 changed files with 109959 additions and 106855 deletions
3
.github/ISSUE_TEMPLATE/test_report.md
vendored
3
.github/ISSUE_TEMPLATE/test_report.md
vendored
|
|
@ -39,3 +39,6 @@ labels: test
|
|||
10. Drag&Drop to send a file into a chat still works:
|
||||
- [ ] Web
|
||||
- [ ] Linux
|
||||
11. Deeplinks are still working? https://matrix.to/#/@krille:janian.de
|
||||
- [ ] Android
|
||||
- [ ] iOS
|
||||
29
.github/workflows/integrate.yaml
vendored
29
.github/workflows/integrate.yaml
vendored
|
|
@ -12,16 +12,15 @@ jobs:
|
|||
- uses: webiny/action-conventional-commits@v1.3.1
|
||||
- run: ./scripts/generate-locale-config.sh
|
||||
- run: git diff --exit-code
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- name: Check for unused translations
|
||||
run: flutter pub run translations_cleaner list-unused-terms -a
|
||||
- run: flutter pub get
|
||||
- name: Check if pubspec.lock is up to date
|
||||
run: git diff --exit-code pubspec.lock
|
||||
- name: Check for unused localizations
|
||||
run: dart run remove_unused_localizations --keep-unused && test -z "$(git status --porcelain -- unused_localization_keys.txt)"
|
||||
- name: Check formatting
|
||||
run: dart format lib/ test/ --set-exit-if-changed
|
||||
- name: Check import formatting
|
||||
|
|
@ -29,6 +28,10 @@ jobs:
|
|||
- name: Check license compliance
|
||||
run: dart run license_checker check-licenses -c licenses.yaml --problematic
|
||||
- run: flutter analyze
|
||||
- name: Search unused dependencies
|
||||
run: |
|
||||
dart pub global activate dependency_validator
|
||||
dart pub global run dependency_validator
|
||||
- run: dart run dart_code_linter:metrics analyze lib --reporter=github
|
||||
- run: dart run dart_code_linter:metrics check-unused-code lib
|
||||
- run: dart run dart_code_linter:metrics check-unused-files lib
|
||||
|
|
@ -51,14 +54,9 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: ./.github/actions/free_up_space
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
distribution: "zulu"
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
with:
|
||||
|
|
@ -84,10 +82,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||
|
|
@ -109,9 +106,9 @@ jobs:
|
|||
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- name: Install dependencies
|
||||
run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
|
||||
- run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV
|
||||
- name: Install Flutter
|
||||
run: |
|
||||
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
|
||||
|
|
@ -125,10 +122,9 @@ jobs:
|
|||
runs-on: macos-15
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- name: Use Xcode 16.4
|
||||
run: sudo xcode-select --switch /Applications/Xcode_16.4.app
|
||||
|
|
@ -202,7 +198,7 @@ jobs:
|
|||
echo "Generated AVD snapshot for caching."
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- uses: remarkablemark/setup-maestro-cli@v1
|
||||
- name: Load integration test env
|
||||
|
|
@ -241,7 +237,6 @@ jobs:
|
|||
script: |
|
||||
flutter run --use-application-binary=$PWD/app-debug.apk > flutter_logs.txt 2>&1 &
|
||||
FLUTTER_PID=$!
|
||||
sleep 10
|
||||
maestro test integration_test/login.yaml --env HOMESERVER=10.0.2.2 --env USER1_NAME=${USER1_NAME} --env USER1_PW=${USER1_PW}
|
||||
kill $FLUTTER_PID 2>/dev/null || true
|
||||
cp flutter_logs.txt ~/.maestro/tests/
|
||||
|
|
|
|||
10
.github/workflows/main_deploy.yaml
vendored
10
.github/workflows/main_deploy.yaml
vendored
|
|
@ -15,10 +15,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||
- name: Prepare web
|
||||
|
|
@ -40,14 +39,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
distribution: 'zulu'
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
|
|
|
|||
1
.github/workflows/matrix_notify.yaml
vendored
1
.github/workflows/matrix_notify.yaml
vendored
|
|
@ -8,6 +8,7 @@ on:
|
|||
|
||||
jobs:
|
||||
notify:
|
||||
if: ${{ (github.event_name == 'issues' && github.event.issue.user.login != 'krille-chan') || (github.event_name == 'pull_request_target' && github.event.pull_request.user.login != 'krille-chan') }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Send notification to Matrix room
|
||||
|
|
|
|||
47
.github/workflows/release.yaml
vendored
47
.github/workflows/release.yaml
vendored
|
|
@ -18,10 +18,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||
|
|
@ -47,13 +46,25 @@ jobs:
|
|||
asset_path: fluffychat-web.tar.gz
|
||||
asset_name: fluffychat-web.tar.gz
|
||||
asset_content_type: application/gzip
|
||||
- name: Build Website
|
||||
- name: Clone fluffychat website
|
||||
run: |
|
||||
mkdir public
|
||||
git clone https://github.com/krille-chan/fluffychat-website.git
|
||||
cp CHANGELOG.md fluffychat-website/
|
||||
cp PRIVACY.md fluffychat-website/
|
||||
- name: Build website
|
||||
working-directory: fluffychat-website
|
||||
run: |
|
||||
npm install tailwindcss @tailwindcss/cli
|
||||
npx tailwindcss -i ./src/styles.css -o ./src/assets/tailwind.css --minify
|
||||
npx @11ty/eleventy
|
||||
mv public ../
|
||||
- name: Copy FluffyChat web into it
|
||||
run: |
|
||||
mkdir public/web
|
||||
mkdir public/nightly
|
||||
cp -r build/web/* public/
|
||||
cp -r build/web/* public/web/
|
||||
cp -r build/web/* public/nightly/
|
||||
echo "app.fluffy.chat" >> public/CNAME
|
||||
echo "fluffychat.im" >> public/CNAME
|
||||
- name: Deploy to GitHub Pages
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
|
|
@ -61,20 +72,15 @@ jobs:
|
|||
personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }}
|
||||
publish_dir: ./public
|
||||
publish_branch: gh-pages
|
||||
cname: app.fluffy.chat
|
||||
cname: fluffychat.im
|
||||
|
||||
build_apk:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
distribution: 'zulu'
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- name: Add Firebase Messaging
|
||||
run: |
|
||||
|
|
@ -107,9 +113,9 @@ jobs:
|
|||
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- name: Install dependencies
|
||||
run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
|
||||
- run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV
|
||||
- name: Install Flutter
|
||||
run: |
|
||||
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
|
||||
|
|
@ -133,14 +139,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: actions/setup-java@v5
|
||||
with:
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
distribution: 'zulu'
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
|
|
@ -191,18 +192,18 @@ jobs:
|
|||
- name: Check out Git repository
|
||||
uses: actions/checkout@v6
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v3
|
||||
uses: docker/login-action@v4
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
uses: docker/metadata-action@v6
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v6
|
||||
uses: docker/build-push-action@v7
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
|
|
|
|||
2
.github/workflows/versions.env
vendored
2
.github/workflows/versions.env
vendored
|
|
@ -1,2 +0,0 @@
|
|||
FLUTTER_VERSION=3.41.2
|
||||
JAVA_VERSION=17
|
||||
2
.tool_versions.yaml
Normal file
2
.tool_versions.yaml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
environment:
|
||||
flutter: 3.41.4
|
||||
159
CHANGELOG.md
159
CHANGELOG.md
|
|
@ -1,3 +1,162 @@
|
|||
## v2.5.0
|
||||
FluffyChat 2.5.0 introduces a new homeserver picker for onboarding, better image compression performance and several smaller new features, design adjustments and bug fixes.
|
||||
|
||||
- feat: Add mute notification action (Christian Kußowski)
|
||||
- feat: Add presetHomeserver config to enforce a homeserver for web (Christian Kußowski)
|
||||
- feat: Display particle animation on login page (Christian Kußowski)
|
||||
- feat: Display read receipts for every event (Christian Kußowski)
|
||||
- feat: Enable audio recording on web (Christian Kußowski)
|
||||
- feat: Implement low priority for rooms (Christian Kußowski)
|
||||
- feat: Implement matrix native oidc (Christian Kußowski)
|
||||
- feat: Implement new sign in flow (Christian Kußowski)
|
||||
- feat: OIDC Login on same page (Christian Kußowski)
|
||||
- feat: Reenable native imaging for all platforms (Christian Kußowski)
|
||||
- feat: Remember last successful logged in homeserver (Christian Kußowski)
|
||||
- Add lld to install custom dependency for Linux in README (Stephen)
|
||||
- build: Add llvm-18 to packages for snap (krille-chan)
|
||||
- build: Add maestro based integration tests (Christian Kußowski)
|
||||
- chore(translations): Added translation using Weblate (Albanian) (Besnik Bleta)
|
||||
- chore(translations): Added translation using Weblate (Kabyle) (Amadɣas)
|
||||
- chore(translations): Translated using Weblate (Basque) (xabirequejo)
|
||||
- chore(translations): Translated using Weblate (Catalan) (fadelkon)
|
||||
- chore(translations): Translated using Weblate (Chinese (Simplified Han script)) (大王叫我来巡山)
|
||||
- chore(translations): Translated using Weblate (Croatian) (Milo Ivir)
|
||||
- chore(translations): Translated using Weblate (Czech) (Matyáš Caras)
|
||||
- chore(translations): Translated using Weblate (Danish) (Øjvind Fritjof Arnfred)
|
||||
- chore(translations): Translated using Weblate (Dutch) (Jelv)
|
||||
- chore(translations): Translated using Weblate (English) (Christian)
|
||||
- chore(translations): Translated using Weblate (English) (SpikyBee)
|
||||
- chore(translations): Translated using Weblate (Estonian) (Priit Jõerüüt)
|
||||
- chore(translations): Translated using Weblate (Galician) (josé m.)
|
||||
- chore(translations): Translated using Weblate (Georgian) (Dimitri Tabatadze)
|
||||
- chore(translations): Translated using Weblate (Georgian) (Temuri Doghonadze)
|
||||
- chore(translations): Translated using Weblate (German) (Christian)
|
||||
- chore(translations): Translated using Weblate (German) (Ettore Atalan)
|
||||
- chore(translations): Translated using Weblate (German) (nautilusx)
|
||||
- chore(translations): Translated using Weblate (Hindi) (Vishal Singh)
|
||||
- chore(translations): Translated using Weblate (Indonesian) (Arif Budiman)
|
||||
- chore(translations): Translated using Weblate (Irish) (Aindriú Mac Giolla Eoin)
|
||||
- chore(translations): Translated using Weblate (Japanese) (NPL)
|
||||
- chore(translations): Translated using Weblate (Japanese) (Sayaka Halton)
|
||||
- chore(translations): Translated using Weblate (Kabyle) (Amadɣas)
|
||||
- chore(translations): Translated using Weblate (Kabyle) (ButterflyOfFire)
|
||||
- chore(translations): Translated using Weblate (Kabyle) (Christian)
|
||||
- chore(translations): Translated using Weblate (Latvian) (Edgars Andersons)
|
||||
- chore(translations): Translated using Weblate (Norwegian Bokmål) (Frank Paul Silye)
|
||||
- chore(translations): Translated using Weblate (Norwegian Bokmål) (sunniva)
|
||||
- chore(translations): Translated using Weblate (Persian) (saok91)
|
||||
- chore(translations): Translated using Weblate (Polish) (gredzikk)
|
||||
- chore(translations): Translated using Weblate (Portuguese (Brazil)) (Logaritmica)
|
||||
- chore(translations): Translated using Weblate (Russian) (-)
|
||||
- chore(translations): Translated using Weblate (Russian) (Artem Pereverzev)
|
||||
- chore(translations): Translated using Weblate (Russian) (mikinol)
|
||||
- chore(translations): Translated using Weblate (Spanish) (Kimby)
|
||||
- chore(translations): Translated using Weblate (Spanish) (SpikyBee)
|
||||
- chore(translations): Translated using Weblate (Swedish) (Malva Jakobsson)
|
||||
- chore(translations): Translated using Weblate (Swedish) (spinningpaprika)
|
||||
- chore(translations): Translated using Weblate (Tamil) (தமிழ்நேரம்)
|
||||
- chore(translations): Translated using Weblate (Ukrainian) (Andriy Kushnir)
|
||||
- chore(translations): Translated using Weblate (Ukrainian) (Ihor Hordiichuk)
|
||||
- chore(translations): Translated using Weblate (Uzbek) (BeMeritus)
|
||||
- chore: Add config search textfield (Christian Kußowski)
|
||||
- chore: Add matrix notify workflow (Christian Kußowski)
|
||||
- chore: Add recommended homeservers (Christian Kußowski)
|
||||
- chore: Add reset button for config viewer (Christian Kußowski)
|
||||
- chore: Add support button everywhere (Christian Kußowski)
|
||||
- chore: Added deeplinks to test protocol (Christian Kußowski)
|
||||
- chore: Adjust avatar size and chat list item design (krille-chan)
|
||||
- chore: Adjust chat input row design (Christian Kußowski)
|
||||
- chore: Adjust design (Christian Kußowski)
|
||||
- chore: Adjust design of navrail (Christian Kußowski)
|
||||
- chore: Adjust design of space avatars and more (Christian Kußowski)
|
||||
- chore: Adjust design of user viewer and popup buttons (Christian Kußowski)
|
||||
- chore: Adjust join space child UX (Christian Kußowski)
|
||||
- chore: Adjust paddings (krille-chan)
|
||||
- chore: Adjust power level UX (Christian Kußowski)
|
||||
- chore: Adjust search field design (Christian Kußowski)
|
||||
- chore: Adjust status header design (Christian Kußowski)
|
||||
- chore: Adjust styles and animations (Christian Kußowski)
|
||||
- chore: Adjust support button design (Christian Kußowski)
|
||||
- chore: Always show filter for messages (Christian Kußowski)
|
||||
- chore: Avoid unnecessary lambdas (Christian Kußowski)
|
||||
- chore: Better context menu for space children (Christian Kußowski)
|
||||
- chore: bump ios version (ShootingStarDragons)
|
||||
- chore: Check conventional commits in CI (krille-chan)
|
||||
- chore: Check if pubspec.lock is up to date in CI (Christian Kußowski)
|
||||
- chore: Check of unused localizations (Christian Kußowski)
|
||||
- chore: Clean up pages build (Christian Kußowski)
|
||||
- chore: Display spaces filter chip when spaces present even without children (Christian Kußowski)
|
||||
- chore: Execute dart code linter in CI (Christian Kußowski)
|
||||
- chore: Exempt assignees from stale (Christian Kußowski)
|
||||
- chore: Fix oidc login on web (Christian Kußowski)
|
||||
- chore: Give issues and PRs more time for stale (Christian Kußowski)
|
||||
- chore: Hide homepage button if not preset (Christian Kußowski)
|
||||
- chore: Hide status list by default (Christian Kußowski)
|
||||
- chore: Implement pick SSO provider from dialog and add tchncs.de (Christian Kußowski)
|
||||
- chore: Introduce tool versions file (Christian Kußowski)
|
||||
- chore: Login with localhost (Christian Kußowski)
|
||||
- chore: Make banner light red (Christian Kußowski)
|
||||
- chore: Make key fingerprints in chat encryption page selectable (Christian Kußowski)
|
||||
- chore: make sendTimelineEventTimeout configurable (Christian Kußowski)
|
||||
- chore: Make unread bubble full round (Christian Kußowski)
|
||||
- chore: Move file cache to subdirectory (Christian Kußowski)
|
||||
- chore: Move show image viewer one step up (Christian Kußowski)
|
||||
- chore: Move website back to fluffychat.im (Christian Kußowski)
|
||||
- chore: Only show confirm dialog once (Christian Kußowski)
|
||||
- chore: Put oidc behind a feature flag until fixed (Christian Kußowski)
|
||||
- chore: Remove converser from recommended homeservers as it doesn't have open registration (Christian Kußowski)
|
||||
- chore: Remove frei.chat from homeserver list (Christian Kußowski)
|
||||
- chore: Remove web notification custom sound (Christian Kußowski)
|
||||
- chore: Replace duplicate check for stale bot (Christian Kußowski)
|
||||
- chore: Retry sign in tap in tests (Christian Kußowski)
|
||||
- chore: Run matrix notification in pull request target (Christian Kußowski)
|
||||
- chore: Sanitize hash param for oidc (Christian Kußowski)
|
||||
- chore: Set erase flag true on account deactivation (krille-chan)
|
||||
- chore: Set operations per run to 1000 (krille-chan)
|
||||
- chore: Skip matrix notify for events from myself (Christian Kußowski)
|
||||
- chore: Update locale config (Christian Kußowski)
|
||||
- chore: Update matrix ID localization (Christian Kußowski)
|
||||
- chore: Update recommended homeservers (Christian Kußowski)
|
||||
- chore: Update redirect android scheme (Christian Kußowski)
|
||||
- chore: Use fixed version of fcm shared isolate (Christian Kußowski)
|
||||
- fix: Add app id to TileLayer user agent (Vespe-r)
|
||||
- fix: Add missing @@locale (Krille-chan)
|
||||
- fix: Audioplayer on web buggy (Christian Kußowski)
|
||||
- fix: build failed on archlinux (ShootingStarDragons)
|
||||
- fix: Do not cancel notification on reply (Christian Kußowski)
|
||||
- fix: Do not display formatted body if body is just filename (Christian Kußowski)
|
||||
- fix: Do not route to backup on soft logout (Christian Kußowski)
|
||||
- fix: Edit space child button opens space details page and not space child details page (Christian Kußowski)
|
||||
- fix: Fix formatting of messages with newlines (Philip Fritzsche)
|
||||
- fix: get correct aspect ratio from VideoPlayerController (Matias)
|
||||
- fix: Join room by alias even if not found (Christian Kußowski)
|
||||
- fix: Open deep links (Christian Kußowski)
|
||||
- fix: Receipt row not auto updating (Christian Kußowski)
|
||||
- fix: Receipts disappear after reaction (Christian Kußowski)
|
||||
- fix: Reply voice message displays a broken html body (Christian Kußowski)
|
||||
- fix: Send reply to voice messages (Christian Kußowski)
|
||||
- fix: Set mimetype for video player on web (Christian Kußowski)
|
||||
- fix: Use correct own person for android notification replies (Christian Kußowski)
|
||||
- fix: Wrong placeholder in kab (Christian Kußowski)
|
||||
- refactor: Add Flutter lints (Christian Kußowski)
|
||||
- refactor: Add more linter rules (Christian Kußowski)
|
||||
- refactor: Add more stricter lints (Christian Kußowski)
|
||||
- refactor: Avoid redundant async (Christian Kußowski)
|
||||
- refactor: Avoid unnecessary bool comparison (Christian Kußowski)
|
||||
- refactor: Better UX for create space children (Christian Kußowski)
|
||||
- refactor: Disable custom image resizer for macOS and windows (Christian Kußowski)
|
||||
- refactor: Do show message bubble even for big emotes (Christian Kußowski)
|
||||
- refactor: Enable avoid-returning-widgets lint (Christian Kußowski)
|
||||
- refactor: Enable more strict lints (Christian Kußowski)
|
||||
- refactor: Enable rule avoid dynamic (Christian Kußowski)
|
||||
- refactor: Make file events more fail safe for failed to send (Christian Kußowski)
|
||||
- refactor: Remove animation dependency (Christian Kußowski)
|
||||
- refactor: Remove unused localizations (Christian Kußowski)
|
||||
- refactor: Remove unused translations (Christian Kußowski)
|
||||
- refactor: Use getCryptoIdentityState to check backup state (krille-chan)
|
||||
- refactor: Use more robust and performant way to detect single emoji messages (Christian Kußowski)
|
||||
- refactor: Use native uri data from bytes instead of html (Christian Kußowski)
|
||||
|
||||
## v2.4.0
|
||||
FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to
|
||||
easily add your own sticker packs.
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@
|
|||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="im.fluffychat" android:host="login"/>
|
||||
<data android:scheme="im.fluffychat" android:path="/login"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to
|
||||
easily add your own sticker packs.
|
||||
It also improves the search and image gallery in chats, especially encrypted chats.
|
||||
Besides that this update comes with a lot of fixes and improvements under the hood.
|
||||
FluffyChat 2.5.0 introduces a new homeserver picker for onboarding,
|
||||
better image compression performance and several smaller new features,
|
||||
design adjustments and bug fixes.
|
||||
3
dart_dependency_validator.yaml
Normal file
3
dart_dependency_validator.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
ignore:
|
||||
- handy_window
|
||||
- sqlcipher_flutter_libs
|
||||
|
|
@ -1,7 +1,12 @@
|
|||
appId: chat.fluffy.fluffychat
|
||||
---
|
||||
- assertVisible: "Sign in"
|
||||
- tapOn: "Sign in"
|
||||
- extendedWaitUntil: # Wait for app to be visible
|
||||
visible: "Sign in"
|
||||
timeout: 60000
|
||||
- retry:
|
||||
maxRetries: 10 # Emulator might need some time to be ready to
|
||||
commands:
|
||||
- tapOn: "Sign in"
|
||||
- tapOn: "Search or enter homeserver address"
|
||||
- inputText: "http://${HOMESERVER}"
|
||||
- pressKey: "back"
|
||||
|
|
|
|||
|
|
@ -17,28 +17,26 @@ abstract class AppConfig {
|
|||
static const String schemePrefix = 'matrix:';
|
||||
static const String pushNotificationsChannelId = 'fluffychat_push';
|
||||
static const String pushNotificationsAppId = 'chat.fluffy.fluffychat';
|
||||
static const double borderRadius = 18.0;
|
||||
static const double borderRadius = 16.0;
|
||||
static const double spaceBorderRadius = 11.0;
|
||||
static const double columnWidth = 360.0;
|
||||
|
||||
static const String website = 'https://fluffy.chat';
|
||||
static const String enablePushTutorial =
|
||||
'https://fluffy.chat/faq/#push_without_google_services';
|
||||
'https://fluffychat.im/faq/#push_without_google_services';
|
||||
static const String encryptionTutorial =
|
||||
'https://fluffy.chat/faq/#how_to_use_end_to_end_encryption';
|
||||
'https://fluffychat.im/faq/#how_to_use_end_to_end_encryption';
|
||||
static const String startChatTutorial =
|
||||
'https://fluffy.chat/faq/#how_do_i_find_other_users';
|
||||
'https://fluffychat.im/faq/#how_do_i_find_other_users';
|
||||
static const String howDoIGetStickersTutorial =
|
||||
'https://fluffy.chat/faq/#how_do_i_get_stickers';
|
||||
'https://fluffychat.im/faq/#how_do_i_get_stickers';
|
||||
static const String appId = 'im.fluffychat.FluffyChat';
|
||||
static const String appOpenUrlScheme = 'chat.fluffy';
|
||||
static const String appOpenUrlScheme = 'im.fluffychat';
|
||||
|
||||
static const String sourceCodeUrl =
|
||||
'https://github.com/krille-chan/fluffychat';
|
||||
static const String supportUrl =
|
||||
'https://github.com/krille-chan/fluffychat/issues';
|
||||
static const String changelogUrl = 'https://fluffy.chat/en/changelog/';
|
||||
static const String donationUrl = 'https://ko-fi.com/krille';
|
||||
|
||||
static const Set<String> defaultReactions = {'👍', '❤️', '😂', '😮', '😢'};
|
||||
|
||||
|
|
@ -54,12 +52,6 @@ abstract class AppConfig {
|
|||
path: 'krille-chan/fluffychat/refs/heads/main/recommended_homeservers.json',
|
||||
);
|
||||
|
||||
static final Uri privacyUrl = Uri(
|
||||
scheme: 'https',
|
||||
host: 'fluffy.chat',
|
||||
path: '/en/privacy',
|
||||
);
|
||||
|
||||
static const String mainIsolatePortName = 'main_isolate';
|
||||
static const String pushIsolatePortName = 'push_isolate';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -170,8 +170,14 @@ abstract class AppRoutes {
|
|||
),
|
||||
GoRoute(
|
||||
path: 'newprivatechat',
|
||||
pageBuilder: (context, state) =>
|
||||
defaultPageBuilder(context, state, const NewPrivateChat()),
|
||||
pageBuilder: (context, state) => defaultPageBuilder(
|
||||
context,
|
||||
state,
|
||||
NewPrivateChat(
|
||||
key: ValueKey('new_chat_${state.uri.query}'),
|
||||
deeplink: state.uri.queryParameters['deeplink'],
|
||||
),
|
||||
),
|
||||
redirect: loggedOutRedirect,
|
||||
),
|
||||
GoRoute(
|
||||
|
|
|
|||
|
|
@ -55,7 +55,20 @@ enum AppSettings<T> {
|
|||
enableSoftLogout<bool>('chat.fluffy.enable_soft_logout', false),
|
||||
enableMatrixNativeOIDC<bool>('chat.fluffy.enable_matrix_native_oidc', false),
|
||||
presetHomeserver<String>('chat.fluffy.preset_homeserver', ''),
|
||||
welcomeText<String>('chat.fluffy.welcome_text', '');
|
||||
welcomeText<String>('chat.fluffy.welcome_text', ''),
|
||||
website<String>('chat.fluffy.website_url', 'https://fluffychat.im'),
|
||||
logoUrl<String>(
|
||||
'chat.fluffy.logo_url',
|
||||
'https://fluffychat.im/assets/favicon.png',
|
||||
),
|
||||
privacyPolicy<String>(
|
||||
'chat.fluffy.privacy_policy_url',
|
||||
'https://fluffychat.im/en/privacy',
|
||||
),
|
||||
tos<String>('chat.fluffy.tos_url', 'https://fluffychat.im/en/tos'),
|
||||
sendTimelineEventTimeout<int>('chat.fluffy.send_timeline_event_timeout', 15),
|
||||
lastSeenSupportBanner<int>('chat.fluffy.last_seen_support_banner', 0),
|
||||
supportBannerOptOut<bool>('chat.fluffy.support_banner_opt_out', false);
|
||||
|
||||
final String key;
|
||||
final T defaultValue;
|
||||
|
|
@ -65,6 +78,11 @@ enum AppSettings<T> {
|
|||
static SharedPreferences get store => _store!;
|
||||
static SharedPreferences? _store;
|
||||
|
||||
static Future<void> reset({bool loadWebConfigFile = true}) async {
|
||||
await AppSettings._store!.clear();
|
||||
await init(loadWebConfigFile: loadWebConfigFile);
|
||||
}
|
||||
|
||||
static Future<SharedPreferences> init({bool loadWebConfigFile = true}) async {
|
||||
if (AppSettings._store != null) return AppSettings.store;
|
||||
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ abstract class FluffyThemes {
|
|||
),
|
||||
inputDecorationTheme: InputDecorationTheme(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2),
|
||||
),
|
||||
contentPadding: const EdgeInsets.all(12),
|
||||
),
|
||||
|
|
|
|||
5444
lib/l10n/intl_ar.arb
5444
lib/l10n/intl_ar.arb
File diff suppressed because it is too large
Load diff
6035
lib/l10n/intl_be.arb
6035
lib/l10n/intl_be.arb
File diff suppressed because it is too large
Load diff
|
|
@ -1,155 +1,160 @@
|
|||
{
|
||||
"@@last_modified": "2021-08-14 12:41:10.154280",
|
||||
"about": "সম্পর্কে",
|
||||
"@about": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "স্বীকার করি",
|
||||
"@accept": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
"@@last_modified": "2021-08-14 12:41:10.154280",
|
||||
"about": "সম্পর্কে",
|
||||
"@about": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "স্বীকার করি",
|
||||
"@accept": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"account": "অ্যাকাউন্ট",
|
||||
"@account": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alwaysUse24HourFormat": "না",
|
||||
"@alwaysUse24HourFormat": {
|
||||
"description": "Set to true to always display time of day in 24 hour format."
|
||||
},
|
||||
"repeatPassword": "পাসওয়ার্ড আবার লিখো",
|
||||
"@repeatPassword": {},
|
||||
"notAnImage": "ইমেজ ফাইল না।",
|
||||
"@notAnImage": {},
|
||||
"admin": "অ্যাডমিস",
|
||||
"@admin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alias": "অ্যালিয়াস",
|
||||
"@alias": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"archive": "আর্কাইভ",
|
||||
"@archive": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"banned": "ব্যানড",
|
||||
"@banned": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cancel": "বাতিল",
|
||||
"@cancel": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chat": "চ্যাট",
|
||||
"@chat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"close": "বন্ধ",
|
||||
"@close": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"copy": "অনুলিপি",
|
||||
"@copy": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"create": "তৈরি",
|
||||
"@create": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"delete": "অপসারণ",
|
||||
"@delete": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"device": "ডিভাইস",
|
||||
"@device": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"devices": "ডিভাইস",
|
||||
"@devices": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"notifications": "বিজ্ঞপ্তি",
|
||||
"@notifications": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"edit": "সম্পাদন",
|
||||
"@edit": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"encryption": "এনক্রিপশন",
|
||||
"@encryption": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"encrypted": "এনক্রিপ্টকৃত",
|
||||
"@encrypted": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"fluffychat": "ফ্লাফিচ্যাট",
|
||||
"@fluffychat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"forward": "ফরওয়ার্ড",
|
||||
"@forward": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"group": "গ্রুপ",
|
||||
"@group": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"help": "সাহায্য",
|
||||
"@help": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"id": "আইডি",
|
||||
"@id": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"invited": "আমন্ত্রিত",
|
||||
"@invited": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"leave": "ছেড়ে যাও",
|
||||
"@leave": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"logout": "প্রস্থান",
|
||||
"@logout": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"login": "প্রবেশ",
|
||||
"@login": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
}
|
||||
},
|
||||
"account": "অ্যাকাউন্ট",
|
||||
"@account": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alwaysUse24HourFormat": "না",
|
||||
"@alwaysUse24HourFormat": {
|
||||
"description": "Set to true to always display time of day in 24 hour format."
|
||||
},
|
||||
"repeatPassword": "পাসওয়ার্ড আবার লিখো",
|
||||
"@repeatPassword": {},
|
||||
"notAnImage": "ইমেজ ফাইল না।",
|
||||
"@notAnImage": {},
|
||||
"admin": "অ্যাডমিস",
|
||||
"@admin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alias": "অ্যালিয়াস",
|
||||
"@alias": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"archive": "আর্কাইভ",
|
||||
"@archive": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"banned": "ব্যানড",
|
||||
"@banned": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cancel": "বাতিল",
|
||||
"@cancel": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chat": "চ্যাট",
|
||||
"@chat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"close": "বন্ধ",
|
||||
"@close": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"copy": "অনুলিপি",
|
||||
"@copy": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"create": "তৈরি",
|
||||
"@create": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"delete": "অপসারণ",
|
||||
"@delete": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"devices": "ডিভাইস",
|
||||
"@devices": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"notifications": "বিজ্ঞপ্তি",
|
||||
"@notifications": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"edit": "সম্পাদন",
|
||||
"@edit": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"encryption": "এনক্রিপশন",
|
||||
"@encryption": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"encrypted": "এনক্রিপ্টকৃত",
|
||||
"@encrypted": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"fluffychat": "ফ্লাফিচ্যাট",
|
||||
"@fluffychat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"forward": "ফরওয়ার্ড",
|
||||
"@forward": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"group": "গ্রুপ",
|
||||
"@group": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"help": "সাহায্য",
|
||||
"@help": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"id": "আইডি",
|
||||
"@id": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"invited": "আমন্ত্রিত",
|
||||
"@invited": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"leave": "ছেড়ে যাও",
|
||||
"@leave": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"logout": "প্রস্থান",
|
||||
"@logout": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"login": "প্রবেশ",
|
||||
"@login": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
|
|
@ -27,15 +27,7 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@connect": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@jumpToLastReadMessage": {},
|
||||
"@allRooms": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@obtainingLocation": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -45,7 +37,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@widgetVideo": {},
|
||||
"@dismiss": {},
|
||||
"@unknownDevice": {
|
||||
"type": "String",
|
||||
|
|
@ -68,10 +59,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setPermissionsLevel": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@inviteContactToGroup": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -89,7 +76,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@chatHasBeenAddedToThisSpace": {},
|
||||
"@reply": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -115,7 +101,6 @@
|
|||
"type": "String",
|
||||
"description": "Usage hint for the command /html"
|
||||
},
|
||||
"@widgetJitsi": {},
|
||||
"@youAreNoLongerParticipatingInThisChat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -125,12 +110,7 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@messageType": {},
|
||||
"@indexedDbErrorLong": {},
|
||||
"@oneClientLoggedOut": {},
|
||||
"@toggleMuted": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@unsupportedAndroidVersionLong": {},
|
||||
"@kicked": {
|
||||
"type": "String",
|
||||
|
|
@ -172,8 +152,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@startFirstChat": {},
|
||||
"@callingAccount": {},
|
||||
"@requestPermission": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -202,15 +180,10 @@
|
|||
}
|
||||
},
|
||||
"@setColorTheme": {},
|
||||
"@nextAccount": {},
|
||||
"@commandHint_create": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /create"
|
||||
},
|
||||
"@singlesignon": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@warning": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -312,7 +285,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@widgetEtherpad": {},
|
||||
"@waitingPartnerAcceptRequest": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -353,10 +325,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@separateChatTypes": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@tryAgain": {},
|
||||
"@areGuestsAllowedToJoin": {
|
||||
"type": "String",
|
||||
|
|
@ -373,21 +341,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@dateWithoutYear": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"month": {
|
||||
"type": "String"
|
||||
},
|
||||
"day": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@removeDevice": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@unbanUserDescription": {},
|
||||
"@userAndUserAreTyping": {
|
||||
"type": "String",
|
||||
|
|
@ -422,7 +375,6 @@
|
|||
}
|
||||
},
|
||||
"@youRejectedTheInvitation": {},
|
||||
"@otherCallingPermissions": {},
|
||||
"@messagesStyle": {},
|
||||
"@couldNotDecryptMessage": {
|
||||
"type": "String",
|
||||
|
|
@ -437,11 +389,8 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@link": {},
|
||||
"@widgetUrlError": {},
|
||||
"@emailOrUsername": {},
|
||||
"@newSpaceDescription": {},
|
||||
"@chatDescription": {},
|
||||
"@callingAccountDetails": {},
|
||||
"@next": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -458,25 +407,10 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@dateWithYear": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"year": {
|
||||
"type": "String"
|
||||
},
|
||||
"month": {
|
||||
"type": "String"
|
||||
},
|
||||
"day": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@editRoomAliases": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@enterSpace": {},
|
||||
"@encryptThisChat": {},
|
||||
"@fileName": {
|
||||
"type": "String",
|
||||
|
|
@ -486,7 +420,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@previousAccount": {},
|
||||
"@publicRooms": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -503,20 +436,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@emoteWarnNeedToPick": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@reopenChat": {},
|
||||
"@pleaseEnterRecoveryKey": {},
|
||||
"@create": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@toggleFavorite": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@no": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -525,7 +449,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@widgetNameError": {},
|
||||
"@inoffensive": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -543,7 +466,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@addWidget": {},
|
||||
"@all": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -596,7 +518,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@hydrateTor": {},
|
||||
"@pushNotificationsNotAvailable": {},
|
||||
"@passwordRecovery": {
|
||||
"type": "String",
|
||||
|
|
@ -647,7 +568,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@signInWithPassword": {},
|
||||
"@ignoredUsers": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -712,10 +632,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@goToTheNewRoom": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@commandHint_clearcache": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /clearcache"
|
||||
|
|
@ -739,14 +655,6 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@whyIsThisMessageEncrypted": {},
|
||||
"@unreadChats": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"unreadCount": {
|
||||
"type": "int"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@rejectedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -769,19 +677,11 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@importFromZipFile": {},
|
||||
"@toggleUnread": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@or": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@dehydrateWarning": {},
|
||||
"@sendOriginal": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@noOtherDevicesFound": {},
|
||||
"@whoIsAllowedToJoinThisGroup": {
|
||||
"type": "String",
|
||||
|
|
@ -791,14 +691,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@seenByUser": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@storeSecurlyOnThisDevice": {},
|
||||
"@yourChatBackupHasBeenSetUp": {},
|
||||
"@chatBackup": {
|
||||
|
|
@ -862,18 +754,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@containsDisplayName": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@signInWith": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"provider": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@username": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -896,10 +776,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@people": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@changedTheHistoryVisibilityTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -932,7 +808,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@callingPermissions": {},
|
||||
"@delete": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -956,18 +831,6 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@unlockOldMessages": {},
|
||||
"@identity": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@numChats": {
|
||||
"type": "number",
|
||||
"placeholders": {
|
||||
"number": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@changedTheJoinRulesTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1067,10 +930,6 @@
|
|||
"@sendAsText": {
|
||||
"type": "String"
|
||||
},
|
||||
"@inviteForMe": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@archiveRoomDescription": {},
|
||||
"@exportEmotePack": {},
|
||||
"@changedTheChatNameTo": {
|
||||
|
|
@ -1084,22 +943,10 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@sendSticker": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@account": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@switchToAccount": {
|
||||
"type": "number",
|
||||
"placeholders": {
|
||||
"number": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@commandInvalid": {
|
||||
"type": "String"
|
||||
},
|
||||
|
|
@ -1170,7 +1017,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@inviteContactToGroupQuestion": {},
|
||||
"@emoteExists": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1213,12 +1059,10 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@appearOnTopDetails": {},
|
||||
"@roomHasBeenUpgraded": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@enterRoom": {},
|
||||
"@enableEmotesGlobally": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1276,17 +1120,6 @@
|
|||
}
|
||||
},
|
||||
"@confirmEventUnpin": {},
|
||||
"@badServerVersionsException": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"serverVersions": {
|
||||
"type": "String"
|
||||
},
|
||||
"supportedVersions": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@youInvitedUser": {
|
||||
"placeholders": {
|
||||
"user": {
|
||||
|
|
@ -1317,10 +1150,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@license": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@addToSpace": {},
|
||||
"@unbanFromChat": {
|
||||
"type": "String",
|
||||
|
|
@ -1336,10 +1165,6 @@
|
|||
"description": "State that {command} is not a valid /command."
|
||||
},
|
||||
"@redactMessageDescription": {},
|
||||
"@rejoin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@recoveryKey": {},
|
||||
"@redactMessage": {
|
||||
"type": "String",
|
||||
|
|
@ -1366,7 +1191,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@dehydrateTorLong": {},
|
||||
"@yourPublicKey": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1428,10 +1252,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@memberChanges": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@joinRoom": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1446,9 +1266,7 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@serverRequiresEmail": {},
|
||||
"@hideUnimportantStateEvents": {},
|
||||
"@screenSharingTitle": {},
|
||||
"@widgetCustom": {},
|
||||
"@sentCallInformations": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1457,7 +1275,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@addToSpaceDescription": {},
|
||||
"@googlyEyesContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1485,7 +1302,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@addChatDescription": {},
|
||||
"@sentAnAudio": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1521,7 +1337,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@publish": {},
|
||||
"@openLinkInBrowser": {},
|
||||
"@clearArchive": {},
|
||||
"@appLock": {
|
||||
|
|
@ -1569,8 +1384,6 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@inviteGroupChat": {},
|
||||
"@appearOnTop": {},
|
||||
"@invitePrivateChat": {},
|
||||
"@verifyTitle": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1606,10 +1419,6 @@
|
|||
"description": "Usage hint for the command /ban"
|
||||
},
|
||||
"@importEmojis": {},
|
||||
"@confirm": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@wasDirectChatDisplayName": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1660,7 +1469,6 @@
|
|||
},
|
||||
"@newGroup": {},
|
||||
"@bundleName": {},
|
||||
"@dehydrateTor": {},
|
||||
"@removeFromSpace": {},
|
||||
"@dateAndTimeOfDay": {
|
||||
"type": "String",
|
||||
|
|
@ -1730,7 +1538,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@profileNotFound": {},
|
||||
"@jump": {},
|
||||
"@groups": {
|
||||
"type": "String",
|
||||
|
|
@ -1759,14 +1566,6 @@
|
|||
}
|
||||
},
|
||||
"@sorryThatsNotPossible": {},
|
||||
"@videoWithSize": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"size": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@oopsSomethingWentWrong": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1798,10 +1597,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@containsUserName": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@messages": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1831,10 +1626,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setCustomEmotes": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@startedACall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1851,10 +1642,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@notificationsEnabledForThisAccount": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@deleteMessage": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1867,20 +1654,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setTheme": {},
|
||||
"@changeTheHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@youJoinedTheChat": {},
|
||||
"@wallpaper": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@openVideoCamera": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@play": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1914,7 +1692,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@widgetName": {},
|
||||
"@sentASticker": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1923,7 +1700,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@errorAddingWidget": {},
|
||||
"@commandHint_dm": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /dm"
|
||||
|
|
@ -2003,16 +1779,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@pleaseChoose": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@share": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@commandHint_googly": {},
|
||||
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
|
||||
"@createGroup": {},
|
||||
"@privacy": {
|
||||
"type": "String",
|
||||
|
|
@ -2026,16 +1797,7 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@hydrateTorLong": {},
|
||||
"@time": {},
|
||||
"@enterYourHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@botMessages": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@contentHasBeenReported": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -2070,10 +1832,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setInvitationLink": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@pinMessage": {},
|
||||
"@screenSharingDetail": {},
|
||||
"@muteChat": {
|
||||
|
|
@ -2090,7 +1848,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@indexedDbErrorTitle": {},
|
||||
"@endedTheCall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -2099,4 +1856,4 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
5447
lib/l10n/intl_ca.arb
5447
lib/l10n/intl_ca.arb
File diff suppressed because it is too large
Load diff
5167
lib/l10n/intl_cs.arb
5167
lib/l10n/intl_cs.arb
File diff suppressed because it is too large
Load diff
|
|
@ -1,133 +1,133 @@
|
|||
{
|
||||
"repeatPassword": "Gentag password",
|
||||
"notAnImage": "Ikke en billedfil.",
|
||||
"ignoreUser": "Ignorér bruger",
|
||||
"remove": "Fjern",
|
||||
"@remove": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"importNow": "Importer nu",
|
||||
"importEmojis": "Importer emojis",
|
||||
"importFromZipFile": "Importer fra .zip fil",
|
||||
"alwaysUse24HourFormat": "true",
|
||||
"@alwaysUse24HourFormat": {
|
||||
"description": "Set to true to always display time of day in 24 hour format."
|
||||
},
|
||||
"exportEmotePack": "Eksportér Emote-pakke som .zip-fil",
|
||||
"replace": "Erstat",
|
||||
"about": "Om",
|
||||
"aboutHomeserver": "Om {homeserver}",
|
||||
"@aboutHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"homeserver": {
|
||||
"type": "String"
|
||||
}
|
||||
"repeatPassword": "Gentag password",
|
||||
"notAnImage": "Ikke en billedfil.",
|
||||
"ignoreUser": "Ignorér bruger",
|
||||
"remove": "Fjern",
|
||||
"@remove": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"importNow": "Importer nu",
|
||||
"importEmojis": "Importer emojis",
|
||||
"importFromZipFile": "Importer fra .zip fil",
|
||||
"alwaysUse24HourFormat": "true",
|
||||
"@alwaysUse24HourFormat": {
|
||||
"description": "Set to true to always display time of day in 24 hour format."
|
||||
},
|
||||
"exportEmotePack": "Eksportér Emote-pakke som .zip-fil",
|
||||
"replace": "Erstat",
|
||||
"about": "Om",
|
||||
"aboutHomeserver": "Om {homeserver}",
|
||||
"@aboutHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"homeserver": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"accept": "Acceptér",
|
||||
"@accept": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "👍 {username} accepterede invitationen",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"account": "Konto",
|
||||
"@account": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"activatedEndToEndEncryption": "🔐 {username} aktiverede end-to-end kryptering",
|
||||
"@activatedEndToEndEncryption": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"addEmail": "Tilføj e-mail",
|
||||
"@addEmail": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"confirmMatrixId": "Bekræft din Matrix-ID for at slette din konto.",
|
||||
"supposedMxid": "Den burde være {mxid}",
|
||||
"@supposedMxid": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"mxid": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"addToSpace": "Tilføj til gruppe",
|
||||
"admin": "Admin",
|
||||
"@admin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alias": "alias",
|
||||
"@alias": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"allChats": "Alle samtaler",
|
||||
"@allChats": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_roomupgrade": "Opgrader dette rum til den givne rumversion",
|
||||
"commandHint_googly": "Send googly-eyes",
|
||||
"commandHint_cuddle": "Send et varmt smil",
|
||||
"commandHint_hug": "Send et kram",
|
||||
"googlyEyesContent": "{senderName} sender dig googly-eyes",
|
||||
"@googlyEyesContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cuddleContent": "{senderName} sender dig et varmt smil",
|
||||
"@cuddleContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hugContent": "{senderName} krammer dig",
|
||||
"@hugContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"answeredTheCall": "{senderName} svarer på dit opkald",
|
||||
"@answeredTheCall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"anyoneCanJoin": "Enhver kan deltage",
|
||||
"@anyoneCanJoin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
}
|
||||
},
|
||||
"accept": "Acceptér",
|
||||
"@accept": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "👍 {username} accepterede invitationen",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"account": "Konto",
|
||||
"@account": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"activatedEndToEndEncryption": "🔐 {username} aktiverede end-to-end kryptering",
|
||||
"@activatedEndToEndEncryption": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"addEmail": "Tilføj e-mail",
|
||||
"@addEmail": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"confirmMatrixId": "Bekræft din Matrix-ID for at slette din konto.",
|
||||
"supposedMxid": "Den burde være {mxid}",
|
||||
"@supposedMxid": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"mxid": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"addToSpace": "Tilføj til gruppe",
|
||||
"admin": "Admin",
|
||||
"@admin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alias": "alias",
|
||||
"@alias": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"allChats": "Alle samtaler",
|
||||
"@allChats": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_roomupgrade": "Opgrader dette rum til den givne rumversion",
|
||||
"commandHint_googly": "Send googly-eyes",
|
||||
"commandHint_cuddle": "Send et varmt smil",
|
||||
"commandHint_hug": "Send et kram",
|
||||
"googlyEyesContent": "{senderName} sender dig googly-eyes",
|
||||
"@googlyEyesContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cuddleContent": "{senderName} sender dig et varmt smil",
|
||||
"@cuddleContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"hugContent": "{senderName} krammer dig",
|
||||
"@hugContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"answeredTheCall": "{senderName} svarer på dit opkald",
|
||||
"@answeredTheCall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"anyoneCanJoin": "Enhver kan deltage",
|
||||
"@anyoneCanJoin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
5497
lib/l10n/intl_de.arb
5497
lib/l10n/intl_de.arb
File diff suppressed because it is too large
Load diff
|
|
@ -1,438 +1,462 @@
|
|||
{
|
||||
"hugContent": "{senderName} σε αγκαλιάζει",
|
||||
"@hugContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
"hugContent": "{senderName} σε αγκαλιάζει",
|
||||
"@hugContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"commandHint_cuddle": "Στείλε μια αγκαλιά",
|
||||
"@commandHint_cuddle": {},
|
||||
"admin": "Διαχειριστής",
|
||||
"@admin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"blockDevice": "Αποκλεισμός Συσκευής",
|
||||
"@blockDevice": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"supposedMxid": "Αυτό θα πρέπει να είναι {mxid}",
|
||||
"@supposedMxid": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"mxid": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"banFromChat": "Αποκλεισμός από τη συνομιλία",
|
||||
"@banFromChat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"askSSSSSign": "Για να μπορέσεις να υπογράψεις το άλλο άτομο, πληκτρολόγησε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.",
|
||||
"@askSSSSSign": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"remove": "Αφαίρεση",
|
||||
"@remove": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areGuestsAllowedToJoin": "Επιτρέπεται στους επισκέπτες χρήστες να συμμετάσχουν",
|
||||
"@areGuestsAllowedToJoin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"blocked": "Αποκλείστηκε",
|
||||
"@blocked": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"sendOnEnter": "Αποστολή με enter",
|
||||
"@sendOnEnter": {},
|
||||
"answeredTheCall": "{senderName} απάντησε στην κλήση",
|
||||
"@answeredTheCall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"alias": "ψευδώνυμο",
|
||||
"@alias": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"all": "Όλα",
|
||||
"@all": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"badServerLoginTypesException": "Ο οικιακός διακομιστής υποστηρίζει τους τύπους σύνδεσης:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n{supportedVersions}",
|
||||
"@badServerLoginTypesException": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"serverVersions": {
|
||||
"type": "String"
|
||||
},
|
||||
"supportedVersions": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cantOpenUri": "Δεν μπορεί να ανοίξει το URI {uri}",
|
||||
"@cantOpenUri": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"uri": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"importFromZipFile": "Εισαγωγή από αρχείο .zip",
|
||||
"@importFromZipFile": {},
|
||||
"autoplayImages": "Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes",
|
||||
"@autoplayImages": {
|
||||
"type": "String",
|
||||
"placeholder": {}
|
||||
},
|
||||
"repeatPassword": "Επανάληψη κωδικού πρόσβασης",
|
||||
"@repeatPassword": {},
|
||||
"acceptedTheInvitation": "👍 {username} αποδέχτηκε την πρόσκληση",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"banned": "Αποκλείστηκε",
|
||||
"@banned": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"exportEmotePack": "Εξαγωγή πακέτου Emote ως .zip",
|
||||
"@exportEmotePack": {},
|
||||
"account": "Λογαριασμός",
|
||||
"@account": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areYouSure": "Σίγουρα;",
|
||||
"@areYouSure": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"allChats": "Όλες οι συνομιλίες",
|
||||
"@allChats": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"addToSpace": "Προσθήκη στο χώρο",
|
||||
"@addToSpace": {},
|
||||
"about": "Σχετικά",
|
||||
"@about": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"activatedEndToEndEncryption": "🔐 {username} ενεργοποίησε την κρυπτογράφηση από άκρο σε άκρο",
|
||||
"@activatedEndToEndEncryption": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"googlyEyesContent": "{senderName} σού στέλνει αστεία μάτια",
|
||||
"@googlyEyesContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cancel": "Ακύρωση",
|
||||
"@cancel": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"appLock": "Κλείδωμα εφαρμογής",
|
||||
"@appLock": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"sendTypingNotifications": "Αποστολή ειδοποιήσεων πληκτρολόγησης",
|
||||
"@sendTypingNotifications": {},
|
||||
"importEmojis": "Εισαγωγή Emojis",
|
||||
"@importEmojis": {},
|
||||
"confirmMatrixId": "Παρακαλούμε επιβεβαίωσε το Matrix ID σου για να διαγράψεις τον λογαριασμό σου.",
|
||||
"@confirmMatrixId": {},
|
||||
"notAnImage": "Δεν είναι αρχείο εικόνας.",
|
||||
"@notAnImage": {},
|
||||
"areYouSureYouWantToLogout": "Σίγουρα θες να αποσυνδεθείς;",
|
||||
"@areYouSureYouWantToLogout": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"bannedUser": "{username} απέκλεισε {targetName}",
|
||||
"@bannedUser": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"targetName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cuddleContent": "{senderName} σέ αγκαλιάζει",
|
||||
"@cuddleContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"askVerificationRequest": "Αποδοχή αυτού του αιτήματος επαλήθευσης από {username};",
|
||||
"@askVerificationRequest": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"addEmail": "Προσθήκη email",
|
||||
"@addEmail": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_hug": "Στείλτε μια αγκαλιά",
|
||||
"@commandHint_hug": {},
|
||||
"replace": "Αντικατάσταση",
|
||||
"@replace": {},
|
||||
"archive": "Αρχείο",
|
||||
"@archive": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "Αποδοχή",
|
||||
"@accept": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_googly": "Στείλε αστεία μάτια",
|
||||
"@commandHint_googly": {},
|
||||
"importNow": "Εισαγωγή τώρα",
|
||||
"@importNow": {},
|
||||
"anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει",
|
||||
"@anyoneCanJoin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alwaysUse24HourFormat": "Ψευδής",
|
||||
"@alwaysUse24HourFormat": {
|
||||
"description": "Set to true to always display time of day in 24 hour format."
|
||||
},
|
||||
"ignoreUser": "Αγνόηση χρήστη",
|
||||
"@ignoreUser": {},
|
||||
"aboutHomeserver": "Σχετικά με {homeserver}",
|
||||
"@aboutHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"homeserver": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"commandHint_roomupgrade": "Αναβάθμιση αυτού του δωματίου στην δεδομένη έκδοση δωματίου",
|
||||
"@commandHint_roomupgrade": {},
|
||||
"appLockDescription": "Κλείδωμα εφαρμογής όταν δεν χρησιμοποιείται με κωδικό PIN",
|
||||
"@appLockDescription": {},
|
||||
"swipeRightToLeftToReply": "Σύρσιμο δεξιά προς αριστερά για απάντηση",
|
||||
"@swipeRightToLeftToReply": {},
|
||||
"noMoreChatsFound": "Δεν βρέθηκαν άλλες συνομιλίες...",
|
||||
"@noMoreChatsFound": {},
|
||||
"noChatsFoundHere": "Δεν υπάρχουν συνομιλίες ακόμα. Ξεκίνα μια νέα συνομιλία με κάποιον χρησιμοποιώντας το κουμπί παρακάτω. ⤵️",
|
||||
"@noChatsFoundHere": {},
|
||||
"unread": "Μη αναγνωσμένα",
|
||||
"@unread": {},
|
||||
"space": "Χώρος",
|
||||
"@space": {},
|
||||
"spaces": "Χώροι",
|
||||
"@spaces": {},
|
||||
"changeDeviceName": "Αλλαγή ονόματος συσκευής",
|
||||
"@changeDeviceName": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changedTheChatAvatar": "{username} άλλαξε το άβαταρ συνομιλίας",
|
||||
"@changedTheChatAvatar": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheChatDescriptionTo": "{username} άλλαξε την περιγραφή συνομιλίας σε: '{description}'",
|
||||
"@changedTheChatDescriptionTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"description": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheChatNameTo": "{username} άλλαξε το όνομα συνομιλίας σε: '{chatname}'",
|
||||
"@changedTheChatNameTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"chatname": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheChatPermissions": "{username} άλλαξε τα δικαιώματα συνομιλίας",
|
||||
"@changedTheChatPermissions": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheDisplaynameTo": "{username} άλλαξε το εμφανιζόμενο όνομά του σε: '{displayname}'",
|
||||
"@changedTheDisplaynameTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"displayname": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheGuestAccessRules": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών",
|
||||
"@changedTheGuestAccessRules": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheGuestAccessRulesTo": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών σε: {rules}",
|
||||
"@changedTheGuestAccessRulesTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"rules": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheHistoryVisibility": "{username} άλλαξε την ορατότητα ιστορικού",
|
||||
"@changedTheHistoryVisibility": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheHistoryVisibilityTo": "{username} άλλαξε την ορατότητα ιστορικού σε: {rules}",
|
||||
"@changedTheHistoryVisibilityTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"rules": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheJoinRules": "{username} άλλαξε τους κανόνες συμμετοχής",
|
||||
"@changedTheJoinRules": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheJoinRulesTo": "{username} άλλαξε τους κανόνες συμμετοχής σε: {joinRules}",
|
||||
"@changedTheJoinRulesTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"joinRules": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheProfileAvatar": "Ο χρήστης {username} άλλαξε την εικόνα προφίλ του",
|
||||
"@changedTheProfileAvatar": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changePassword": "Αλλαγή κωδικού πρόσβασης",
|
||||
"@changePassword": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeTheme": "Άλλαξε το στυλ σου",
|
||||
"@changeTheme": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeYourAvatar": "Αλλαγή εικόνας προφιλ",
|
||||
"@changeYourAvatar": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatBackup": "Αντίγραφο ασφαλείας συνομιλίας",
|
||||
"@chatBackup": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatDetails": "Λεπτομέρειες συνομιλίας",
|
||||
"@chatDetails": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chats": "Συνομιλίες",
|
||||
"@chats": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chooseAStrongPassword": "Εισάγετε ένα δυνατό κωδικό πρόσβασης",
|
||||
"@chooseAStrongPassword": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"close": "Κλείσιμο",
|
||||
"@close": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_ban": "Αποκλεισμός χρήστη από το δωμάτιο",
|
||||
"@commandHint_ban": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /ban"
|
||||
},
|
||||
"commandHint_clearcache": "Εκκαθάριση προσωρινής μνήμης",
|
||||
"@commandHint_clearcache": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /clearcache"
|
||||
},
|
||||
"commandHint_invite": "Πρόσκληση αυτού του χρήστη στο δωμάτιο",
|
||||
"@commandHint_invite": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /invite"
|
||||
}
|
||||
},
|
||||
"commandHint_cuddle": "Στείλε μια αγκαλιά",
|
||||
"@commandHint_cuddle": {},
|
||||
"admin": "Διαχειριστής",
|
||||
"@admin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"blockDevice": "Αποκλεισμός Συσκευής",
|
||||
"@blockDevice": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"supposedMxid": "Αυτό θα πρέπει να είναι {mxid}",
|
||||
"@supposedMxid": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"mxid": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"banFromChat": "Αποκλεισμός από τη συνομιλία",
|
||||
"@banFromChat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"askSSSSSign": "Για να μπορέσεις να υπογράψεις το άλλο άτομο, πληκτρολόγησε τη συνθηματική φράση ασφαλούς αποθήκευσης ή το κλειδί ανάκτησης.",
|
||||
"@askSSSSSign": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"remove": "Αφαίρεση",
|
||||
"@remove": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areGuestsAllowedToJoin": "Επιτρέπεται στους επισκέπτες χρήστες να συμμετάσχουν",
|
||||
"@areGuestsAllowedToJoin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"blocked": "Αποκλείστηκε",
|
||||
"@blocked": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"sendOnEnter": "Αποστολή με enter",
|
||||
"@sendOnEnter": {},
|
||||
"answeredTheCall": "{senderName} απάντησε στην κλήση",
|
||||
"@answeredTheCall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"alias": "ψευδώνυμο",
|
||||
"@alias": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"all": "Όλα",
|
||||
"@all": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"badServerLoginTypesException": "Ο οικιακός διακομιστής υποστηρίζει τους τύπους σύνδεσης:\n{serverVersions}\nΑλλά αυτή η εφαρμογή υποστηρίζει μόνο:\n{supportedVersions}",
|
||||
"@badServerLoginTypesException": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"serverVersions": {
|
||||
"type": "String"
|
||||
},
|
||||
"supportedVersions": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cantOpenUri": "Δεν μπορεί να ανοίξει το URI {uri}",
|
||||
"@cantOpenUri": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"uri": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"importFromZipFile": "Εισαγωγή από αρχείο .zip",
|
||||
"@importFromZipFile": {},
|
||||
"autoplayImages": "Αυτόματη αναπαραγωγή κινούμενων αυτοκόλλητων και emotes",
|
||||
"@autoplayImages": {
|
||||
"type": "String",
|
||||
"placeholder": {}
|
||||
},
|
||||
"repeatPassword": "Επανάληψη κωδικού πρόσβασης",
|
||||
"@repeatPassword": {},
|
||||
"acceptedTheInvitation": "👍 {username} αποδέχτηκε την πρόσκληση",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"banned": "Αποκλείστηκε",
|
||||
"@banned": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"exportEmotePack": "Εξαγωγή πακέτου Emote ως .zip",
|
||||
"@exportEmotePack": {},
|
||||
"account": "Λογαριασμός",
|
||||
"@account": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areYouSure": "Σίγουρα;",
|
||||
"@areYouSure": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"allChats": "Όλες οι συνομιλίες",
|
||||
"@allChats": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"addToSpace": "Προσθήκη στο χώρο",
|
||||
"@addToSpace": {},
|
||||
"about": "Σχετικά",
|
||||
"@about": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"activatedEndToEndEncryption": "🔐 {username} ενεργοποίησε την κρυπτογράφηση από άκρο σε άκρο",
|
||||
"@activatedEndToEndEncryption": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"googlyEyesContent": "{senderName} σού στέλνει αστεία μάτια",
|
||||
"@googlyEyesContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cancel": "Ακύρωση",
|
||||
"@cancel": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"appLock": "Κλείδωμα εφαρμογής",
|
||||
"@appLock": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"sendTypingNotifications": "Αποστολή ειδοποιήσεων πληκτρολόγησης",
|
||||
"@sendTypingNotifications": {},
|
||||
"importEmojis": "Εισαγωγή Emojis",
|
||||
"@importEmojis": {},
|
||||
"confirmMatrixId": "Παρακαλούμε επιβεβαίωσε το Matrix ID σου για να διαγράψεις τον λογαριασμό σου.",
|
||||
"@confirmMatrixId": {},
|
||||
"notAnImage": "Δεν είναι αρχείο εικόνας.",
|
||||
"@notAnImage": {},
|
||||
"areYouSureYouWantToLogout": "Σίγουρα θες να αποσυνδεθείς;",
|
||||
"@areYouSureYouWantToLogout": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"bannedUser": "{username} απέκλεισε {targetName}",
|
||||
"@bannedUser": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"targetName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"cuddleContent": "{senderName} σέ αγκαλιάζει",
|
||||
"@cuddleContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"senderName": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"askVerificationRequest": "Αποδοχή αυτού του αιτήματος επαλήθευσης από {username};",
|
||||
"@askVerificationRequest": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"addEmail": "Προσθήκη email",
|
||||
"@addEmail": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_hug": "Στείλτε μια αγκαλιά",
|
||||
"@commandHint_hug": {},
|
||||
"replace": "Αντικατάσταση",
|
||||
"@replace": {},
|
||||
"archive": "Αρχείο",
|
||||
"@archive": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "Αποδοχή",
|
||||
"@accept": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_googly": "Στείλε αστεία μάτια",
|
||||
"@commandHint_googly": {},
|
||||
"importNow": "Εισαγωγή τώρα",
|
||||
"@importNow": {},
|
||||
"anyoneCanJoin": "Οποιοσδήποτε μπορεί να συμμετάσχει",
|
||||
"@anyoneCanJoin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alwaysUse24HourFormat": "Ψευδής",
|
||||
"@alwaysUse24HourFormat": {
|
||||
"description": "Set to true to always display time of day in 24 hour format."
|
||||
},
|
||||
"ignoreUser": "Αγνόηση χρήστη",
|
||||
"@ignoreUser": {},
|
||||
"aboutHomeserver": "Σχετικά με {homeserver}",
|
||||
"@aboutHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"homeserver": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"commandHint_roomupgrade": "Αναβάθμιση αυτού του δωματίου στην δεδομένη έκδοση δωματίου",
|
||||
"@commandHint_roomupgrade": {},
|
||||
"appLockDescription": "Κλείδωμα εφαρμογής όταν δεν χρησιμοποιείται με κωδικό PIN",
|
||||
"@appLockDescription": {},
|
||||
"swipeRightToLeftToReply": "Σύρσιμο δεξιά προς αριστερά για απάντηση",
|
||||
"@swipeRightToLeftToReply": {},
|
||||
"noMoreChatsFound": "Δεν βρέθηκαν άλλες συνομιλίες...",
|
||||
"@noMoreChatsFound": {},
|
||||
"noChatsFoundHere": "Δεν υπάρχουν συνομιλίες ακόμα. Ξεκίνα μια νέα συνομιλία με κάποιον χρησιμοποιώντας το κουμπί παρακάτω. ⤵️",
|
||||
"@noChatsFoundHere": {},
|
||||
"unread": "Μη αναγνωσμένα",
|
||||
"@unread": {},
|
||||
"space": "Χώρος",
|
||||
"@space": {},
|
||||
"spaces": "Χώροι",
|
||||
"@spaces": {},
|
||||
"changeDeviceName": "Αλλαγή ονόματος συσκευής",
|
||||
"@changeDeviceName": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changedTheChatAvatar": "{username} άλλαξε το άβαταρ συνομιλίας",
|
||||
"@changedTheChatAvatar": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheChatPermissions": "{username} άλλαξε τα δικαιώματα συνομιλίας",
|
||||
"@changedTheChatPermissions": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheDisplaynameTo": "{username} άλλαξε το εμφανιζόμενο όνομά του σε: '{displayname}'",
|
||||
"@changedTheDisplaynameTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"displayname": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheGuestAccessRules": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών",
|
||||
"@changedTheGuestAccessRules": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheGuestAccessRulesTo": "{username} άλλαξε τους κανόνες πρόσβασης των επισκεπτών σε: {rules}",
|
||||
"@changedTheGuestAccessRulesTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"rules": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheHistoryVisibility": "{username} άλλαξε την ορατότητα ιστορικού",
|
||||
"@changedTheHistoryVisibility": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheHistoryVisibilityTo": "{username} άλλαξε την ορατότητα ιστορικού σε: {rules}",
|
||||
"@changedTheHistoryVisibilityTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"rules": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheJoinRules": "{username} άλλαξε τους κανόνες συμμετοχής",
|
||||
"@changedTheJoinRules": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheJoinRulesTo": "{username} άλλαξε τους κανόνες συμμετοχής σε: {joinRules}",
|
||||
"@changedTheJoinRulesTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"joinRules": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheProfileAvatar": "Ο χρήστης {username} άλλαξε την εικόνα προφίλ του",
|
||||
"@changedTheProfileAvatar": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changePassword": "Αλλαγή κωδικού πρόσβασης",
|
||||
"@changePassword": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeTheme": "Άλλαξε το στυλ σου",
|
||||
"@changeTheme": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeYourAvatar": "Αλλαγή εικόνας προφιλ",
|
||||
"@changeYourAvatar": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatBackup": "Αντίγραφο ασφαλείας συνομιλίας",
|
||||
"@chatBackup": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatDetails": "Λεπτομέρειες συνομιλίας",
|
||||
"@chatDetails": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chats": "Συνομιλίες",
|
||||
"@chats": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chooseAStrongPassword": "Εισάγετε ένα δυνατό κωδικό πρόσβασης",
|
||||
"@chooseAStrongPassword": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"close": "Κλείσιμο",
|
||||
"@close": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_ban": "Αποκλεισμός χρήστη από το δωμάτιο",
|
||||
"@commandHint_ban": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /ban"
|
||||
},
|
||||
"commandHint_clearcache": "Εκκαθάριση προσωρινής μνήμης",
|
||||
"@commandHint_clearcache": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /clearcache"
|
||||
},
|
||||
"commandHint_invite": "Πρόσκληση αυτού του χρήστη στο δωμάτιο",
|
||||
"@commandHint_invite": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /invite"
|
||||
}
|
||||
}
|
||||
5469
lib/l10n/intl_en.arb
5469
lib/l10n/intl_en.arb
File diff suppressed because it is too large
Load diff
3678
lib/l10n/intl_eo.arb
3678
lib/l10n/intl_eo.arb
File diff suppressed because it is too large
Load diff
5471
lib/l10n/intl_es.arb
5471
lib/l10n/intl_es.arb
File diff suppressed because it is too large
Load diff
5491
lib/l10n/intl_et.arb
5491
lib/l10n/intl_et.arb
File diff suppressed because it is too large
Load diff
5469
lib/l10n/intl_eu.arb
5469
lib/l10n/intl_eu.arb
File diff suppressed because it is too large
Load diff
5231
lib/l10n/intl_fa.arb
5231
lib/l10n/intl_fa.arb
File diff suppressed because it is too large
Load diff
6005
lib/l10n/intl_fi.arb
6005
lib/l10n/intl_fi.arb
File diff suppressed because it is too large
Load diff
|
|
@ -370,6 +370,18 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"changedTheChatDescriptionTo": "Pinalitan ni {username} ang deskripsyon ng chat sa: '{description}'",
|
||||
"@changedTheChatDescriptionTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"description": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheProfileAvatar": "Pinalitan ni {username} ang kanilang avatar",
|
||||
"@changedTheProfileAvatar": {
|
||||
"type": "String",
|
||||
|
|
@ -379,6 +391,18 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"changedTheChatNameTo": "Pinalitan ni {username} ang pangalan ng chat sa: '{chatname}'",
|
||||
"@changedTheChatNameTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"chatname": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changedTheRoomInvitationLink": "Pinalitan ni {username} ang link ng imbitasyon",
|
||||
"@changedTheRoomInvitationLink": {
|
||||
"type": "String",
|
||||
|
|
@ -705,6 +729,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"device": "Device",
|
||||
"@device": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"deviceId": "ID ng Device",
|
||||
"@deviceId": {
|
||||
"type": "String",
|
||||
|
|
@ -806,6 +835,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"emotePacks": "Mga emote pack para sa room",
|
||||
"@emotePacks": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"emoteSettings": "Mga Setting ng Emote",
|
||||
"@emoteSettings": {
|
||||
"type": "String",
|
||||
|
|
@ -831,6 +865,11 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"fileName": "Pangalan ng file",
|
||||
"@fileName": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"fluffychat": "FluffyChat",
|
||||
"@fluffychat": {
|
||||
"type": "String",
|
||||
|
|
|
|||
5408
lib/l10n/intl_fr.arb
5408
lib/l10n/intl_fr.arb
File diff suppressed because it is too large
Load diff
5501
lib/l10n/intl_ga.arb
5501
lib/l10n/intl_ga.arb
File diff suppressed because it is too large
Load diff
5491
lib/l10n/intl_gl.arb
5491
lib/l10n/intl_gl.arb
File diff suppressed because it is too large
Load diff
2574
lib/l10n/intl_he.arb
2574
lib/l10n/intl_he.arb
File diff suppressed because it is too large
Load diff
|
|
@ -1,68 +1,68 @@
|
|||
{
|
||||
"remove": "निकालना",
|
||||
"@remove": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"importFromZipFile": ".zip फ़ाइल से आयात करें",
|
||||
"repeatPassword": "पासवर्ड दोहराएं",
|
||||
"exportEmotePack": "इमोट पैक को .zip के रूप में निर्यात करें",
|
||||
"importEmojis": "इमोजी आयात करें",
|
||||
"notAnImage": "कोई छवि फ़ाइल नहीं।",
|
||||
"importNow": "अभी आयात करें",
|
||||
"ignoreUser": "उपयोगकर्ता को नजरअंदाज करें",
|
||||
"replace": "बदलें",
|
||||
"about": "हमारे बारे में",
|
||||
"aboutHomeserver": "{homeserver} की जानकारी",
|
||||
"@aboutHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"homeserver": {
|
||||
"type": "String"
|
||||
}
|
||||
"remove": "निकालना",
|
||||
"@remove": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"importFromZipFile": ".zip फ़ाइल से आयात करें",
|
||||
"repeatPassword": "पासवर्ड दोहराएं",
|
||||
"exportEmotePack": "इमोट पैक को .zip के रूप में निर्यात करें",
|
||||
"importEmojis": "इमोजी आयात करें",
|
||||
"notAnImage": "कोई छवि फ़ाइल नहीं।",
|
||||
"importNow": "अभी आयात करें",
|
||||
"ignoreUser": "उपयोगकर्ता को नजरअंदाज करें",
|
||||
"replace": "बदलें",
|
||||
"about": "हमारे बारे में",
|
||||
"aboutHomeserver": "{homeserver} की जानकारी",
|
||||
"@aboutHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"homeserver": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"accept": "स्वीकार करें",
|
||||
"@accept": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "👍 {username} ने निमंत्रण स्वीकार किया",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"account": "अकाउंट",
|
||||
"@account": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"activatedEndToEndEncryption": "🔐 {username} ने एंड-टू-एंड एन्क्रिप्शन चालू किया",
|
||||
"@activatedEndToEndEncryption": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"addEmail": "ईमेल ऐड करें",
|
||||
"@addEmail": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"confirmMatrixId": "कृपया अपना अकाउंट हटाने के लिए अपनी मैट्रिक्स आईडी की पुष्टि करें।",
|
||||
"supposedMxid": "यह {mxid} होना चाहिए",
|
||||
"@supposedMxid": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"mxid": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"accept": "स्वीकार करें",
|
||||
"@accept": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "👍 {username} ने निमंत्रण स्वीकार किया",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"account": "अकाउंट",
|
||||
"@account": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"activatedEndToEndEncryption": "🔐 {username} ने एंड-टू-एंड एन्क्रिप्शन चालू किया",
|
||||
"@activatedEndToEndEncryption": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"addEmail": "ईमेल ऐड करें",
|
||||
"@addEmail": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"confirmMatrixId": "कृपया अपना अकाउंट हटाने के लिए अपनी मैट्रिक्स आईडी की पुष्टि करें।",
|
||||
"supposedMxid": "यह {mxid} होना चाहिए",
|
||||
"@supposedMxid": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"mxid": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
5441
lib/l10n/intl_hr.arb
5441
lib/l10n/intl_hr.arb
File diff suppressed because it is too large
Load diff
5812
lib/l10n/intl_hu.arb
5812
lib/l10n/intl_hu.arb
File diff suppressed because it is too large
Load diff
|
|
@ -57,4 +57,4 @@
|
|||
}
|
||||
},
|
||||
"@custom": {}
|
||||
}
|
||||
}
|
||||
5447
lib/l10n/intl_id.arb
5447
lib/l10n/intl_id.arb
File diff suppressed because it is too large
Load diff
|
|
@ -85,6 +85,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"fileName": "Nómine de file",
|
||||
"@fileName": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"fontSize": "Dimension de fonde",
|
||||
"@fontSize": {
|
||||
"type": "String",
|
||||
|
|
@ -236,6 +241,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"pushRules": "Regules de push-notificationes",
|
||||
"@pushRules": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"redactMessage": "Redacter li missage",
|
||||
"@redactMessage": {
|
||||
"type": "String",
|
||||
|
|
@ -437,6 +447,8 @@
|
|||
"@time": {},
|
||||
"sender": "Autor",
|
||||
"@sender": {},
|
||||
"dismiss": "Demisser",
|
||||
"@dismiss": {},
|
||||
"custom": "Personalisat",
|
||||
"@custom": {},
|
||||
"emojis": "Emoji",
|
||||
|
|
@ -502,6 +514,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"recording": "Registrante",
|
||||
"@recording": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"register": "Inregistrar se",
|
||||
"@register": {
|
||||
"type": "String",
|
||||
|
|
@ -765,6 +782,8 @@
|
|||
},
|
||||
"commandHint_markasgroup": "Marcar quam gruppe",
|
||||
"@commandHint_markasgroup": {},
|
||||
"screenSharingTitle": "partir li ecran",
|
||||
"@screenSharingTitle": {},
|
||||
"bannedUser": "{username} ha bannit {targetName}",
|
||||
"@bannedUser": {
|
||||
"type": "String",
|
||||
|
|
@ -877,6 +896,11 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"device": "Aparate",
|
||||
"@device": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"account": "Conto",
|
||||
"@account": {
|
||||
"type": "String",
|
||||
|
|
@ -928,6 +952,8 @@
|
|||
"@newGroup": {},
|
||||
"newSpace": "Crear un spacie",
|
||||
"@newSpace": {},
|
||||
"allSpaces": "Omni spacies",
|
||||
"@allSpaces": {},
|
||||
"logout": "Cluder li session",
|
||||
"@logout": {
|
||||
"type": "String",
|
||||
|
|
@ -1003,20 +1029,12 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@jumpToLastReadMessage": {},
|
||||
"@allRooms": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@commandHint_cuddle": {},
|
||||
"@noEncryptionForPublicRooms": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@reportErrorDescription": {},
|
||||
"@setPermissionsLevel": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@inviteContactToGroup": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1025,7 +1043,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@chatHasBeenAddedToThisSpace": {},
|
||||
"@removeYourAvatar": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1035,12 +1052,7 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@indexedDbErrorLong": {},
|
||||
"@oneClientLoggedOut": {},
|
||||
"@toggleMuted": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@unsupportedAndroidVersionLong": {},
|
||||
"@kicked": {
|
||||
"type": "String",
|
||||
|
|
@ -1069,7 +1081,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@startFirstChat": {},
|
||||
"@sentAPicture": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1094,10 +1105,6 @@
|
|||
"type": "String",
|
||||
"description": "Usage hint for the command /create"
|
||||
},
|
||||
"@singlesignon": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@sentAFile": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1181,10 +1188,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@separateChatTypes": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@tryAgain": {},
|
||||
"@areGuestsAllowedToJoin": {
|
||||
"type": "String",
|
||||
|
|
@ -1226,7 +1229,6 @@
|
|||
}
|
||||
},
|
||||
"@youRejectedTheInvitation": {},
|
||||
"@otherCallingPermissions": {},
|
||||
"@messagesStyle": {},
|
||||
"@couldNotDecryptMessage": {
|
||||
"type": "String",
|
||||
|
|
@ -1236,11 +1238,8 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@widgetUrlError": {},
|
||||
"@emailOrUsername": {},
|
||||
"@newSpaceDescription": {},
|
||||
"@chatDescription": {},
|
||||
"@callingAccountDetails": {},
|
||||
"@pleaseFollowInstructionsOnWeb": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1258,17 +1257,7 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@emoteWarnNeedToPick": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@reopenChat": {},
|
||||
"@pleaseEnterRecoveryKey": {},
|
||||
"@toggleFavorite": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@widgetNameError": {},
|
||||
"@addToBundle": {},
|
||||
"@spaceIsPublic": {
|
||||
"type": "String",
|
||||
|
|
@ -1302,7 +1291,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@hydrateTor": {},
|
||||
"@pushNotificationsNotAvailable": {},
|
||||
"@storeInAppleKeyChain": {},
|
||||
"@replaceRoomWithNewerVersion": {
|
||||
|
|
@ -1321,7 +1309,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@signInWithPassword": {},
|
||||
"@changedTheGuestAccessRulesTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1358,21 +1345,9 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@goToTheNewRoom": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@saveKeyManuallyDescription": {},
|
||||
"@editBundlesForAccount": {},
|
||||
"@whyIsThisMessageEncrypted": {},
|
||||
"@unreadChats": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"unreadCount": {
|
||||
"type": "int"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@rejectedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1397,14 +1372,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@seenByUser": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@storeSecurlyOnThisDevice": {},
|
||||
"@yourChatBackupHasBeenSetUp": {},
|
||||
"@redactedBy": {
|
||||
|
|
@ -1448,14 +1415,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@signInWith": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"provider": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@changedTheRoomAliases": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1554,14 +1513,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@switchToAccount": {
|
||||
"type": "number",
|
||||
"placeholders": {
|
||||
"number": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@setAsCanonicalAlias": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1601,7 +1552,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@inviteContactToGroupQuestion": {},
|
||||
"@redactedByBecause": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1620,7 +1570,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@appearOnTopDetails": {},
|
||||
"@roomHasBeenUpgraded": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1722,7 +1671,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@dehydrateTorLong": {},
|
||||
"@yourPublicKey": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1758,7 +1706,6 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@serverRequiresEmail": {},
|
||||
"@hideUnimportantStateEvents": {},
|
||||
"@sentCallInformations": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1767,7 +1714,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@addToSpaceDescription": {},
|
||||
"@googlyEyesContent": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1795,7 +1741,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@addChatDescription": {},
|
||||
"@sentAnAudio": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1852,8 +1797,6 @@
|
|||
},
|
||||
"@sendTypingNotifications": {},
|
||||
"@inviteGroupChat": {},
|
||||
"@appearOnTop": {},
|
||||
"@invitePrivateChat": {},
|
||||
"@verifyTitle": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1914,7 +1857,6 @@
|
|||
"@notAnImage": {},
|
||||
"@chatDescriptionHasBeenChanged": {},
|
||||
"@bundleName": {},
|
||||
"@dehydrateTor": {},
|
||||
"@removeFromSpace": {},
|
||||
"@commandHint_op": {
|
||||
"type": "String",
|
||||
|
|
@ -1960,7 +1902,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@profileNotFound": {},
|
||||
"@jump": {},
|
||||
"@reactedWith": {
|
||||
"type": "String",
|
||||
|
|
@ -2010,10 +1951,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setCustomEmotes": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@startedACall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -2026,20 +1963,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@notificationsEnabledForThisAccount": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@visibilityOfTheChatHistory": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setTheme": {},
|
||||
"@youJoinedTheChat": {},
|
||||
"@openVideoCamera": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@chatBackupDescription": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -2057,7 +1985,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@errorAddingWidget": {},
|
||||
"@commandHint_dm": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /dm"
|
||||
|
|
@ -2108,9 +2035,7 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@commandHint_googly": {},
|
||||
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
|
||||
"@createGroup": {},
|
||||
"@hydrateTorLong": {},
|
||||
"@contentHasBeenReported": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -2123,10 +2048,6 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@importNow": {},
|
||||
"@setInvitationLink": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@pinMessage": {},
|
||||
"@screenSharingDetail": {},
|
||||
"@invite": {},
|
||||
|
|
@ -2135,7 +2056,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@indexedDbErrorTitle": {},
|
||||
"@endedTheCall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
|
|||
5850
lib/l10n/intl_it.arb
5850
lib/l10n/intl_it.arb
File diff suppressed because it is too large
Load diff
4302
lib/l10n/intl_ja.arb
4302
lib/l10n/intl_ja.arb
File diff suppressed because it is too large
Load diff
1483
lib/l10n/intl_ka.arb
1483
lib/l10n/intl_ka.arb
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
5650
lib/l10n/intl_ko.arb
5650
lib/l10n/intl_ko.arb
File diff suppressed because it is too large
Load diff
4154
lib/l10n/intl_lt.arb
4154
lib/l10n/intl_lt.arb
File diff suppressed because it is too large
Load diff
5415
lib/l10n/intl_lv.arb
5415
lib/l10n/intl_lv.arb
File diff suppressed because it is too large
Load diff
5501
lib/l10n/intl_nb.arb
5501
lib/l10n/intl_nb.arb
File diff suppressed because it is too large
Load diff
5489
lib/l10n/intl_nl.arb
5489
lib/l10n/intl_nl.arb
File diff suppressed because it is too large
Load diff
5571
lib/l10n/intl_pl.arb
5571
lib/l10n/intl_pl.arb
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
4322
lib/l10n/intl_ro.arb
4322
lib/l10n/intl_ro.arb
File diff suppressed because it is too large
Load diff
5289
lib/l10n/intl_ru.arb
5289
lib/l10n/intl_ru.arb
File diff suppressed because it is too large
Load diff
2591
lib/l10n/intl_sk.arb
2591
lib/l10n/intl_sk.arb
File diff suppressed because it is too large
Load diff
|
|
@ -423,6 +423,18 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changedTheChatDescriptionTo": "{username} je spremenil opis klepeta v: '{description}'",
|
||||
"@changedTheChatDescriptionTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"description": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"areGuestsAllowedToJoin": "Ali se lahko gostujoči uporabniki pridružijo",
|
||||
"@areGuestsAllowedToJoin": {
|
||||
"type": "String",
|
||||
|
|
@ -433,6 +445,18 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changedTheChatNameTo": "{username} je spremenil ime klepeta v: '{chatname}'",
|
||||
"@changedTheChatNameTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"chatname": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"changeDeviceName": "Spremenite ime naprave",
|
||||
"@changeDeviceName": {
|
||||
"type": "String",
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
{}
|
||||
{}
|
||||
3484
lib/l10n/intl_sr.arb
3484
lib/l10n/intl_sr.arb
File diff suppressed because it is too large
Load diff
5194
lib/l10n/intl_sv.arb
5194
lib/l10n/intl_sv.arb
File diff suppressed because it is too large
Load diff
5647
lib/l10n/intl_ta.arb
5647
lib/l10n/intl_ta.arb
File diff suppressed because it is too large
Load diff
|
|
@ -12,4 +12,4 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -261,15 +261,7 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@connect": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@jumpToLastReadMessage": {},
|
||||
"@allRooms": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@obtainingLocation": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -278,7 +270,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@widgetVideo": {},
|
||||
"@dismiss": {},
|
||||
"@unknownDevice": {
|
||||
"type": "String",
|
||||
|
|
@ -297,10 +288,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setPermissionsLevel": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@inviteContactToGroup": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -318,7 +305,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@chatHasBeenAddedToThisSpace": {},
|
||||
"@reply": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -344,7 +330,6 @@
|
|||
"type": "String",
|
||||
"description": "Usage hint for the command /html"
|
||||
},
|
||||
"@widgetJitsi": {},
|
||||
"@youAreNoLongerParticipatingInThisChat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -354,12 +339,7 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@messageType": {},
|
||||
"@indexedDbErrorLong": {},
|
||||
"@oneClientLoggedOut": {},
|
||||
"@toggleMuted": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@unsupportedAndroidVersionLong": {},
|
||||
"@kicked": {
|
||||
"type": "String",
|
||||
|
|
@ -401,8 +381,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@startFirstChat": {},
|
||||
"@callingAccount": {},
|
||||
"@requestPermission": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -431,15 +409,10 @@
|
|||
}
|
||||
},
|
||||
"@setColorTheme": {},
|
||||
"@nextAccount": {},
|
||||
"@commandHint_create": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /create"
|
||||
},
|
||||
"@singlesignon": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@warning": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -529,7 +502,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@widgetEtherpad": {},
|
||||
"@waitingPartnerAcceptRequest": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -566,10 +538,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@separateChatTypes": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@tryAgain": {},
|
||||
"@blocked": {
|
||||
"type": "String",
|
||||
|
|
@ -582,21 +550,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@dateWithoutYear": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"month": {
|
||||
"type": "String"
|
||||
},
|
||||
"day": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@removeDevice": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@unbanUserDescription": {},
|
||||
"@userAndUserAreTyping": {
|
||||
"type": "String",
|
||||
|
|
@ -622,7 +575,6 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@youRejectedTheInvitation": {},
|
||||
"@otherCallingPermissions": {},
|
||||
"@messagesStyle": {},
|
||||
"@couldNotDecryptMessage": {
|
||||
"type": "String",
|
||||
|
|
@ -637,11 +589,8 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@link": {},
|
||||
"@widgetUrlError": {},
|
||||
"@emailOrUsername": {},
|
||||
"@newSpaceDescription": {},
|
||||
"@chatDescription": {},
|
||||
"@callingAccountDetails": {},
|
||||
"@next": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -658,25 +607,10 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@dateWithYear": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"year": {
|
||||
"type": "String"
|
||||
},
|
||||
"month": {
|
||||
"type": "String"
|
||||
},
|
||||
"day": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@editRoomAliases": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@enterSpace": {},
|
||||
"@encryptThisChat": {},
|
||||
"@fileName": {
|
||||
"type": "String",
|
||||
|
|
@ -686,7 +620,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@previousAccount": {},
|
||||
"@publicRooms": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -703,25 +636,15 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@emoteWarnNeedToPick": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@reopenChat": {},
|
||||
"@pleaseEnterRecoveryKey": {},
|
||||
"@create": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@toggleFavorite": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@no": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@widgetNameError": {},
|
||||
"@inoffensive": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -739,7 +662,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@addWidget": {},
|
||||
"@removeAllOtherDevices": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -788,7 +710,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@hydrateTor": {},
|
||||
"@pushNotificationsNotAvailable": {},
|
||||
"@passwordRecovery": {
|
||||
"type": "String",
|
||||
|
|
@ -828,7 +749,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@signInWithPassword": {},
|
||||
"@ignoredUsers": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -889,10 +809,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@goToTheNewRoom": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@commandHint_clearcache": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /clearcache"
|
||||
|
|
@ -912,14 +828,6 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@whyIsThisMessageEncrypted": {},
|
||||
"@unreadChats": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"unreadCount": {
|
||||
"type": "int"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@rejectedTheInvitation": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -941,19 +849,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@toggleUnread": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@or": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@dehydrateWarning": {},
|
||||
"@sendOriginal": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@noOtherDevicesFound": {},
|
||||
"@whoIsAllowedToJoinThisGroup": {
|
||||
"type": "String",
|
||||
|
|
@ -963,14 +863,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@seenByUser": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@storeSecurlyOnThisDevice": {},
|
||||
"@yourChatBackupHasBeenSetUp": {},
|
||||
"@chatBackup": {
|
||||
|
|
@ -1030,18 +922,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@containsDisplayName": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@signInWith": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"provider": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@username": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1056,10 +936,6 @@
|
|||
},
|
||||
"@fileIsTooBigForServer": {},
|
||||
"@homeserver": {},
|
||||
"@people": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@changedTheHistoryVisibilityTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1091,7 +967,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@callingPermissions": {},
|
||||
"@newMessageInFluffyChat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1111,18 +986,6 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@unlockOldMessages": {},
|
||||
"@identity": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@numChats": {
|
||||
"type": "number",
|
||||
"placeholders": {
|
||||
"number": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@changedTheJoinRulesTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1210,10 +1073,6 @@
|
|||
"@sendAsText": {
|
||||
"type": "String"
|
||||
},
|
||||
"@inviteForMe": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@archiveRoomDescription": {},
|
||||
"@changedTheChatNameTo": {
|
||||
"type": "String",
|
||||
|
|
@ -1226,18 +1085,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@sendSticker": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@switchToAccount": {
|
||||
"type": "number",
|
||||
"placeholders": {
|
||||
"number": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@commandInvalid": {
|
||||
"type": "String"
|
||||
},
|
||||
|
|
@ -1308,7 +1155,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@inviteContactToGroupQuestion": {},
|
||||
"@emoteExists": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1347,12 +1193,10 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@appearOnTopDetails": {},
|
||||
"@roomHasBeenUpgraded": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@enterRoom": {},
|
||||
"@enableEmotesGlobally": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1402,17 +1246,6 @@
|
|||
}
|
||||
},
|
||||
"@confirmEventUnpin": {},
|
||||
"@badServerVersionsException": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"serverVersions": {
|
||||
"type": "String"
|
||||
},
|
||||
"supportedVersions": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@youInvitedUser": {
|
||||
"placeholders": {
|
||||
"user": {
|
||||
|
|
@ -1443,10 +1276,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@license": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@unbanFromChat": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1461,10 +1290,6 @@
|
|||
"description": "State that {command} is not a valid /command."
|
||||
},
|
||||
"@redactMessageDescription": {},
|
||||
"@rejoin": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@recoveryKey": {},
|
||||
"@redactMessage": {
|
||||
"type": "String",
|
||||
|
|
@ -1487,7 +1312,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@dehydrateTorLong": {},
|
||||
"@yourPublicKey": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1541,10 +1365,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@memberChanges": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@joinRoom": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1555,9 +1375,7 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@serverRequiresEmail": {},
|
||||
"@hideUnimportantStateEvents": {},
|
||||
"@screenSharingTitle": {},
|
||||
"@widgetCustom": {},
|
||||
"@sentCallInformations": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1566,7 +1384,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@addToSpaceDescription": {},
|
||||
"@youBannedUser": {
|
||||
"placeholders": {
|
||||
"user": {
|
||||
|
|
@ -1621,7 +1438,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@publish": {},
|
||||
"@openLinkInBrowser": {},
|
||||
"@clearArchive": {},
|
||||
"@commandHint_react": {
|
||||
|
|
@ -1664,8 +1480,6 @@
|
|||
"placeholders": {}
|
||||
},
|
||||
"@inviteGroupChat": {},
|
||||
"@appearOnTop": {},
|
||||
"@invitePrivateChat": {},
|
||||
"@verifyTitle": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1700,10 +1514,6 @@
|
|||
"type": "String",
|
||||
"description": "Usage hint for the command /ban"
|
||||
},
|
||||
"@confirm": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@wasDirectChatDisplayName": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1752,7 +1562,6 @@
|
|||
},
|
||||
"@newGroup": {},
|
||||
"@bundleName": {},
|
||||
"@dehydrateTor": {},
|
||||
"@removeFromSpace": {},
|
||||
"@dateAndTimeOfDay": {
|
||||
"type": "String",
|
||||
|
|
@ -1818,7 +1627,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@profileNotFound": {},
|
||||
"@jump": {},
|
||||
"@groups": {
|
||||
"type": "String",
|
||||
|
|
@ -1847,14 +1655,6 @@
|
|||
}
|
||||
},
|
||||
"@sorryThatsNotPossible": {},
|
||||
"@videoWithSize": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"size": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"@oopsSomethingWentWrong": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1870,10 +1670,6 @@
|
|||
"@shareInviteLink": {},
|
||||
"@commandHint_markasdm": {},
|
||||
"@recoveryKeyLost": {},
|
||||
"@containsUserName": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@messages": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1899,10 +1695,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setCustomEmotes": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@startedACall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1919,10 +1711,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@notificationsEnabledForThisAccount": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@deleteMessage": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -1935,20 +1723,11 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setTheme": {},
|
||||
"@changeTheHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@youJoinedTheChat": {},
|
||||
"@wallpaper": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@openVideoCamera": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@play": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1982,7 +1761,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@widgetName": {},
|
||||
"@sentASticker": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
@ -1991,7 +1769,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@errorAddingWidget": {},
|
||||
"@commandHint_dm": {
|
||||
"type": "String",
|
||||
"description": "Usage hint for the command /dm"
|
||||
|
|
@ -2061,15 +1838,10 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@pleaseChoose": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@share": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@pleaseTryAgainLaterOrChooseDifferentServer": {},
|
||||
"@createGroup": {},
|
||||
"@privacy": {
|
||||
"type": "String",
|
||||
|
|
@ -2083,16 +1855,7 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@hydrateTorLong": {},
|
||||
"@time": {},
|
||||
"@enterYourHomeserver": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@botMessages": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@contentHasBeenReported": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
|
|
@ -2122,10 +1885,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@setInvitationLink": {
|
||||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@pinMessage": {},
|
||||
"@screenSharingDetail": {},
|
||||
"@muteChat": {
|
||||
|
|
@ -2138,7 +1897,6 @@
|
|||
"type": "String",
|
||||
"placeholders": {}
|
||||
},
|
||||
"@indexedDbErrorTitle": {},
|
||||
"@endedTheCall": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
|
|||
5486
lib/l10n/intl_tr.arb
5486
lib/l10n/intl_tr.arb
File diff suppressed because it is too large
Load diff
5449
lib/l10n/intl_uk.arb
5449
lib/l10n/intl_uk.arb
File diff suppressed because it is too large
Load diff
5415
lib/l10n/intl_uz.arb
5415
lib/l10n/intl_uz.arb
File diff suppressed because it is too large
Load diff
1369
lib/l10n/intl_vi.arb
1369
lib/l10n/intl_vi.arb
File diff suppressed because it is too large
Load diff
|
|
@ -55,6 +55,18 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"changedTheChatDescriptionTo": "{username} 改咗呢個偈嘅介紹: 「'{description}'」",
|
||||
"@changedTheChatDescriptionTo": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
"username": {
|
||||
"type": "String"
|
||||
},
|
||||
"description": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
"addEmail": "加 Email",
|
||||
"@addEmail": {
|
||||
"type": "String",
|
||||
|
|
|
|||
5491
lib/l10n/intl_zh.arb
5491
lib/l10n/intl_zh.arb
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -462,21 +462,18 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
scrollUpBannerEventId = eventId;
|
||||
});
|
||||
|
||||
bool firstUpdateReceived = false;
|
||||
|
||||
void updateView() {
|
||||
if (!mounted) return;
|
||||
setReadMarker();
|
||||
setState(() {});
|
||||
setState(() {
|
||||
firstUpdateReceived = true;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void>? loadTimelineFuture;
|
||||
|
||||
int? animateInEventIndex;
|
||||
|
||||
void onInsert(int i) {
|
||||
// setState will be called by updateView() anyway
|
||||
if (timeline?.allowNewEvent == true) animateInEventIndex = i;
|
||||
}
|
||||
|
||||
Future<void> _getTimeline({String? eventContextId}) async {
|
||||
await Matrix.of(context).client.roomsLoading;
|
||||
await Matrix.of(context).client.accountDataLoading;
|
||||
|
|
@ -489,15 +486,11 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
timeline = await room.getTimeline(
|
||||
onUpdate: updateView,
|
||||
eventContextId: eventContextId,
|
||||
onInsert: onInsert,
|
||||
);
|
||||
} catch (e, s) {
|
||||
Logs().w('Unable to load timeline on event ID $eventContextId', e, s);
|
||||
if (!mounted) return;
|
||||
timeline = await room.getTimeline(
|
||||
onUpdate: updateView,
|
||||
onInsert: onInsert,
|
||||
);
|
||||
timeline = await room.getTimeline(onUpdate: updateView);
|
||||
if (!mounted) return;
|
||||
if (e is TimeoutException || e is IOException) {
|
||||
_showScrollUpMaterialBanner(eventContextId!);
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@ class ChatEventList extends StatelessWidget {
|
|||
final events = timeline.events.filterByVisibleInGui(
|
||||
threadId: controller.activeThreadId,
|
||||
);
|
||||
final animateInEventIndex = controller.animateInEventIndex;
|
||||
|
||||
// create a map of eventId --> index to greatly improve performance of
|
||||
// ListView's findChildIndexCallback
|
||||
|
|
@ -120,10 +119,7 @@ class ChatEventList extends StatelessWidget {
|
|||
|
||||
// The message at this index:
|
||||
final event = events[i];
|
||||
final animateIn =
|
||||
animateInEventIndex != null &&
|
||||
timeline.events.length > animateInEventIndex &&
|
||||
event == timeline.events[animateInEventIndex];
|
||||
final animateIn = i == 0 && controller.firstUpdateReceived;
|
||||
|
||||
final nextEvent = i + 1 < events.length ? events[i + 1] : null;
|
||||
final previousEvent = i > 0 ? events[i - 1] : null;
|
||||
|
|
@ -139,16 +135,13 @@ class ChatEventList extends StatelessWidget {
|
|||
!controller.expandedEventIds.contains(event.eventId);
|
||||
|
||||
return AutoScrollTag(
|
||||
key: ValueKey(event.eventId),
|
||||
key: ValueKey(event.transactionId ?? event.eventId),
|
||||
index: i,
|
||||
controller: controller.scrollController,
|
||||
child: Message(
|
||||
event,
|
||||
bigEmojis: controller.bigEmojis,
|
||||
animateIn: animateIn,
|
||||
resetAnimateIn: () {
|
||||
controller.animateInEventIndex = null;
|
||||
},
|
||||
onSwipe: () => controller.replyAction(replyTo: event),
|
||||
onInfoTab: controller.showEventInfo,
|
||||
onMention: () => controller.sendController.text +=
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:animations/animations.dart';
|
||||
import 'package:emoji_picker_flutter/locales/default_emoji_set_locale.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
|
|
@ -273,27 +272,11 @@ class ChatInputRow extends StatelessWidget {
|
|||
child: IconButton(
|
||||
tooltip: L10n.of(context).emojis,
|
||||
color: theme.colorScheme.onPrimaryContainer,
|
||||
icon: PageTransitionSwitcher(
|
||||
transitionBuilder:
|
||||
(
|
||||
Widget child,
|
||||
Animation<double> primaryAnimation,
|
||||
Animation<double> secondaryAnimation,
|
||||
) {
|
||||
return SharedAxisTransition(
|
||||
animation: primaryAnimation,
|
||||
secondaryAnimation: secondaryAnimation,
|
||||
transitionType: SharedAxisTransitionType.scaled,
|
||||
fillColor: Colors.transparent,
|
||||
child: child,
|
||||
);
|
||||
},
|
||||
child: Icon(
|
||||
controller.showEmojiPicker
|
||||
? Icons.keyboard
|
||||
: Icons.add_reaction_outlined,
|
||||
key: ValueKey(controller.showEmojiPicker),
|
||||
),
|
||||
icon: Icon(
|
||||
controller.showEmojiPicker
|
||||
? Icons.keyboard
|
||||
: Icons.add_reaction_outlined,
|
||||
key: ValueKey(controller.showEmojiPicker),
|
||||
),
|
||||
onPressed: controller.emojiPickerAction,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ import 'package:just_audio/just_audio.dart';
|
|||
import 'package:matrix/matrix.dart';
|
||||
import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/themes.dart';
|
||||
|
|
@ -166,11 +165,11 @@ class AudioPlayerState extends State<AudioPlayerWidget> {
|
|||
: null,
|
||||
);
|
||||
|
||||
if (!kIsWeb) {
|
||||
final attachmentUrl = widget.event.attachmentOrThumbnailMxcUrl();
|
||||
|
||||
if (!kIsWeb && attachmentUrl != null) {
|
||||
final tempDir = await getTemporaryDirectory();
|
||||
final fileName = Uri.encodeComponent(
|
||||
widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last,
|
||||
);
|
||||
final fileName = Uri.encodeComponent(attachmentUrl.pathSegments.last);
|
||||
file = File('${tempDir.path}/${fileName}_${matrixFile.name}');
|
||||
|
||||
await file.writeAsBytes(matrixFile.bytes);
|
||||
|
|
@ -203,12 +202,12 @@ class AudioPlayerState extends State<AudioPlayerWidget> {
|
|||
|
||||
if (file != null) {
|
||||
audioPlayer.setFilePath(file.path);
|
||||
} else if (kIsWeb) {
|
||||
final blob = html.Blob([matrixFile.bytes], 'audio/mpeg');
|
||||
final url = html.Url.createObjectUrlFromBlob(blob);
|
||||
await audioPlayer.setAudioSource(AudioSource.uri(Uri.parse(url)));
|
||||
} else {
|
||||
throw Exception('No audio file provided!');
|
||||
await audioPlayer.setAudioSource(
|
||||
AudioSource.uri(
|
||||
Uri.dataFromBytes(matrixFile.bytes, mimeType: matrixFile.mimeType),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
audioPlayer.play().onError(
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,8 +1,9 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:async/async.dart' show Result;
|
||||
import 'package:cross_file/cross_file.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:matrix/matrix.dart' hide Result;
|
||||
import 'package:mime/mime.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
|
|
@ -53,8 +54,9 @@ class SendFileDialogState extends State<SendFileDialog> {
|
|||
}
|
||||
scaffoldMessenger.showLoadingSnackBar(l10n.prepareSendingAttachment);
|
||||
Navigator.of(context, rootNavigator: false).pop();
|
||||
final clientConfig = await widget.room.client.getConfig();
|
||||
final maxUploadSize = clientConfig.mUploadSize ?? 100 * 1000 * 1000;
|
||||
final clientConfig = await Result.capture(widget.room.client.getConfig());
|
||||
final maxUploadSize =
|
||||
clientConfig.asValue?.value.mUploadSize ?? 100 * 1000 * 1000;
|
||||
|
||||
for (final xfile in widget.files) {
|
||||
final MatrixFile file;
|
||||
|
|
|
|||
|
|
@ -1,16 +1,18 @@
|
|||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'package:app_links/app_links.dart';
|
||||
import 'package:cross_file/cross_file.dart';
|
||||
import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:matrix/matrix.dart' as sdk;
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pages/chat_list/chat_list_view.dart';
|
||||
import 'package:fluffychat/utils/localized_exception_extension.dart';
|
||||
|
|
@ -71,8 +73,6 @@ class ChatListController extends State<ChatList>
|
|||
|
||||
StreamSubscription? _intentFileStreamSubscription;
|
||||
|
||||
StreamSubscription? _intentUriStreamSubscription;
|
||||
|
||||
late ActiveFilter activeFilter;
|
||||
|
||||
String? _activeSpaceId;
|
||||
|
|
@ -308,6 +308,12 @@ class ChatListController extends State<ChatList>
|
|||
void _processIncomingSharedMedia(List<SharedMediaFile> files) {
|
||||
if (files.isEmpty) return;
|
||||
|
||||
if (files.singleOrNull?.path.startsWith(AppConfig.deepLinkPrefix) == true) {
|
||||
return;
|
||||
}
|
||||
|
||||
inspect(files);
|
||||
|
||||
showScaffoldDialog(
|
||||
context: context,
|
||||
builder: (context) => ShareScaffoldDialog(
|
||||
|
|
@ -326,14 +332,6 @@ class ChatListController extends State<ChatList>
|
|||
);
|
||||
}
|
||||
|
||||
Future<void> _processIncomingUris(Uri? uri) async {
|
||||
if (uri == null) return;
|
||||
context.go('/rooms');
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
UrlLauncher(context, uri.toString()).openMatrixToUrl();
|
||||
});
|
||||
}
|
||||
|
||||
void _initReceiveSharingIntent() {
|
||||
if (!PlatformInfos.isMobile) return;
|
||||
|
||||
|
|
@ -347,11 +345,6 @@ class ChatListController extends State<ChatList>
|
|||
_processIncomingSharedMedia,
|
||||
);
|
||||
|
||||
// For receiving shared Uris
|
||||
_intentUriStreamSubscription = AppLinks().uriLinkStream.listen(
|
||||
_processIncomingUris,
|
||||
);
|
||||
|
||||
if (PlatformInfos.isAndroid) {
|
||||
final shortcuts = FlutterShortcuts();
|
||||
shortcuts.initialize().then(
|
||||
|
|
@ -374,6 +367,7 @@ class ChatListController extends State<ChatList>
|
|||
_hackyWebRTCFixForWeb();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (mounted) {
|
||||
_showLastSeenSupportBanner();
|
||||
searchServer = Matrix.of(
|
||||
context,
|
||||
).store.getString(_serverStoreNamespace);
|
||||
|
|
@ -394,11 +388,86 @@ class ChatListController extends State<ChatList>
|
|||
void dispose() {
|
||||
_intentDataStreamSubscription?.cancel();
|
||||
_intentFileStreamSubscription?.cancel();
|
||||
_intentUriStreamSubscription?.cancel();
|
||||
scrollController.removeListener(_onScroll);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Future<void> _showLastSeenSupportBanner() async {
|
||||
if (AppSettings.supportBannerOptOut.value) return;
|
||||
|
||||
if (AppSettings.lastSeenSupportBanner.value == 0) {
|
||||
await AppSettings.lastSeenSupportBanner.setItem(
|
||||
DateTime.now().millisecondsSinceEpoch,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
final lastSeenSupportBanner = DateTime.fromMillisecondsSinceEpoch(
|
||||
AppSettings.lastSeenSupportBanner.value,
|
||||
);
|
||||
|
||||
if (DateTime.now().difference(lastSeenSupportBanner) >=
|
||||
Duration(days: 6 * 7)) {
|
||||
final theme = Theme.of(context);
|
||||
final messenger = ScaffoldMessenger.of(context);
|
||||
messenger.showMaterialBanner(
|
||||
MaterialBanner(
|
||||
backgroundColor: theme.colorScheme.errorContainer,
|
||||
leading: CloseButton(
|
||||
color: theme.colorScheme.onErrorContainer,
|
||||
onPressed: () async {
|
||||
final okCancelResult = await showOkCancelAlertDialog(
|
||||
context: context,
|
||||
title: L10n.of(context).skipSupportingFluffyChat,
|
||||
message: L10n.of(context).fluffyChatSupportBannerMessage,
|
||||
okLabel: L10n.of(context).iDoNotWantToSupport,
|
||||
cancelLabel: L10n.of(context).iAlreadySupportFluffyChat,
|
||||
isDestructive: true,
|
||||
);
|
||||
switch (okCancelResult) {
|
||||
case null:
|
||||
return;
|
||||
case OkCancelResult.ok:
|
||||
messenger.clearMaterialBanners();
|
||||
return;
|
||||
case OkCancelResult.cancel:
|
||||
messenger.clearMaterialBanners();
|
||||
await AppSettings.supportBannerOptOut.setItem(true);
|
||||
return;
|
||||
}
|
||||
},
|
||||
),
|
||||
content: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: Text(
|
||||
L10n.of(context).fluffyChatSupportBannerMessage,
|
||||
style: TextStyle(color: theme.colorScheme.onErrorContainer),
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
messenger.clearMaterialBanners();
|
||||
launchUrlString(
|
||||
'https://fluffychat.im/faq/#how_can_i_support_fluffychat',
|
||||
);
|
||||
},
|
||||
child: Text(
|
||||
L10n.of(context).support,
|
||||
style: TextStyle(color: theme.colorScheme.onErrorContainer),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
await AppSettings.lastSeenSupportBanner.setItem(
|
||||
DateTime.now().millisecondsSinceEpoch,
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Future<void> chatContextAction(
|
||||
Room room,
|
||||
BuildContext posContext, [
|
||||
|
|
@ -509,23 +578,44 @@ class ChatListController extends State<ChatList>
|
|||
],
|
||||
),
|
||||
),
|
||||
PopupMenuItem(
|
||||
value: ChatContextAction.favorite,
|
||||
child: Row(
|
||||
mainAxisSize: .min,
|
||||
children: [
|
||||
Icon(
|
||||
room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined,
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Text(
|
||||
room.isFavourite
|
||||
? L10n.of(context).unpin
|
||||
: L10n.of(context).pin,
|
||||
),
|
||||
],
|
||||
if (!room.isLowPriority)
|
||||
PopupMenuItem(
|
||||
value: ChatContextAction.favorite,
|
||||
child: Row(
|
||||
mainAxisSize: .min,
|
||||
children: [
|
||||
Icon(
|
||||
room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined,
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Text(
|
||||
room.isFavourite
|
||||
? L10n.of(context).unpin
|
||||
: L10n.of(context).pin,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
if (!room.isFavourite)
|
||||
PopupMenuItem(
|
||||
value: ChatContextAction.lowPriority,
|
||||
child: Row(
|
||||
mainAxisSize: .min,
|
||||
children: [
|
||||
Icon(
|
||||
room.isLowPriority
|
||||
? Icons.low_priority
|
||||
: Icons.low_priority_outlined,
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Text(
|
||||
room.isLowPriority
|
||||
? L10n.of(context).unsetLowPriority
|
||||
: L10n.of(context).setLowPriority,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
if (spacesWithPowerLevels.isNotEmpty)
|
||||
PopupMenuItem(
|
||||
value: ChatContextAction.addToSpace,
|
||||
|
|
@ -659,6 +749,12 @@ class ChatListController extends State<ChatList>
|
|||
context: context,
|
||||
future: () => space.setSpaceChild(room.id),
|
||||
);
|
||||
case ChatContextAction.lowPriority:
|
||||
await showFutureLoadingDialog(
|
||||
context: context,
|
||||
future: () => room.setLowPriority(!room.isLowPriority),
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -868,6 +964,7 @@ enum ChatContextAction {
|
|||
open,
|
||||
goToSpace,
|
||||
favorite,
|
||||
lowPriority,
|
||||
markUnread,
|
||||
mute,
|
||||
leave,
|
||||
|
|
|
|||
|
|
@ -191,6 +191,17 @@ class ChatListItem extends StatelessWidget {
|
|||
padding: EdgeInsets.only(left: 4.0),
|
||||
child: Icon(Icons.notifications_off_outlined, size: 16),
|
||||
),
|
||||
if (room.isLowPriority)
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
right: hasNotifications ? 4.0 : 0.0,
|
||||
),
|
||||
child: Icon(
|
||||
Icons.low_priority,
|
||||
size: 16,
|
||||
color: theme.colorScheme.primary,
|
||||
),
|
||||
),
|
||||
if (room.isFavourite)
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import 'package:go_router/go_router.dart';
|
|||
import 'package:matrix/matrix.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/themes.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
|
||||
|
|
@ -69,17 +68,6 @@ class ClientChooserButton extends StatelessWidget {
|
|||
],
|
||||
),
|
||||
),
|
||||
if (Matrix.of(context).backgroundPush?.firebaseEnabled != true)
|
||||
PopupMenuItem(
|
||||
value: SettingsAction.support,
|
||||
child: Row(
|
||||
children: [
|
||||
const Icon(Icons.favorite, color: Colors.red),
|
||||
const SizedBox(width: 18),
|
||||
Text(L10n.of(context).donate),
|
||||
],
|
||||
),
|
||||
),
|
||||
PopupMenuItem(
|
||||
value: SettingsAction.settings,
|
||||
child: Row(
|
||||
|
|
@ -90,6 +78,16 @@ class ClientChooserButton extends StatelessWidget {
|
|||
],
|
||||
),
|
||||
),
|
||||
PopupMenuItem(
|
||||
value: SettingsAction.support,
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(Icons.favorite, color: Colors.red),
|
||||
const SizedBox(width: 18),
|
||||
Text(L10n.of(context).supportFluffyChat),
|
||||
],
|
||||
),
|
||||
),
|
||||
const PopupMenuDivider(),
|
||||
for (final bundle in bundles) ...[
|
||||
if (matrix.accountBundles[bundle]!.length != 1 ||
|
||||
|
|
@ -224,7 +222,9 @@ class ClientChooserButton extends StatelessWidget {
|
|||
FluffyShare.shareInviteLink(context);
|
||||
break;
|
||||
case SettingsAction.support:
|
||||
launchUrlString(AppConfig.donationUrl);
|
||||
launchUrlString(
|
||||
'https://fluffychat.im/faq/#how_can_i_support_fluffychat',
|
||||
);
|
||||
break;
|
||||
case SettingsAction.settings:
|
||||
context.go('/rooms/settings');
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import 'package:flutter/material.dart';
|
|||
import 'package:chewie/chewie.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
import 'package:video_player/video_player.dart';
|
||||
|
||||
import 'package:fluffychat/utils/localized_exception_extension.dart';
|
||||
|
|
@ -64,9 +63,9 @@ class EventVideoPlayerState extends State<EventVideoPlayer> {
|
|||
|
||||
// Create the VideoPlayerController from the contents of videoFile.
|
||||
if (kIsWeb) {
|
||||
final blob = html.Blob([videoFile.bytes], videoFile.mimeType);
|
||||
final networkUri = Uri.parse(html.Url.createObjectUrlFromBlob(blob));
|
||||
videoPlayerController = VideoPlayerController.networkUrl(networkUri);
|
||||
videoPlayerController = VideoPlayerController.networkUrl(
|
||||
Uri.dataFromBytes(videoFile.bytes, mimeType: videoFile.mimeType),
|
||||
);
|
||||
} else {
|
||||
final tempDir = await getTemporaryDirectory();
|
||||
final fileName = Uri.encodeComponent(
|
||||
|
|
|
|||
|
|
@ -2,10 +2,9 @@ import 'package:flutter/material.dart';
|
|||
|
||||
import 'package:flutter_linkify/flutter_linkify.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/setting_keys.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pages/intro/flows/restore_backup_flow.dart';
|
||||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
|
|
@ -58,7 +57,7 @@ class IntroPage extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
PopupMenuItem(
|
||||
onTap: () => launchUrl(AppConfig.privacyUrl),
|
||||
onTap: () => launchUrlString(AppSettings.privacyPolicy.value),
|
||||
child: Row(
|
||||
mainAxisSize: .min,
|
||||
children: [
|
||||
|
|
@ -69,7 +68,7 @@ class IntroPage extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
PopupMenuItem(
|
||||
value: () => PlatformInfos.showDialog(context),
|
||||
onTap: () => PlatformInfos.showDialog(context),
|
||||
child: Row(
|
||||
mainAxisSize: .min,
|
||||
children: [
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ class _IntroPagePresenterState extends State<IntroPagePresenter> {
|
|||
final client = await Matrix.of(context).getLoginClient();
|
||||
await client.checkHomeserver(homeserverUrl);
|
||||
await client.oidcLogin(session: session, code: code, state: state);
|
||||
if (context.mounted) context.go('/backup');
|
||||
} catch (e, s) {
|
||||
Logs().w('Unable to login via OIDC', e, s);
|
||||
if (mounted) {
|
||||
|
|
|
|||
|
|
@ -191,10 +191,9 @@ class _InviteContactListTile extends StatelessWidget {
|
|||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: theme.colorScheme.secondary),
|
||||
),
|
||||
trailing: TextButton.icon(
|
||||
trailing: TextButton(
|
||||
onPressed: isMember ? null : onTap,
|
||||
label: Text(isMember ? l10n.participant : l10n.invite),
|
||||
icon: Icon(isMember ? Icons.check : Icons.add),
|
||||
child: Text(isMember ? l10n.participant : l10n.invite),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@ import 'package:fluffychat/widgets/matrix.dart';
|
|||
import '../../widgets/adaptive_dialogs/user_dialog.dart';
|
||||
|
||||
class NewPrivateChat extends StatefulWidget {
|
||||
const NewPrivateChat({super.key});
|
||||
final String? deeplink;
|
||||
const NewPrivateChat({super.key, required this.deeplink});
|
||||
|
||||
@override
|
||||
NewPrivateChatController createState() => NewPrivateChatController();
|
||||
|
|
@ -33,6 +34,18 @@ class NewPrivateChatController extends State<NewPrivateChat> {
|
|||
|
||||
static const Duration _coolDown = Duration(milliseconds: 500);
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
final deeplink = widget.deeplink;
|
||||
if (deeplink != null) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
UrlLauncher(context, deeplink).openMatrixToUrl();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> searchUsers([String? input]) async {
|
||||
final searchTerm = input ?? controller.text;
|
||||
if (searchTerm.isEmpty) {
|
||||
|
|
|
|||
|
|
@ -3,8 +3,9 @@ import 'package:flutter/material.dart';
|
|||
import 'package:go_router/go_router.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/setting_keys.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/utils/fluffy_share.dart';
|
||||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
|
|
@ -200,7 +201,7 @@ class SettingsView extends StatelessWidget {
|
|||
ListTile(
|
||||
leading: const Icon(Icons.privacy_tip_outlined),
|
||||
title: Text(L10n.of(context).privacy),
|
||||
onTap: () => launchUrl(AppConfig.privacyUrl),
|
||||
onTap: () => launchUrlString(AppSettings.privacyPolicy.value),
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.info_outline_rounded),
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
|||
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/setting_keys.dart';
|
||||
import 'package:fluffychat/utils/account_config.dart';
|
||||
import 'package:fluffychat/utils/file_selector.dart';
|
||||
|
|
@ -111,32 +110,6 @@ class SettingsStyleController extends State<SettingsStyle> {
|
|||
ThemeMode get currentTheme => ThemeController.of(context).themeMode;
|
||||
Color? get currentColor => ThemeController.of(context).primaryColor;
|
||||
|
||||
static final List<Color?> customColors = [
|
||||
null,
|
||||
AppConfig.chatColor,
|
||||
Colors.indigo,
|
||||
Colors.blue,
|
||||
Colors.blueAccent,
|
||||
Colors.teal,
|
||||
Colors.tealAccent,
|
||||
Colors.green,
|
||||
Colors.greenAccent,
|
||||
Colors.yellow,
|
||||
Colors.yellowAccent,
|
||||
Colors.orange,
|
||||
Colors.orangeAccent,
|
||||
Colors.red,
|
||||
Colors.redAccent,
|
||||
Colors.pink,
|
||||
Colors.pinkAccent,
|
||||
Colors.purple,
|
||||
Colors.purpleAccent,
|
||||
Colors.blueGrey,
|
||||
Colors.grey,
|
||||
Colors.white,
|
||||
Colors.black,
|
||||
];
|
||||
|
||||
void switchTheme(ThemeMode? newTheme) {
|
||||
if (newTheme == null) return;
|
||||
switch (newTheme) {
|
||||
|
|
|
|||
|
|
@ -82,14 +82,13 @@ class SettingsStyleView extends StatelessWidget {
|
|||
Theme.of(context).brightness == Brightness.light
|
||||
? light?.primary
|
||||
: dark?.primary;
|
||||
final colors = List<Color?>.from(
|
||||
SettingsStyleController.customColors,
|
||||
);
|
||||
final colors = [null, AppConfig.chatColor, ...Colors.primaries];
|
||||
if (systemColor == null) {
|
||||
colors.remove(null);
|
||||
}
|
||||
return GridView.builder(
|
||||
shrinkWrap: true,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
|
||||
maxCrossAxisExtent: 64,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -98,19 +98,11 @@ class SignInPage extends StatelessWidget {
|
|||
final website = server.website;
|
||||
return Semantics(
|
||||
identifier: 'homeserver_tile_$i',
|
||||
child: RadioListTile.adaptive(
|
||||
child: RadioListTile(
|
||||
value: server,
|
||||
enabled:
|
||||
state.loginLoading.connectionState !=
|
||||
ConnectionState.waiting,
|
||||
radioScaleFactor:
|
||||
FluffyThemes.isColumnMode(context) ||
|
||||
{
|
||||
TargetPlatform.iOS,
|
||||
TargetPlatform.macOS,
|
||||
}.contains(theme.platform)
|
||||
? 2
|
||||
: 1,
|
||||
title: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
|
|
|
|||
|
|
@ -1,24 +0,0 @@
|
|||
import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart';
|
||||
|
||||
int sortHomeservers(PublicHomeserverData a, PublicHomeserverData b) {
|
||||
return _calcHomeserverScore(b).compareTo(_calcHomeserverScore(a));
|
||||
}
|
||||
|
||||
int _calcHomeserverScore(PublicHomeserverData homeserver) {
|
||||
var score = 0;
|
||||
if (homeserver.description?.isNotEmpty == true) score++;
|
||||
if (homeserver.website?.isNotEmpty == true) score++;
|
||||
score += (homeserver.languages?.length ?? 0);
|
||||
score += (homeserver.features?.length ?? 0);
|
||||
score += (homeserver.onlineStatus ?? 0);
|
||||
if (homeserver.ipv6 == true) score++;
|
||||
if (homeserver.isp?.isNotEmpty == true) score++;
|
||||
if (homeserver.privacy?.isNotEmpty == true) score++;
|
||||
if (homeserver.rules?.isNotEmpty == true) score++;
|
||||
if (homeserver.version?.isNotEmpty == true) score++;
|
||||
if (homeserver.usingVanillaReg == true) score--;
|
||||
if (homeserver.regLink != null) score--;
|
||||
if (homeserver.regMethod != 'SSO') score--;
|
||||
if (homeserver.regMethod == 'In-house Element') score--;
|
||||
return score;
|
||||
}
|
||||
|
|
@ -7,7 +7,6 @@ import 'package:matrix/matrix_api_lite/utils/logs.dart';
|
|||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/setting_keys.dart';
|
||||
import 'package:fluffychat/pages/sign_in/utils/sort_homeservers.dart';
|
||||
import 'package:fluffychat/pages/sign_in/view_model/model/public_homeserver_data.dart';
|
||||
import 'package:fluffychat/pages/sign_in/view_model/sign_in_state.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
|
|
@ -39,7 +38,9 @@ class SignInViewModel extends ValueNotifier<SignInState> {
|
|||
)
|
||||
.toList() ??
|
||||
[];
|
||||
if (Uri.tryParse(filterText) != null &&
|
||||
if (filterText.length >= 3 &&
|
||||
(filterText.contains('.') || filterText == 'localhost') &&
|
||||
Uri.tryParse(filterText) != null &&
|
||||
!filteredPublicHomeservers.any(
|
||||
(homeserver) => homeserver.name == filterText,
|
||||
)) {
|
||||
|
|
@ -72,8 +73,6 @@ class SignInViewModel extends ValueNotifier<SignInState> {
|
|||
});
|
||||
}
|
||||
|
||||
publicHomeservers.sort(sortHomeservers);
|
||||
|
||||
final defaultServer = publicHomeservers.singleWhereOrNull(
|
||||
(server) => server.name == AppSettings.defaultHomeserver.value,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -123,7 +123,9 @@ abstract class ClientManager {
|
|||
// To make room emotes work
|
||||
'im.ponies.room_emotes',
|
||||
},
|
||||
customImageResizer: customImageResizer,
|
||||
customImageResizer: PlatformInfos.supportsCustomImageResizer
|
||||
? customImageResizer
|
||||
: null,
|
||||
logLevel: kReleaseMode ? Level.warning : Level.verbose,
|
||||
database: await flutterMatrixSdkDatabaseBuilder(clientName),
|
||||
supportedLoginTypes: {
|
||||
|
|
@ -141,6 +143,9 @@ abstract class ClientManager {
|
|||
onSoftLogout: enableSoftLogout
|
||||
? (client) => client.refreshAccessToken()
|
||||
: null,
|
||||
sendTimelineEventTimeout: Duration(
|
||||
seconds: AppSettings.sendTimelineEventTimeout.value,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,10 +9,7 @@ import 'package:go_router/go_router.dart';
|
|||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/utils/client_download_content_extension.dart';
|
||||
import 'package:fluffychat/utils/client_manager.dart';
|
||||
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
|
||||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
import 'package:fluffychat/utils/push_helper.dart';
|
||||
import '../config/app_config.dart';
|
||||
import '../config/setting_keys.dart';
|
||||
|
|
@ -172,91 +169,15 @@ Future<void> notificationTap(
|
|||
);
|
||||
}
|
||||
|
||||
final eventId = await room.sendTextEvent(
|
||||
await room.sendTextEvent(
|
||||
input,
|
||||
parseCommands: false,
|
||||
displayPendingEvent: false,
|
||||
);
|
||||
|
||||
if (PlatformInfos.isAndroid) {
|
||||
final ownProfile = await room.client.fetchOwnProfile();
|
||||
final avatar = ownProfile.avatarUrl;
|
||||
final avatarFile = avatar == null
|
||||
? null
|
||||
: await client
|
||||
.downloadMxcCached(
|
||||
avatar,
|
||||
thumbnailMethod: ThumbnailMethod.crop,
|
||||
width: notificationAvatarDimension,
|
||||
height: notificationAvatarDimension,
|
||||
animated: false,
|
||||
isThumbnail: true,
|
||||
rounded: true,
|
||||
)
|
||||
.timeout(const Duration(seconds: 3));
|
||||
final messagingStyleInformation =
|
||||
await AndroidFlutterLocalNotificationsPlugin()
|
||||
.getActiveNotificationMessagingStyle(id: room.id.hashCode);
|
||||
if (messagingStyleInformation == null) return;
|
||||
l10n ??= await lookupL10n(PlatformDispatcher.instance.locale);
|
||||
messagingStyleInformation.messages?.add(
|
||||
Message(
|
||||
input,
|
||||
DateTime.now(),
|
||||
Person(
|
||||
key: room.client.userID,
|
||||
name: l10n.you,
|
||||
icon: avatarFile == null
|
||||
? null
|
||||
: ByteArrayAndroidIcon(avatarFile),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
await FlutterLocalNotificationsPlugin().show(
|
||||
id: room.id.hashCode,
|
||||
title: room.getLocalizedDisplayname(MatrixLocals(l10n)),
|
||||
body: input,
|
||||
notificationDetails: NotificationDetails(
|
||||
android: AndroidNotificationDetails(
|
||||
AppConfig.pushNotificationsChannelId,
|
||||
l10n.incomingMessages,
|
||||
category: AndroidNotificationCategory.message,
|
||||
shortcutId: room.id,
|
||||
styleInformation: messagingStyleInformation,
|
||||
groupKey: room.id,
|
||||
playSound: false,
|
||||
enableVibration: false,
|
||||
actions: <AndroidNotificationAction>[
|
||||
AndroidNotificationAction(
|
||||
FluffyChatNotificationActions.reply.name,
|
||||
l10n.reply,
|
||||
inputs: [
|
||||
AndroidNotificationActionInput(
|
||||
label: l10n.writeAMessage,
|
||||
),
|
||||
],
|
||||
cancelNotification: false,
|
||||
allowGeneratedReplies: true,
|
||||
semanticAction: SemanticAction.reply,
|
||||
),
|
||||
AndroidNotificationAction(
|
||||
FluffyChatNotificationActions.markAsRead.name,
|
||||
l10n.markAsRead,
|
||||
semanticAction: SemanticAction.markAsRead,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
payload: FluffyChatPushPayload(
|
||||
client.clientName,
|
||||
room.id,
|
||||
eventId,
|
||||
).toString(),
|
||||
);
|
||||
}
|
||||
case FluffyChatNotificationActions.mute:
|
||||
await room.setPushRuleState(PushRuleState.mentionsOnly);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum FluffyChatNotificationActions { markAsRead, reply }
|
||||
enum FluffyChatNotificationActions { markAsRead, reply, mute }
|
||||
|
|
|
|||
|
|
@ -33,6 +33,9 @@ abstract class PlatformInfos {
|
|||
static bool get supportsVideoPlayer =>
|
||||
!PlatformInfos.isWindows && !PlatformInfos.isLinux;
|
||||
|
||||
static bool get supportsCustomImageResizer =>
|
||||
PlatformInfos.isWeb || PlatformInfos.isMobile;
|
||||
|
||||
/// Web could also record in theory but currently only wav which is too large
|
||||
static bool get platformCanRecord => (isMobile || isMacOS || isWeb);
|
||||
|
||||
|
|
|
|||
|
|
@ -162,43 +162,15 @@ Future<void> _tryPushHelper(
|
|||
? avatar
|
||||
: event.senderFromMemoryOrFallback.avatarUrl;
|
||||
|
||||
Uint8List? roomAvatarFile, senderAvatarFile;
|
||||
try {
|
||||
roomAvatarFile = avatar == null
|
||||
? null
|
||||
: await client
|
||||
.downloadMxcCached(
|
||||
avatar,
|
||||
thumbnailMethod: ThumbnailMethod.crop,
|
||||
width: notificationAvatarDimension,
|
||||
height: notificationAvatarDimension,
|
||||
animated: false,
|
||||
isThumbnail: true,
|
||||
rounded: true,
|
||||
)
|
||||
.timeout(const Duration(seconds: 3));
|
||||
} catch (e, s) {
|
||||
Logs().e('Unable to get avatar picture', e, s);
|
||||
}
|
||||
try {
|
||||
senderAvatarFile = event.room.isDirectChat
|
||||
? roomAvatarFile
|
||||
: senderAvatar == null
|
||||
? null
|
||||
: await client
|
||||
.downloadMxcCached(
|
||||
senderAvatar,
|
||||
thumbnailMethod: ThumbnailMethod.crop,
|
||||
width: notificationAvatarDimension,
|
||||
height: notificationAvatarDimension,
|
||||
animated: false,
|
||||
isThumbnail: true,
|
||||
rounded: true,
|
||||
)
|
||||
.timeout(const Duration(seconds: 3));
|
||||
} catch (e, s) {
|
||||
Logs().e('Unable to get avatar picture', e, s);
|
||||
}
|
||||
final ownUser = event.room.unsafeGetUserFromMemoryOrFallback(client.userID!);
|
||||
|
||||
final userAvatarFile = await client.tryDownloadNotificationAvatar(
|
||||
ownUser.avatarUrl,
|
||||
);
|
||||
final roomAvatarFile = await client.tryDownloadNotificationAvatar(avatar);
|
||||
final senderAvatarFile = await client.tryDownloadNotificationAvatar(
|
||||
senderAvatar,
|
||||
);
|
||||
|
||||
final id = notification.roomId.hashCode;
|
||||
|
||||
|
|
@ -262,12 +234,11 @@ Future<void> _tryPushHelper(
|
|||
messagingStyleInformation ??
|
||||
MessagingStyleInformation(
|
||||
Person(
|
||||
name: senderName,
|
||||
icon: roomAvatarFile == null
|
||||
name: ownUser.calcDisplayname(),
|
||||
icon: userAvatarFile == null
|
||||
? null
|
||||
: ByteArrayAndroidIcon(roomAvatarFile),
|
||||
key: event.roomId,
|
||||
important: event.room.isFavourite,
|
||||
: ByteArrayAndroidIcon(userAvatarFile),
|
||||
key: event.room.client.userID,
|
||||
),
|
||||
conversationTitle: event.room.isDirectChat ? null : roomName,
|
||||
groupConversation: !event.room.isDirectChat,
|
||||
|
|
@ -293,7 +264,6 @@ Future<void> _tryPushHelper(
|
|||
inputs: [
|
||||
AndroidNotificationActionInput(label: l10n.writeAMessage),
|
||||
],
|
||||
cancelNotification: false,
|
||||
allowGeneratedReplies: true,
|
||||
semanticAction: SemanticAction.reply,
|
||||
),
|
||||
|
|
@ -302,6 +272,11 @@ Future<void> _tryPushHelper(
|
|||
l10n.markAsRead,
|
||||
semanticAction: SemanticAction.markAsRead,
|
||||
),
|
||||
AndroidNotificationAction(
|
||||
FluffyChatNotificationActions.mute.name,
|
||||
l10n.mute,
|
||||
semanticAction: SemanticAction.mute,
|
||||
),
|
||||
],
|
||||
);
|
||||
const iOSPlatformChannelSpecifics = DarwinNotificationDetails();
|
||||
|
|
@ -372,3 +347,23 @@ Future<void> _setShortcut(
|
|||
),
|
||||
);
|
||||
}
|
||||
|
||||
extension on Client {
|
||||
Future<Uint8List?> tryDownloadNotificationAvatar(Uri? avatar) async {
|
||||
if (avatar == null) return null;
|
||||
try {
|
||||
return await downloadMxcCached(
|
||||
avatar,
|
||||
thumbnailMethod: ThumbnailMethod.crop,
|
||||
width: notificationAvatarDimension,
|
||||
height: notificationAvatarDimension,
|
||||
animated: false,
|
||||
isThumbnail: true,
|
||||
rounded: true,
|
||||
).timeout(const Duration(seconds: 3));
|
||||
} catch (e, s) {
|
||||
Logs().e('Unable to get avatar picture', e, s);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
27
lib/utils/sign_in_flows/calc_redirect_url.dart
Normal file
27
lib/utils/sign_in_flows/calc_redirect_url.dart
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
|
||||
(Uri redirectUrl, String urlScheme) calcRedirectUrl({
|
||||
bool withAuthHtmlPath = false,
|
||||
}) {
|
||||
var redirectUrl = kIsWeb
|
||||
? Uri.parse(html.window.location.href.split('#').first.split('?').first)
|
||||
: (PlatformInfos.isMobile || PlatformInfos.isMacOS)
|
||||
? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login')
|
||||
: Uri.parse('http://localhost:3001/login');
|
||||
|
||||
if (kIsWeb && withAuthHtmlPath) {
|
||||
redirectUrl = redirectUrl.resolveUri(Uri(pathSegments: ['auth.html']));
|
||||
}
|
||||
|
||||
final urlScheme =
|
||||
(PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
|
||||
? redirectUrl.scheme
|
||||
: 'http://localhost:3001';
|
||||
|
||||
return (redirectUrl, urlScheme);
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:url_launcher/url_launcher_string.dart';
|
||||
|
||||
import 'package:fluffychat/config/setting_keys.dart';
|
||||
|
|
@ -51,7 +52,7 @@ Future<void> connectToHomeserverFlow(
|
|||
if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) {
|
||||
await oidcLoginFlow(client, context, signUp);
|
||||
} else if (supportsSso) {
|
||||
await ssoLoginFlow(client, context, signUp);
|
||||
await ssoLoginFlow(client, context, signUp, loginFlows);
|
||||
} else {
|
||||
if (signUp && regLink != null) {
|
||||
await launchUrlString(regLink);
|
||||
|
|
@ -73,6 +74,7 @@ Future<void> connectToHomeserverFlow(
|
|||
context.go('/backup');
|
||||
}
|
||||
} catch (e, s) {
|
||||
Logs().w('Unable to login', e, s);
|
||||
setState(AsyncSnapshot.withError(ConnectionState.done, e, s));
|
||||
if (!context.mounted) return;
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
|
|
|
|||
|
|
@ -6,12 +6,11 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/config/setting_keys.dart';
|
||||
import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart';
|
||||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart';
|
||||
|
||||
Future<void> oidcLoginFlow(
|
||||
Client client,
|
||||
|
|
@ -19,24 +18,16 @@ Future<void> oidcLoginFlow(
|
|||
bool signUp,
|
||||
) async {
|
||||
Logs().i('Starting Matrix Native OIDC Flow...');
|
||||
final redirectUrl = kIsWeb
|
||||
? Uri.parse(html.window.location.href.split('#').first.split('?').first)
|
||||
: (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
|
||||
? Uri.parse('${AppConfig.appOpenUrlScheme.toLowerCase()}:/login')
|
||||
: Uri.parse('http://localhost:3001/login');
|
||||
|
||||
final urlScheme =
|
||||
(PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
|
||||
? redirectUrl.scheme
|
||||
: 'http://localhost:3001';
|
||||
final (redirectUrl, urlScheme) = calcRedirectUrl();
|
||||
|
||||
final clientUri = Uri.parse(AppConfig.website);
|
||||
final clientUri = Uri.parse(AppSettings.website.value);
|
||||
final supportWebPlatform =
|
||||
kIsWeb &&
|
||||
kReleaseMode &&
|
||||
redirectUrl.scheme == 'https' &&
|
||||
redirectUrl.host.contains(clientUri.host);
|
||||
if (!supportWebPlatform) {
|
||||
if (kIsWeb && !supportWebPlatform) {
|
||||
Logs().w(
|
||||
'OIDC Application Type web is not supported. Using native now. Please use this instance not in production!',
|
||||
);
|
||||
|
|
@ -50,9 +41,9 @@ Future<void> oidcLoginFlow(
|
|||
clientInformation: OidcClientInformation(
|
||||
clientName: AppSettings.applicationName.value,
|
||||
clientUri: clientUri,
|
||||
logoUri: Uri.parse('https://fluffy.chat/assets/favicon.png'),
|
||||
tosUri: null,
|
||||
policyUri: AppConfig.privacyUrl,
|
||||
logoUri: Uri.parse(AppSettings.logoUrl.value),
|
||||
tosUri: Uri.parse(AppSettings.tos.value),
|
||||
policyUri: Uri.parse(AppSettings.privacyPolicy.value),
|
||||
),
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,39 +1,60 @@
|
|||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
import 'package:universal_html/html.dart' as html;
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/utils/platform_infos.dart';
|
||||
import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart';
|
||||
import 'package:fluffychat/widgets/adaptive_dialogs/show_modal_action_popup.dart';
|
||||
|
||||
Future<void> ssoLoginFlow(
|
||||
Client client,
|
||||
BuildContext context,
|
||||
bool signUp,
|
||||
List<LoginFlow> loginFlows,
|
||||
) async {
|
||||
Logs().i('Starting legacy SSO Flow...');
|
||||
final redirectUrl = kIsWeb
|
||||
? Uri.parse(
|
||||
html.window.location.href,
|
||||
).resolveUri(Uri(pathSegments: ['auth.html'])).toString()
|
||||
: (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
|
||||
? '${AppConfig.appOpenUrlScheme.toLowerCase()}://login'
|
||||
: 'http://localhost:3001//login';
|
||||
final (redirectUrl, urlScheme) = calcRedirectUrl(withAuthHtmlPath: true);
|
||||
|
||||
Logs().i('Starting legacy SSO Flow with redirect URL', redirectUrl);
|
||||
|
||||
final ssoProviders =
|
||||
(loginFlows
|
||||
.firstWhere((flow) => flow.type == 'm.login.sso')
|
||||
.additionalProperties['identity_providers']
|
||||
as List?)
|
||||
?.map(
|
||||
(json) => (
|
||||
name: json['name'] as String,
|
||||
id: json['id'] as String,
|
||||
brand: json['brand'] as String?,
|
||||
icon: json['icon'] as String?,
|
||||
),
|
||||
)
|
||||
.toList();
|
||||
|
||||
final provider = ssoProviders == null
|
||||
? null
|
||||
: await showModalActionPopup(
|
||||
context: context,
|
||||
title: L10n.of(context).logInTo(client.homeserver!.host),
|
||||
actions: ssoProviders
|
||||
.map(
|
||||
(provider) =>
|
||||
AdaptiveModalAction(label: provider.name, value: provider),
|
||||
)
|
||||
.toList(),
|
||||
);
|
||||
|
||||
final url = client.homeserver!.replace(
|
||||
path: '/_matrix/client/v3/login/sso/redirect',
|
||||
path:
|
||||
'/_matrix/client/v3/login/sso/redirect${provider == null ? '' : '/${provider.id}'}',
|
||||
queryParameters: {
|
||||
'redirectUrl': redirectUrl,
|
||||
'redirectUrl': redirectUrl.toString(),
|
||||
'action': signUp ? 'register' : 'login',
|
||||
},
|
||||
);
|
||||
|
||||
final urlScheme =
|
||||
(PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
|
||||
? Uri.parse(redirectUrl).scheme
|
||||
: 'http://localhost:3001';
|
||||
final result = await FlutterWebAuth2.authenticate(
|
||||
url: url.toString(),
|
||||
callbackUrlScheme: urlScheme,
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue