Compare commits
133 commits
krille/new
...
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 |
89 changed files with 4351 additions and 4689 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:
|
10. Drag&Drop to send a file into a chat still works:
|
||||||
- [ ] Web
|
- [ ] Web
|
||||||
- [ ] Linux
|
- [ ] Linux
|
||||||
|
11. Deeplinks are still working? https://matrix.to/#/@krille:janian.de
|
||||||
|
- [ ] Android
|
||||||
|
- [ ] iOS
|
||||||
25
.github/workflows/integrate.yaml
vendored
25
.github/workflows/integrate.yaml
vendored
|
|
@ -12,10 +12,9 @@ jobs:
|
||||||
- uses: webiny/action-conventional-commits@v1.3.1
|
- uses: webiny/action-conventional-commits@v1.3.1
|
||||||
- run: ./scripts/generate-locale-config.sh
|
- run: ./scripts/generate-locale-config.sh
|
||||||
- run: git diff --exit-code
|
- run: git diff --exit-code
|
||||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
cache: true
|
cache: true
|
||||||
- name: Check for unused translations
|
- name: Check for unused translations
|
||||||
run: flutter pub run translations_cleaner list-unused-terms -a
|
run: flutter pub run translations_cleaner list-unused-terms -a
|
||||||
|
|
@ -29,6 +28,10 @@ jobs:
|
||||||
- name: Check license compliance
|
- name: Check license compliance
|
||||||
run: dart run license_checker check-licenses -c licenses.yaml --problematic
|
run: dart run license_checker check-licenses -c licenses.yaml --problematic
|
||||||
- run: flutter analyze
|
- 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 analyze lib --reporter=github
|
||||||
- run: dart run dart_code_linter:metrics check-unused-code lib
|
- run: dart run dart_code_linter:metrics check-unused-code lib
|
||||||
- run: dart run dart_code_linter:metrics check-unused-files lib
|
- run: dart run dart_code_linter:metrics check-unused-files lib
|
||||||
|
|
@ -51,14 +54,9 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- uses: ./.github/actions/free_up_space
|
- 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
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
cache: true
|
cache: true
|
||||||
- uses: moonrepo/setup-rust@v1
|
- uses: moonrepo/setup-rust@v1
|
||||||
with:
|
with:
|
||||||
|
|
@ -84,10 +82,9 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
cache: true
|
cache: true
|
||||||
- uses: moonrepo/setup-rust@v1
|
- uses: moonrepo/setup-rust@v1
|
||||||
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
- 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'}}
|
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
|
run: sudo apt-get update && sudo apt-get install git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
|
||||||
|
- run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV
|
||||||
- name: Install Flutter
|
- name: Install Flutter
|
||||||
run: |
|
run: |
|
||||||
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
|
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
|
||||||
|
|
@ -125,10 +122,9 @@ jobs:
|
||||||
runs-on: macos-15
|
runs-on: macos-15
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
cache: true
|
cache: true
|
||||||
- name: Use Xcode 16.4
|
- name: Use Xcode 16.4
|
||||||
run: sudo xcode-select --switch /Applications/Xcode_16.4.app
|
run: sudo xcode-select --switch /Applications/Xcode_16.4.app
|
||||||
|
|
@ -202,7 +198,7 @@ jobs:
|
||||||
echo "Generated AVD snapshot for caching."
|
echo "Generated AVD snapshot for caching."
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
cache: true
|
cache: true
|
||||||
- uses: remarkablemark/setup-maestro-cli@v1
|
- uses: remarkablemark/setup-maestro-cli@v1
|
||||||
- name: Load integration test env
|
- name: Load integration test env
|
||||||
|
|
@ -241,7 +237,6 @@ jobs:
|
||||||
script: |
|
script: |
|
||||||
flutter run --use-application-binary=$PWD/app-debug.apk > flutter_logs.txt 2>&1 &
|
flutter run --use-application-binary=$PWD/app-debug.apk > flutter_logs.txt 2>&1 &
|
||||||
FLUTTER_PID=$!
|
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}
|
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
|
kill $FLUTTER_PID 2>/dev/null || true
|
||||||
cp flutter_logs.txt ~/.maestro/tests/
|
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
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
- uses: moonrepo/setup-rust@v1
|
- uses: moonrepo/setup-rust@v1
|
||||||
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||||
- name: Prepare web
|
- name: Prepare web
|
||||||
|
|
@ -40,14 +39,9 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- 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
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
cache: true
|
cache: true
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
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:
|
jobs:
|
||||||
notify:
|
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
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Send notification to Matrix room
|
- 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
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
cache: true
|
cache: true
|
||||||
- uses: moonrepo/setup-rust@v1
|
- uses: moonrepo/setup-rust@v1
|
||||||
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
- 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_path: fluffychat-web.tar.gz
|
||||||
asset_name: fluffychat-web.tar.gz
|
asset_name: fluffychat-web.tar.gz
|
||||||
asset_content_type: application/gzip
|
asset_content_type: application/gzip
|
||||||
- name: Build Website
|
- name: Clone fluffychat website
|
||||||
run: |
|
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
|
mkdir public/nightly
|
||||||
cp -r build/web/* public/
|
cp -r build/web/* public/web/
|
||||||
cp -r build/web/* public/nightly/
|
cp -r build/web/* public/nightly/
|
||||||
echo "app.fluffy.chat" >> public/CNAME
|
echo "fluffychat.im" >> public/CNAME
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
uses: peaceiris/actions-gh-pages@v4
|
uses: peaceiris/actions-gh-pages@v4
|
||||||
|
|
@ -61,20 +72,15 @@ jobs:
|
||||||
personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }}
|
personal_token: ${{ secrets.PAGES_DEPLOY_TOKEN }}
|
||||||
publish_dir: ./public
|
publish_dir: ./public
|
||||||
publish_branch: gh-pages
|
publish_branch: gh-pages
|
||||||
cname: app.fluffy.chat
|
cname: fluffychat.im
|
||||||
|
|
||||||
build_apk:
|
build_apk:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- 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
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
cache: true
|
cache: true
|
||||||
- name: Add Firebase Messaging
|
- name: Add Firebase Messaging
|
||||||
run: |
|
run: |
|
||||||
|
|
@ -107,9 +113,9 @@ jobs:
|
||||||
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}}
|
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
|
run: sudo apt-get update && sudo apt-get install curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
|
||||||
|
- run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV
|
||||||
- name: Install Flutter
|
- name: Install Flutter
|
||||||
run: |
|
run: |
|
||||||
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
|
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
|
||||||
|
|
@ -133,14 +139,9 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- 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
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
flutter-version-file: .tool_versions.yaml
|
||||||
cache: true
|
cache: true
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
|
|
@ -191,18 +192,18 @@ jobs:
|
||||||
- name: Check out Git repository
|
- name: Check out Git repository
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v6
|
||||||
- name: Log in to the Container registry
|
- name: Log in to the Container registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v4
|
||||||
with:
|
with:
|
||||||
registry: ${{ env.REGISTRY }}
|
registry: ${{ env.REGISTRY }}
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Extract metadata (tags, labels) for Docker
|
- name: Extract metadata (tags, labels) for Docker
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v6
|
||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
- name: Build and push Docker image
|
- name: Build and push Docker image
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v7
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
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
|
## v2.4.0
|
||||||
FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to
|
FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to
|
||||||
easily add your own sticker packs.
|
easily add your own sticker packs.
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<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>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
FluffyChat 2.4.0 adds a new improved GUI for managing stickers with tutorials how to
|
FluffyChat 2.5.0 introduces a new homeserver picker for onboarding,
|
||||||
easily add your own sticker packs.
|
better image compression performance and several smaller new features,
|
||||||
It also improves the search and image gallery in chats, especially encrypted chats.
|
design adjustments and bug fixes.
|
||||||
Besides that this update comes with a lot of fixes and improvements under the hood.
|
|
||||||
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
|
appId: chat.fluffy.fluffychat
|
||||||
---
|
---
|
||||||
- assertVisible: "Sign in"
|
- extendedWaitUntil: # Wait for app to be visible
|
||||||
- tapOn: "Sign in"
|
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"
|
- tapOn: "Search or enter homeserver address"
|
||||||
- inputText: "http://${HOMESERVER}"
|
- inputText: "http://${HOMESERVER}"
|
||||||
- pressKey: "back"
|
- pressKey: "back"
|
||||||
|
|
|
||||||
|
|
@ -17,28 +17,26 @@ abstract class AppConfig {
|
||||||
static const String schemePrefix = 'matrix:';
|
static const String schemePrefix = 'matrix:';
|
||||||
static const String pushNotificationsChannelId = 'fluffychat_push';
|
static const String pushNotificationsChannelId = 'fluffychat_push';
|
||||||
static const String pushNotificationsAppId = 'chat.fluffy.fluffychat';
|
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 spaceBorderRadius = 11.0;
|
||||||
static const double columnWidth = 360.0;
|
static const double columnWidth = 360.0;
|
||||||
|
|
||||||
static const String website = 'https://fluffy.chat';
|
|
||||||
static const String enablePushTutorial =
|
static const String enablePushTutorial =
|
||||||
'https://fluffy.chat/faq/#push_without_google_services';
|
'https://fluffychat.im/faq/#push_without_google_services';
|
||||||
static const String encryptionTutorial =
|
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 =
|
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 =
|
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 appId = 'im.fluffychat.FluffyChat';
|
||||||
static const String appOpenUrlScheme = 'chat.fluffy';
|
static const String appOpenUrlScheme = 'im.fluffychat';
|
||||||
|
|
||||||
static const String sourceCodeUrl =
|
static const String sourceCodeUrl =
|
||||||
'https://github.com/krille-chan/fluffychat';
|
'https://github.com/krille-chan/fluffychat';
|
||||||
static const String supportUrl =
|
static const String supportUrl =
|
||||||
'https://github.com/krille-chan/fluffychat/issues';
|
'https://github.com/krille-chan/fluffychat/issues';
|
||||||
static const String changelogUrl = 'https://fluffy.chat/en/changelog/';
|
static const String changelogUrl = 'https://fluffy.chat/en/changelog/';
|
||||||
static const String donationUrl = 'https://ko-fi.com/krille';
|
|
||||||
|
|
||||||
static const Set<String> defaultReactions = {'👍', '❤️', '😂', '😮', '😢'};
|
static const Set<String> defaultReactions = {'👍', '❤️', '😂', '😮', '😢'};
|
||||||
|
|
||||||
|
|
@ -54,12 +52,6 @@ abstract class AppConfig {
|
||||||
path: 'krille-chan/fluffychat/refs/heads/main/recommended_homeservers.json',
|
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 mainIsolatePortName = 'main_isolate';
|
||||||
static const String pushIsolatePortName = 'push_isolate';
|
static const String pushIsolatePortName = 'push_isolate';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -170,8 +170,14 @@ abstract class AppRoutes {
|
||||||
),
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: 'newprivatechat',
|
path: 'newprivatechat',
|
||||||
pageBuilder: (context, state) =>
|
pageBuilder: (context, state) => defaultPageBuilder(
|
||||||
defaultPageBuilder(context, state, const NewPrivateChat()),
|
context,
|
||||||
|
state,
|
||||||
|
NewPrivateChat(
|
||||||
|
key: ValueKey('new_chat_${state.uri.query}'),
|
||||||
|
deeplink: state.uri.queryParameters['deeplink'],
|
||||||
|
),
|
||||||
|
),
|
||||||
redirect: loggedOutRedirect,
|
redirect: loggedOutRedirect,
|
||||||
),
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,20 @@ enum AppSettings<T> {
|
||||||
enableSoftLogout<bool>('chat.fluffy.enable_soft_logout', false),
|
enableSoftLogout<bool>('chat.fluffy.enable_soft_logout', false),
|
||||||
enableMatrixNativeOIDC<bool>('chat.fluffy.enable_matrix_native_oidc', false),
|
enableMatrixNativeOIDC<bool>('chat.fluffy.enable_matrix_native_oidc', false),
|
||||||
presetHomeserver<String>('chat.fluffy.preset_homeserver', ''),
|
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 String key;
|
||||||
final T defaultValue;
|
final T defaultValue;
|
||||||
|
|
@ -65,6 +78,11 @@ enum AppSettings<T> {
|
||||||
static SharedPreferences get store => _store!;
|
static SharedPreferences get store => _store!;
|
||||||
static SharedPreferences? _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 {
|
static Future<SharedPreferences> init({bool loadWebConfigFile = true}) async {
|
||||||
if (AppSettings._store != null) return AppSettings.store;
|
if (AppSettings._store != null) return AppSettings.store;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ abstract class FluffyThemes {
|
||||||
),
|
),
|
||||||
inputDecorationTheme: InputDecorationTheme(
|
inputDecorationTheme: InputDecorationTheme(
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2),
|
||||||
),
|
),
|
||||||
contentPadding: const EdgeInsets.all(12),
|
contentPadding: const EdgeInsets.all(12),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -2992,8 +2992,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Даць грошы",
|
|
||||||
"@donate": {},
|
|
||||||
"startedAPoll": "{username} пачаў апытанне.",
|
"startedAPoll": "{username} пачаў апытанне.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2691,7 +2691,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Dona",
|
|
||||||
"startedAPoll": "{username} ha creat una enquesta.",
|
"startedAPoll": "{username} ha creat una enquesta.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2560,7 +2560,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Přispět",
|
|
||||||
"startedAPoll": "{username} spustil/a hlasování.",
|
"startedAPoll": "{username} spustil/a hlasování.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2697,7 +2697,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Spenden",
|
|
||||||
"resume": "Fortsetzen",
|
"resume": "Fortsetzen",
|
||||||
"startedAPoll": "{username} hat eine Umfrage gestartet.",
|
"startedAPoll": "{username} hat eine Umfrage gestartet.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
|
|
@ -2781,11 +2780,31 @@
|
||||||
"createNewAccount": "Neues Konto erstellen",
|
"createNewAccount": "Neues Konto erstellen",
|
||||||
"signUpGreeting": "FluffyChat ist dezentral! Wähle einen Server, auf dem du dein Konto erstellen möchtest, und los geht's!",
|
"signUpGreeting": "FluffyChat ist dezentral! Wähle einen Server, auf dem du dein Konto erstellen möchtest, und los geht's!",
|
||||||
"signInGreeting": "Du hast bereits ein Konto bei Matrix? Willkommen zurück! Wähle deinen Homeserver aus und melde dich an.",
|
"signInGreeting": "Du hast bereits ein Konto bei Matrix? Willkommen zurück! Wähle deinen Homeserver aus und melde dich an.",
|
||||||
"appIntro": "Mit FluffyChat kannst du mit deinen Freunden chatten. Es ist ein sicherer, dezentralisierter [Matrix]-Messenger! Erfahre mehr auf https://matrix.org, wenn du möchtest, oder melde dich einfach an.",
|
"appIntro": "Mit FluffyChat kannst du mit deinen Freunden chatten. Es ist ein sicherer, dezentralisierter [Matrix]-Messenger! Erfahre mehr auf https://matrix.org wenn du möchtest, oder melde dich einfach an.",
|
||||||
"theProcessWasCanceled": "Der Vorgang wurde abgebrochen.",
|
"theProcessWasCanceled": "Der Vorgang wurde abgebrochen.",
|
||||||
"federationBaseUrl": "Basis-URL der Föderation",
|
"federationBaseUrl": "Basis-URL der Föderation",
|
||||||
"clientWellKnownInformation": "Bekannte Informationen zum Client:",
|
"clientWellKnownInformation": "Bekannte Informationen zum Client:",
|
||||||
"join": "Beitreten",
|
"join": "Beitreten",
|
||||||
"searchOrEnterHomeserverAddress": "Homeserver-Adresse suchen oder eingeben",
|
"searchOrEnterHomeserverAddress": "Homeserver-Adresse suchen oder eingeben",
|
||||||
"matrixId": "Matrix ID"
|
"matrixId": "Matrix ID",
|
||||||
}
|
"reset": "Zurücksetzen",
|
||||||
|
"setPowerLevel": "Power-Level einstellen",
|
||||||
|
"makeModerator": "Zum Moderator machen",
|
||||||
|
"makeAdmin": "Zum Admin machen",
|
||||||
|
"removeModeratorRights": "Moderatorenrechte entziehen",
|
||||||
|
"removeAdminRights": "Adminrechte entziehen",
|
||||||
|
"powerLevel": "Power-Level",
|
||||||
|
"setPowerLevelDescription": "Die Power-Level legen fest, was ein Mitglied in diesem Raum tun darf und liegen üblicherweise zwischen 0 und 100.",
|
||||||
|
"owner": "Besitzer",
|
||||||
|
"mute": "Stumm",
|
||||||
|
"@mute": {
|
||||||
|
"description": "This should be a very short string because there is not much space in the button!"
|
||||||
|
},
|
||||||
|
"createNewChat": "Neuen Chat erstellen",
|
||||||
|
"supportFluffyChat": "FluffyChat unterstützen",
|
||||||
|
"support": "Unterstützen",
|
||||||
|
"fluffyChatSupportBannerMessage": "FluffyChat braucht DEINE Hilfe!\n❤️❤️❤️\nFluffyChat wird immer kostenlos bleiben, aber Entwicklung und Hosting kosten Geld.\nDie Zukunft des Projekts hängt von deiner Unterstützung ab.",
|
||||||
|
"skipSupportingFluffyChat": "FluffyChat unterstützen überspringen",
|
||||||
|
"iDoNotWantToSupport": "Ich möchte nicht unterstützen",
|
||||||
|
"iAlreadySupportFluffyChat": "I unterstütze FluffyChat bereits"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2681,7 +2681,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Donate",
|
|
||||||
"startedAPoll": "{username} started a poll.",
|
"startedAPoll": "{username} started a poll.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2776,5 +2775,19 @@
|
||||||
"removeAdminRights": "Remove admin rights",
|
"removeAdminRights": "Remove admin rights",
|
||||||
"powerLevel": "Power level",
|
"powerLevel": "Power level",
|
||||||
"setPowerLevelDescription": "Power levels define what a member is allowed to do in this room and usually range between 0 and 100.",
|
"setPowerLevelDescription": "Power levels define what a member is allowed to do in this room and usually range between 0 and 100.",
|
||||||
"owner": "Owner"
|
"owner": "Owner",
|
||||||
}
|
"mute": "Mute",
|
||||||
|
"@mute": {
|
||||||
|
"description": "This should be a very short string because there is not much space in the button!"
|
||||||
|
},
|
||||||
|
"createNewChat": "Create new chat",
|
||||||
|
"reset": "Reset",
|
||||||
|
"supportFluffyChat": "Support FluffyChat",
|
||||||
|
"support": "Support",
|
||||||
|
"fluffyChatSupportBannerMessage": "FluffyChat needs YOUR help!\n❤️❤️❤️\nFluffyChat will always be free, but development and hosting still cost money.\nThe future of the project depends on support from people like you.",
|
||||||
|
"skipSupportingFluffyChat": "Skip supporting FluffyChat",
|
||||||
|
"iDoNotWantToSupport": "I do not want to support",
|
||||||
|
"iAlreadySupportFluffyChat": "I already support FluffyChat",
|
||||||
|
"setLowPriority": "Set low priority",
|
||||||
|
"unsetLowPriority": "Unset low priority"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2713,7 +2713,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Donar",
|
|
||||||
"pollQuestion": "Pregunta de encuesta",
|
"pollQuestion": "Pregunta de encuesta",
|
||||||
"answerOption": "Respuesta",
|
"answerOption": "Respuesta",
|
||||||
"addAnswerOption": "Añadir respuesta",
|
"addAnswerOption": "Añadir respuesta",
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"askSSSSSign": "Selleks, et teist osapoolt identifitseerivat allkirja anda, palun sisesta oma turvahoidla paroolifraas või taastevõti.",
|
"askSSSSSign": "Selleks, et teist osapoolt identifitseerivat allkirja anda, palun sisesta oma turvahoidla salafraas või taastevõti.",
|
||||||
"@askSSSSSign": {
|
"@askSSSSSign": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
|
@ -339,7 +339,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"changeTheNameOfTheGroup": "Muuda vestlusrühma nime",
|
"changeTheNameOfTheGroup": "Muuda jututoa nime",
|
||||||
"@changeTheNameOfTheGroup": {
|
"@changeTheNameOfTheGroup": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
|
@ -489,7 +489,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"contactHasBeenInvitedToTheGroup": "Sinu kontakt on kutsutud liituma vestlusrühma",
|
"contactHasBeenInvitedToTheGroup": "Sinu kontakt on kutsutud liituma jututoaga",
|
||||||
"@contactHasBeenInvitedToTheGroup": {
|
"@contactHasBeenInvitedToTheGroup": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
|
@ -776,22 +776,22 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"group": "Vestlusrühm",
|
"group": "Jututuba",
|
||||||
"@group": {
|
"@group": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"groupIsPublic": "Vestlusrühm on avalik",
|
"groupIsPublic": "Jututuba on avalik",
|
||||||
"@groupIsPublic": {
|
"@groupIsPublic": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"groups": "Vestlusrühmad",
|
"groups": "Jututoad",
|
||||||
"@groups": {
|
"@groups": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"groupWith": "Vestlusrühm {displayname} kasutajanimega",
|
"groupWith": "Jututuba {displayname} kasutajanimega",
|
||||||
"@groupWith": {
|
"@groupWith": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
|
|
@ -862,7 +862,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"incorrectPassphraseOrKey": "Vigane paroolifraas või taastevõti",
|
"incorrectPassphraseOrKey": "Vigane salafraas või taastevõti",
|
||||||
"@incorrectPassphraseOrKey": {
|
"@incorrectPassphraseOrKey": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
|
@ -877,7 +877,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"inviteContactToGroup": "Kutsu sõpru ja tuttavaid {groupName} liikmeks",
|
"inviteContactToGroup": "Kutsu sõpru ja tuttavaid {groupName} jututoa liikmeks",
|
||||||
"@inviteContactToGroup": {
|
"@inviteContactToGroup": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
|
|
@ -1221,7 +1221,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"passphraseOrKey": "paroolifraas või taastevõti",
|
"passphraseOrKey": "salafraas või taastevõti",
|
||||||
"@passphraseOrKey": {
|
"@passphraseOrKey": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
|
@ -1839,7 +1839,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"whoIsAllowedToJoinThisGroup": "Kes võivad selle vestlusrühmaga liituda",
|
"whoIsAllowedToJoinThisGroup": "Kes võivad selle jututoaga liituda",
|
||||||
"@whoIsAllowedToJoinThisGroup": {
|
"@whoIsAllowedToJoinThisGroup": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
|
@ -1927,7 +1927,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"description": "Usage hint for the command /dm"
|
"description": "Usage hint for the command /dm"
|
||||||
},
|
},
|
||||||
"commandHint_create": "Loo tühi vestlusrühm\nKrüptimise keelamiseks kasuta --no-encryption võtit",
|
"commandHint_create": "Loo tühi jututuba\nKrüptimise keelamiseks kasuta --no-encryption võtit",
|
||||||
"@commandHint_create": {
|
"@commandHint_create": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"description": "Usage hint for the command /create"
|
"description": "Usage hint for the command /create"
|
||||||
|
|
@ -2049,7 +2049,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"commandHint_markasgroup": "Märgi vestlusrühmaks",
|
"commandHint_markasgroup": "Märgi jututoaks",
|
||||||
"commandHint_markasdm": "Märgi otsevestusluseks antud Matrixi ID jaoks",
|
"commandHint_markasdm": "Märgi otsevestusluseks antud Matrixi ID jaoks",
|
||||||
"whyIsThisMessageEncrypted": "Miks see sõnum pole loetav?",
|
"whyIsThisMessageEncrypted": "Miks see sõnum pole loetav?",
|
||||||
"noKeyForThisMessage": "See võib juhtuda, kui sõnum oli saadetud enne, kui siin seadmes oma kontoga sisse logisid.\n\nSamuti võib juhtuda siis, kui saatja on lugemises selles seadmes blokeerinud või on tekkinud tõrkeid veebiühenduses.\n\nAga mõnes teises seadmes saad seda sõnumit lugeda? Siis sa võid sõnumi sealt üle tõsta. Ava Seadistused -> Seadmed ning kontrolli, et kõik sinu seadmed on omavahel verifitseeritud. Kui avad selle vestluse või jututoa ning mõlemad sessioonid on avatud, siis vajalikud krüptovõtmed saadetakse automaatset.\n\nKas sa soovid vältida krüptovõtmete kadumist väljalogimisel ja seadmete vahetusel? Siis palun kontrolli, et seadistuses on krüptovõtmete varundus sisse lülitatud.",
|
"noKeyForThisMessage": "See võib juhtuda, kui sõnum oli saadetud enne, kui siin seadmes oma kontoga sisse logisid.\n\nSamuti võib juhtuda siis, kui saatja on lugemises selles seadmes blokeerinud või on tekkinud tõrkeid veebiühenduses.\n\nAga mõnes teises seadmes saad seda sõnumit lugeda? Siis sa võid sõnumi sealt üle tõsta. Ava Seadistused -> Seadmed ning kontrolli, et kõik sinu seadmed on omavahel verifitseeritud. Kui avad selle vestluse või jututoa ning mõlemad sessioonid on avatud, siis vajalikud krüptovõtmed saadetakse automaatset.\n\nKas sa soovid vältida krüptovõtmete kadumist väljalogimisel ja seadmete vahetusel? Siis palun kontrolli, et seadistuses on krüptovõtmete varundus sisse lülitatud.",
|
||||||
|
|
@ -2130,7 +2130,7 @@
|
||||||
"importNow": "Impordi kohe",
|
"importNow": "Impordi kohe",
|
||||||
"importEmojis": "Impordi emojid",
|
"importEmojis": "Impordi emojid",
|
||||||
"sendTypingNotifications": "Saada kirjutamise teavitusi",
|
"sendTypingNotifications": "Saada kirjutamise teavitusi",
|
||||||
"createGroup": "Loo vestlusrühm",
|
"createGroup": "Loo jututuba",
|
||||||
"tryAgain": "Proovi uuesti",
|
"tryAgain": "Proovi uuesti",
|
||||||
"chatPermissions": "Vestluse õigused",
|
"chatPermissions": "Vestluse õigused",
|
||||||
"chatDescription": "Vestluse kirjeldus",
|
"chatDescription": "Vestluse kirjeldus",
|
||||||
|
|
@ -2166,7 +2166,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"inviteGroupChat": "📨 Kutse vestlusrühma",
|
"inviteGroupChat": "📨 Kutse jututuppa",
|
||||||
"emoteKeyboardNoRecents": "Hiljuti kasutatud emotikonid kuvame siin...",
|
"emoteKeyboardNoRecents": "Hiljuti kasutatud emotikonid kuvame siin...",
|
||||||
"@emoteKeyboardNoRecents": {
|
"@emoteKeyboardNoRecents": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2201,9 +2201,9 @@
|
||||||
"pleaseEnterANumber": "Palun sisesta 0'st suurem number",
|
"pleaseEnterANumber": "Palun sisesta 0'st suurem number",
|
||||||
"kickUserDescription": "See kasutaja on nüüd jutuoast välja müksatud, kuid talle pole seatud suhtluskeeldu. Avaliku jututoa puhul saab ta alati uuesti liituda.",
|
"kickUserDescription": "See kasutaja on nüüd jutuoast välja müksatud, kuid talle pole seatud suhtluskeeldu. Avaliku jututoa puhul saab ta alati uuesti liituda.",
|
||||||
"blockListDescription": "Sul on võimalik blokeerida neid kasutajaid, kes sind segavad. Oma isiklikku blokerimisloendisse lisatud kasutajad ei saa sulle saata sõnumeid ega kutseid.",
|
"blockListDescription": "Sul on võimalik blokeerida neid kasutajaid, kes sind segavad. Oma isiklikku blokerimisloendisse lisatud kasutajad ei saa sulle saata sõnumeid ega kutseid.",
|
||||||
"createGroupAndInviteUsers": "Lisavestlusrühm ja kutsu sinna kasutajaid",
|
"createGroupAndInviteUsers": "Lisa jututuba ja kutsu sinna kasutajaid",
|
||||||
"blockedUsers": "Blokeeritud kasutajad",
|
"blockedUsers": "Blokeeritud kasutajad",
|
||||||
"groupCanBeFoundViaSearch": "Vestlusrühm on leitav otsinguga",
|
"groupCanBeFoundViaSearch": "Jututuba on leitav otsinguga",
|
||||||
"noUsersFoundWithQuery": "Päringuga „{query}“ ei leidunud kahkus ühtegi kasutajat. Palun kontrolli, et päringus poleks vigu.",
|
"noUsersFoundWithQuery": "Päringuga „{query}“ ei leidunud kahkus ühtegi kasutajat. Palun kontrolli, et päringus poleks vigu.",
|
||||||
"@noUsersFoundWithQuery": {
|
"@noUsersFoundWithQuery": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2218,7 +2218,7 @@
|
||||||
"commandHint_sendraw": "Saada json oma algupärasel kujul",
|
"commandHint_sendraw": "Saada json oma algupärasel kujul",
|
||||||
"wrongRecoveryKey": "Vabandust..., see ei tundu olema korrektne taastevõti.",
|
"wrongRecoveryKey": "Vabandust..., see ei tundu olema korrektne taastevõti.",
|
||||||
"blockUsername": "Eira kasutajanime",
|
"blockUsername": "Eira kasutajanime",
|
||||||
"groupName": "Vestlusrühma nimi",
|
"groupName": "Jututoa nimi",
|
||||||
"databaseMigrationTitle": "Andmebaas on optimeeritud",
|
"databaseMigrationTitle": "Andmebaas on optimeeritud",
|
||||||
"searchChatsRooms": "Otsi #vestlusi, @kasutajaid...",
|
"searchChatsRooms": "Otsi #vestlusi, @kasutajaid...",
|
||||||
"databaseMigrationBody": "Palun oota üks hetk. Natuke võib kuluda aega.",
|
"databaseMigrationBody": "Palun oota üks hetk. Natuke võib kuluda aega.",
|
||||||
|
|
@ -2442,7 +2442,7 @@
|
||||||
"changeGeneralChatSettings": "Muuda vestluse üldiseid seadistusi",
|
"changeGeneralChatSettings": "Muuda vestluse üldiseid seadistusi",
|
||||||
"inviteOtherUsers": "Kutsu teisi osalejaid sellesse vestlusesse",
|
"inviteOtherUsers": "Kutsu teisi osalejaid sellesse vestlusesse",
|
||||||
"changeTheChatPermissions": "Muuda vestluse õigusi",
|
"changeTheChatPermissions": "Muuda vestluse õigusi",
|
||||||
"changeTheDescriptionOfTheGroup": "Muuda vestluse kirjeldust",
|
"changeTheDescriptionOfTheGroup": "Muuda vestluse/jututoa kirjeldust",
|
||||||
"chatPermissionsDescription": "Määra erinevatele kasutajatele selles vestluses vajalikud õigused. Tüüpiliselt on need 0, 50 ja 100 (vastavalt kasutajad, moderaatorid ja peakasutajad), kuid igasugused vahepealsed variatsioonid on ka võimalikud.",
|
"chatPermissionsDescription": "Määra erinevatele kasutajatele selles vestluses vajalikud õigused. Tüüpiliselt on need 0, 50 ja 100 (vastavalt kasutajad, moderaatorid ja peakasutajad), kuid igasugused vahepealsed variatsioonid on ka võimalikud.",
|
||||||
"invitedBy": "📩 Kutsujaks {user}",
|
"invitedBy": "📩 Kutsujaks {user}",
|
||||||
"@invitedBy": {
|
"@invitedBy": {
|
||||||
|
|
@ -2690,7 +2690,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Toeta meid rahaliselt",
|
|
||||||
"startedAPoll": "{username} koostas küsitluse.",
|
"startedAPoll": "{username} koostas küsitluse.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2787,5 +2786,19 @@
|
||||||
"removeAdminRights": "Eemalda peakasutaja õigused",
|
"removeAdminRights": "Eemalda peakasutaja õigused",
|
||||||
"powerLevel": "Õiguste tase",
|
"powerLevel": "Õiguste tase",
|
||||||
"setPowerLevelDescription": "Õiguste tase on üks võimalusi kirjeldamaks seda, mida kasutaja saab jututoas teha ning see tavaliselt väljendub numbriga vahemikust 0 kuni 100.",
|
"setPowerLevelDescription": "Õiguste tase on üks võimalusi kirjeldamaks seda, mida kasutaja saab jututoas teha ning see tavaliselt väljendub numbriga vahemikust 0 kuni 100.",
|
||||||
"owner": "Omanik"
|
"owner": "Omanik",
|
||||||
}
|
"mute": "Summuta",
|
||||||
|
"@mute": {
|
||||||
|
"description": "This should be a very short string because there is not much space in the button!"
|
||||||
|
},
|
||||||
|
"createNewChat": "Loo uus vestlus",
|
||||||
|
"reset": "Lähtesta",
|
||||||
|
"supportFluffyChat": "Toeta FluffyChati",
|
||||||
|
"support": "Toeta meid",
|
||||||
|
"iAlreadySupportFluffyChat": "Ma juba toetan FluffyChati arendust",
|
||||||
|
"fluffyChatSupportBannerMessage": "FluffyChat vajab SINU abi!\n❤️❤️❤️\nFluffyChat jääb alati vabaks ja vabalt saadavaks, aga arendus ja serveriteenused vajavad ikkagi rahastamist.\nMeie projekti tulevik sõltub sinust ja teistest kasutajatest, nagu sina.",
|
||||||
|
"skipSupportingFluffyChat": "Jäta FluffyChati toetamine vahele",
|
||||||
|
"iDoNotWantToSupport": "Ma ei soovi toetada",
|
||||||
|
"setLowPriority": "Märgi vähetähtsaks",
|
||||||
|
"unsetLowPriority": "Eemalda märkimine vähetähtsaks"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2672,7 +2672,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Egin dohaintza",
|
|
||||||
"spaceMemberOf": "{spaces} guneko kidea",
|
"spaceMemberOf": "{spaces} guneko kidea",
|
||||||
"@spaceMemberOf": {
|
"@spaceMemberOf": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2779,5 +2778,19 @@
|
||||||
"theProcessWasCanceled": "Eragiketa bertan behera utzi da.",
|
"theProcessWasCanceled": "Eragiketa bertan behera utzi da.",
|
||||||
"join": "Batu",
|
"join": "Batu",
|
||||||
"searchOrEnterHomeserverAddress": "Bilatu edo sartu zerbitzariaren helbidea",
|
"searchOrEnterHomeserverAddress": "Bilatu edo sartu zerbitzariaren helbidea",
|
||||||
"matrixId": "Matrix IDa"
|
"matrixId": "Matrix IDa",
|
||||||
|
"setPowerLevel": "Ezarri botere-maila",
|
||||||
|
"makeModerator": "Izendatu moderatzaile",
|
||||||
|
"makeAdmin": "Izendatu administrari",
|
||||||
|
"removeModeratorRights": "Kendu moderatzaile eskubideak",
|
||||||
|
"removeAdminRights": "Kendu administratzaile eskubideak",
|
||||||
|
"powerLevel": "Botere-maila",
|
||||||
|
"setPowerLevelDescription": "Botere-mailek zehazten dute kide batek zer egin dezakeen gela honetan, eta tartea 0tik 100era artekoa izan ohi da.",
|
||||||
|
"owner": "Jabea",
|
||||||
|
"mute": "Mututu",
|
||||||
|
"@mute": {
|
||||||
|
"description": "This should be a very short string because there is not much space in the button!"
|
||||||
|
},
|
||||||
|
"createNewChat": "Sortu txat berria",
|
||||||
|
"reset": "Berrezarri"
|
||||||
}
|
}
|
||||||
|
|
@ -3003,8 +3003,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Lahjoita",
|
|
||||||
"@donate": {},
|
|
||||||
"startedAPoll": "{username} aloitti kyselyn.",
|
"startedAPoll": "{username} aloitti kyselyn.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2696,7 +2696,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Tabhair Síntiús",
|
|
||||||
"startedAPoll": "Chuir {username} tús le pobalbhreith.",
|
"startedAPoll": "Chuir {username} tús le pobalbhreith.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2793,5 +2792,17 @@
|
||||||
"removeAdminRights": "Bain cearta riarthóra",
|
"removeAdminRights": "Bain cearta riarthóra",
|
||||||
"powerLevel": "Leibhéal cumhachta",
|
"powerLevel": "Leibhéal cumhachta",
|
||||||
"setPowerLevelDescription": "Sainmhíníonn leibhéil chumhachta cad a cheadaítear do bhall a dhéanamh sa seomra seo agus is gnách go mbíonn siad idir 0 agus 100.",
|
"setPowerLevelDescription": "Sainmhíníonn leibhéil chumhachta cad a cheadaítear do bhall a dhéanamh sa seomra seo agus is gnách go mbíonn siad idir 0 agus 100.",
|
||||||
"owner": "Úinéir"
|
"owner": "Úinéir",
|
||||||
}
|
"mute": "Balbhaigh",
|
||||||
|
"@mute": {
|
||||||
|
"description": "This should be a very short string because there is not much space in the button!"
|
||||||
|
},
|
||||||
|
"createNewChat": "Cruthaigh comhrá nua",
|
||||||
|
"reset": "Athshocraigh",
|
||||||
|
"supportFluffyChat": "Tacaigh le FluffyChat",
|
||||||
|
"support": "Tacaíocht",
|
||||||
|
"fluffyChatSupportBannerMessage": "Tá DO chabhair ag teastáil ó FluffyChat!\n❤️❤️❤️\nBeidh FluffyChat saor in aisce i gcónaí, ach cosnaíonn forbairt agus óstáil airgead fós.\nBraitheann todhchaí an tionscadail ar thacaíocht ó dhaoine cosúil leatsa.",
|
||||||
|
"skipSupportingFluffyChat": "Seachain tacú le FluffyChat",
|
||||||
|
"iDoNotWantToSupport": "Nílim ag iarraidh tacú leis",
|
||||||
|
"iAlreadySupportFluffyChat": "Tacaím le FluffyChat cheana féin"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2672,7 +2672,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Doar",
|
|
||||||
"spaceMemberOf": "Participa no espazo {spaces}",
|
"spaceMemberOf": "Participa no espazo {spaces}",
|
||||||
"@spaceMemberOf": {
|
"@spaceMemberOf": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2787,5 +2786,19 @@
|
||||||
"removeAdminRights": "Retirar permiso de administración",
|
"removeAdminRights": "Retirar permiso de administración",
|
||||||
"powerLevel": "Nivel responsabilidade",
|
"powerLevel": "Nivel responsabilidade",
|
||||||
"setPowerLevelDescription": "Os niveis de responsabilidade definen o que pode facer unha usuaria na sala, normalmente varía de 0 a 100.",
|
"setPowerLevelDescription": "Os niveis de responsabilidade definen o que pode facer unha usuaria na sala, normalmente varía de 0 a 100.",
|
||||||
"owner": "Propietaria"
|
"owner": "Propietaria",
|
||||||
}
|
"mute": "Acalar",
|
||||||
|
"@mute": {
|
||||||
|
"description": "This should be a very short string because there is not much space in the button!"
|
||||||
|
},
|
||||||
|
"createNewChat": "Crear nova conversa",
|
||||||
|
"reset": "Restablecer",
|
||||||
|
"supportFluffyChat": "Apoia a FluffyChat",
|
||||||
|
"support": "Axuda",
|
||||||
|
"fluffyChatSupportBannerMessage": "FluffyChat precisa a TÚA axuda!\n❤️❤️❤️\nFluffyChat vai ser sempre gratuíta, pero o desenvolvemento e a hospedaxe costan cartos.\nO futuro do proxecto depende da axuda de persoas coma ti.",
|
||||||
|
"skipSupportingFluffyChat": "Omitir apoiar a FluffyChat",
|
||||||
|
"iDoNotWantToSupport": "Non quero axudar",
|
||||||
|
"iAlreadySupportFluffyChat": "Xa apoiei a FluffyChat",
|
||||||
|
"setLowPriority": "Establecer prioridade baixa",
|
||||||
|
"unsetLowPriority": "Non establecer prioridade baixa"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2692,7 +2692,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Doniraj",
|
|
||||||
"startedAPoll": "{username} je pokrenuo/la anketu.",
|
"startedAPoll": "{username} je pokrenuo/la anketu.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2691,7 +2691,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Donasi",
|
|
||||||
"startedAPoll": "{username} memulai polling.",
|
"startedAPoll": "{username} memulai polling.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -1392,7 +1392,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Mudd tawsa",
|
|
||||||
"startedAPoll": "{username}yessenker tafrent.",
|
"startedAPoll": "{username}yessenker tafrent.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2673,7 +2673,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Ziedot",
|
|
||||||
"startedAPoll": "{username} uzsāka aptauju.",
|
"startedAPoll": "{username} uzsāka aptauju.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2540,7 +2540,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Doner",
|
|
||||||
"banUserDescription": "Brukeren vil bli utestengt fra chatten og vil ikke kunne delta i chatten igjen før utestengelsen er opphevet.",
|
"banUserDescription": "Brukeren vil bli utestengt fra chatten og vil ikke kunne delta i chatten igjen før utestengelsen er opphevet.",
|
||||||
"unbanUserDescription": "Brukeren vil kunne gå inn i chatten igjen hvis vedkommende prøver.",
|
"unbanUserDescription": "Brukeren vil kunne gå inn i chatten igjen hvis vedkommende prøver.",
|
||||||
"kickUserDescription": "Brukeren blir kastet ut av chatten, men ikke utestengt. I offentlige chatter kan brukeren bli med på nytt når som helst.",
|
"kickUserDescription": "Brukeren blir kastet ut av chatten, men ikke utestengt. I offentlige chatter kan brukeren bli med på nytt når som helst.",
|
||||||
|
|
@ -2794,5 +2793,19 @@
|
||||||
"removeAdminRights": "Fjern admin-rettigheter",
|
"removeAdminRights": "Fjern admin-rettigheter",
|
||||||
"powerLevel": "Styrkenivå",
|
"powerLevel": "Styrkenivå",
|
||||||
"setPowerLevelDescription": "Styrkenivåer definerer hva et medlem har lov til å gjøre i dette rommet, og varierer vanligvis mellom 0 og 100.",
|
"setPowerLevelDescription": "Styrkenivåer definerer hva et medlem har lov til å gjøre i dette rommet, og varierer vanligvis mellom 0 og 100.",
|
||||||
"owner": "Eier"
|
"owner": "Eier",
|
||||||
}
|
"mute": "Demp",
|
||||||
|
"@mute": {
|
||||||
|
"description": "This should be a very short string because there is not much space in the button!"
|
||||||
|
},
|
||||||
|
"createNewChat": "Opprett ny chat",
|
||||||
|
"reset": "Nullstill",
|
||||||
|
"supportFluffyChat": "Støtt FluffyChat",
|
||||||
|
"support": "Støtte",
|
||||||
|
"fluffyChatSupportBannerMessage": "FluffyChat trenger DIN hjelp!\n❤️❤️❤️\nFluffyChat vil alltid være gratis, men utvikling og drift koster fortsatt penger. \nProsjektets fremtid avhenger av støtte fra folk som deg.",
|
||||||
|
"skipSupportingFluffyChat": "Hopp over støtte til FluffyChat",
|
||||||
|
"iDoNotWantToSupport": "Jeg ønsker ikke å støtte",
|
||||||
|
"iAlreadySupportFluffyChat": "Jeg støtter allerede FluffyChat",
|
||||||
|
"setLowPriority": "Sett lav prioritet",
|
||||||
|
"unsetLowPriority": "Fjern lav prioritet"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2383,7 +2383,7 @@
|
||||||
"newPassword": "Nieuw wachtwoord",
|
"newPassword": "Nieuw wachtwoord",
|
||||||
"pleaseChooseAStrongPassword": "Kies a.j.b. een sterk wachtwoord",
|
"pleaseChooseAStrongPassword": "Kies a.j.b. een sterk wachtwoord",
|
||||||
"select": "Selecteer",
|
"select": "Selecteer",
|
||||||
"leaveEmptyToClearStatus": "Laat leeg om je status te resetten.",
|
"leaveEmptyToClearStatus": "Laat leeg om jouw status te herstellen.",
|
||||||
"addChatOrSubSpace": "Voeg chat of subspace toe",
|
"addChatOrSubSpace": "Voeg chat of subspace toe",
|
||||||
"pleaseEnterYourCurrentPassword": "Vul je huidige wachtwoord in",
|
"pleaseEnterYourCurrentPassword": "Vul je huidige wachtwoord in",
|
||||||
"passwordsDoNotMatch": "Wachtwoorden komen niet overeen",
|
"passwordsDoNotMatch": "Wachtwoorden komen niet overeen",
|
||||||
|
|
@ -2661,7 +2661,6 @@
|
||||||
"longPressToRecordVoiceMessage": "Lang drukken om een spraakbericht op te nemen.",
|
"longPressToRecordVoiceMessage": "Lang drukken om een spraakbericht op te nemen.",
|
||||||
"pause": "Pauzeer",
|
"pause": "Pauzeer",
|
||||||
"resume": "Hervat",
|
"resume": "Hervat",
|
||||||
"donate": "Doneer",
|
|
||||||
"removeFromSpaceDescription": "De chat zal worden verwijderd uit de space, maar blijft in je chats.",
|
"removeFromSpaceDescription": "De chat zal worden verwijderd uit de space, maar blijft in je chats.",
|
||||||
"countChats": "{chats} chats",
|
"countChats": "{chats} chats",
|
||||||
"@countChats": {
|
"@countChats": {
|
||||||
|
|
@ -2786,5 +2785,19 @@
|
||||||
"removeAdminRights": "Verwijder beheerder-rechten",
|
"removeAdminRights": "Verwijder beheerder-rechten",
|
||||||
"powerLevel": "Rechtenniveau",
|
"powerLevel": "Rechtenniveau",
|
||||||
"setPowerLevelDescription": "Rechtenniveau's definiëren wat een persoon mag doen in deze chat en variëren meestal tussen 0 en 100.",
|
"setPowerLevelDescription": "Rechtenniveau's definiëren wat een persoon mag doen in deze chat en variëren meestal tussen 0 en 100.",
|
||||||
"owner": "Eigenaar"
|
"owner": "Eigenaar",
|
||||||
}
|
"mute": "Demp",
|
||||||
|
"@mute": {
|
||||||
|
"description": "This should be a very short string because there is not much space in the button!"
|
||||||
|
},
|
||||||
|
"createNewChat": "Creëer nieuw chat",
|
||||||
|
"reset": "Herstellen",
|
||||||
|
"fluffyChatSupportBannerMessage": "Fluffy Chat heeft JOUW hulp nodig. _\n❤️❤️❤️\nFluffyChat zal altijd gratis zijn, maar ontwikkeling en hosting kost geld.\nDe toekomst van het project hangt af van steun van mensen zoals jij.",
|
||||||
|
"skipSupportingFluffyChat": "FluffyChat steunen overslaan",
|
||||||
|
"iDoNotWantToSupport": "Ik wil niet ondersteunen",
|
||||||
|
"iAlreadySupportFluffyChat": "Ik steun FluffyChat al",
|
||||||
|
"supportFluffyChat": "FluffyChat steunen",
|
||||||
|
"support": "Steunen",
|
||||||
|
"setLowPriority": "Lage prioriteit instellen",
|
||||||
|
"unsetLowPriority": "Lage prioriteit uitschakelen"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"areGuestsAllowedToJoin": "Czy użytkownicy-goście mogą dołączyć",
|
"areGuestsAllowedToJoin": "Czy goście mogą dołączyć?",
|
||||||
"@areGuestsAllowedToJoin": {
|
"@areGuestsAllowedToJoin": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
|
@ -330,7 +330,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"chatBackupDescription": "Twoje stare wiadomości są zabezpieczone kluczem odzyskiwania. Uważaj żeby go nie zgubić.",
|
"chatBackupDescription": "Twoje wiadomości są zabezpieczone kluczem odzyskiwania. Uważaj żeby go nie zgubić.",
|
||||||
"@chatBackupDescription": {
|
"@chatBackupDescription": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
|
@ -351,7 +351,6 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"clearArchive": "Wyczyść archiwum",
|
"clearArchive": "Wyczyść archiwum",
|
||||||
"@clearArchive": {},
|
|
||||||
"close": "Zamknij",
|
"close": "Zamknij",
|
||||||
"@close": {
|
"@close": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1455,9 +1454,7 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"addAccount": "Dodaj konto",
|
"addAccount": "Dodaj konto",
|
||||||
"@addAccount": {},
|
|
||||||
"serverRequiresEmail": "Ten serwer wymaga potwierdzenia Twojego adresu email w celu rejestracji.",
|
"serverRequiresEmail": "Ten serwer wymaga potwierdzenia Twojego adresu email w celu rejestracji.",
|
||||||
"@serverRequiresEmail": {},
|
|
||||||
"or": "Lub",
|
"or": "Lub",
|
||||||
"@or": {
|
"@or": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1547,7 +1544,6 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"enableMultiAccounts": "(BETA) Włącza obsługę wielu kont na tym urządzeniu",
|
"enableMultiAccounts": "(BETA) Włącza obsługę wielu kont na tym urządzeniu",
|
||||||
"@enableMultiAccounts": {},
|
|
||||||
"pickImage": "Wybierz obraz",
|
"pickImage": "Wybierz obraz",
|
||||||
"@pickImage": {
|
"@pickImage": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1564,14 +1560,12 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"link": "Link",
|
"link": "Link",
|
||||||
"@link": {},
|
|
||||||
"roomHasBeenUpgraded": "Pokój został zaktualizowany",
|
"roomHasBeenUpgraded": "Pokój został zaktualizowany",
|
||||||
"@roomHasBeenUpgraded": {
|
"@roomHasBeenUpgraded": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"repeatPassword": "Powtórz hasło",
|
"repeatPassword": "Powtórz hasło",
|
||||||
"@repeatPassword": {},
|
|
||||||
"all": "Wszystkie",
|
"all": "Wszystkie",
|
||||||
"@all": {
|
"@all": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1588,7 +1582,6 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"sendOnEnter": "Wyślij enterem",
|
"sendOnEnter": "Wyślij enterem",
|
||||||
"@sendOnEnter": {},
|
|
||||||
"autoplayImages": "Automatycznie odtwarzaj animowane naklejki i emotikony",
|
"autoplayImages": "Automatycznie odtwarzaj animowane naklejki i emotikony",
|
||||||
"@autoplayImages": {
|
"@autoplayImages": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1609,14 +1602,12 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"homeserver": "Adres serwera",
|
"homeserver": "Adres serwera",
|
||||||
"@homeserver": {},
|
|
||||||
"locationDisabledNotice": "Usługi lokalizacji są wyłączone. Proszę włącz je aby móc udostępnić swoją lokalizację.",
|
"locationDisabledNotice": "Usługi lokalizacji są wyłączone. Proszę włącz je aby móc udostępnić swoją lokalizację.",
|
||||||
"@locationDisabledNotice": {
|
"@locationDisabledNotice": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"oneClientLoggedOut": "Jedno z twoich urządzeń zostało wylogowane",
|
"oneClientLoggedOut": "Jedno z twoich urządzeń zostało wylogowane",
|
||||||
"@oneClientLoggedOut": {},
|
|
||||||
"privacy": "Prywatność",
|
"privacy": "Prywatność",
|
||||||
"@privacy": {
|
"@privacy": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1710,7 +1701,6 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"scanQrCode": "Skanuj kod QR",
|
"scanQrCode": "Skanuj kod QR",
|
||||||
"@scanQrCode": {},
|
|
||||||
"createNewSpace": "Nowa przestrzeń",
|
"createNewSpace": "Nowa przestrzeń",
|
||||||
"@createNewSpace": {
|
"@createNewSpace": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1722,7 +1712,6 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"addToSpace": "Dodaj do przestrzeni",
|
"addToSpace": "Dodaj do przestrzeni",
|
||||||
"@addToSpace": {},
|
|
||||||
"changeYourAvatar": "Zmień swoje zdjęcie",
|
"changeYourAvatar": "Zmień swoje zdjęcie",
|
||||||
"@changeYourAvatar": {
|
"@changeYourAvatar": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1783,7 +1772,7 @@
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"tooManyRequestsWarning": "Zbyt wiele żądań. Proszę spróbować później.",
|
"tooManyRequestsWarning": "Zbyt wiele żądań. Proszę spróbować później!",
|
||||||
"@tooManyRequestsWarning": {
|
"@tooManyRequestsWarning": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
|
@ -1799,9 +1788,7 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"messageInfo": "Informacje o wiadomości",
|
"messageInfo": "Informacje o wiadomości",
|
||||||
"@messageInfo": {},
|
|
||||||
"time": "Czas",
|
"time": "Czas",
|
||||||
"@time": {},
|
|
||||||
"messageType": "Rodzaj wiadomości",
|
"messageType": "Rodzaj wiadomości",
|
||||||
"@messageType": {},
|
"@messageType": {},
|
||||||
"waitingPartnerAcceptRequest": "Oczekiwanie na zaakceptowanie prośby przez drugą osobę…",
|
"waitingPartnerAcceptRequest": "Oczekiwanie na zaakceptowanie prośby przez drugą osobę…",
|
||||||
|
|
@ -1830,7 +1817,6 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"removeFromSpace": "Usuń z przestrzeni",
|
"removeFromSpace": "Usuń z przestrzeni",
|
||||||
"@removeFromSpace": {},
|
|
||||||
"extremeOffensive": "Bardzo obraźliwe",
|
"extremeOffensive": "Bardzo obraźliwe",
|
||||||
"@extremeOffensive": {
|
"@extremeOffensive": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1856,9 +1842,7 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"recoveryKey": "Klucz odzyskiwania",
|
"recoveryKey": "Klucz odzyskiwania",
|
||||||
"@recoveryKey": {},
|
|
||||||
"recoveryKeyLost": "Utracono klucz odzyskiwania?",
|
"recoveryKeyLost": "Utracono klucz odzyskiwania?",
|
||||||
"@recoveryKeyLost": {},
|
|
||||||
"sentCallInformations": "{senderName} wysłał/-a informacje o połączeniu",
|
"sentCallInformations": "{senderName} wysłał/-a informacje o połączeniu",
|
||||||
"@sentCallInformations": {
|
"@sentCallInformations": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1889,15 +1873,11 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"sender": "Nadawca",
|
"sender": "Nadawca",
|
||||||
"@sender": {},
|
|
||||||
"openGallery": "Otwórz galerię",
|
"openGallery": "Otwórz galerię",
|
||||||
"@openGallery": {},
|
|
||||||
"start": "Start",
|
"start": "Start",
|
||||||
"@start": {},
|
|
||||||
"pleaseEnterRecoveryKeyDescription": "Aby odblokować wcześniejsze wiadomości, wprowadź swój klucz odzyskiwania, który został wygenerowany w poprzedniej sesji. Twój klucz odzyskiwania NIE jest Twoim hasłem.",
|
"pleaseEnterRecoveryKeyDescription": "Aby odblokować wcześniejsze wiadomości, wprowadź swój klucz odzyskiwania, który został wygenerowany w poprzedniej sesji. Twój klucz odzyskiwania NIE jest Twoim hasłem.",
|
||||||
"@pleaseEnterRecoveryKeyDescription": {},
|
"@pleaseEnterRecoveryKeyDescription": {},
|
||||||
"hydrate": "Przywracanie z pliku kopii zapasowej",
|
"hydrate": "Przywracanie z pliku kopii zapasowej",
|
||||||
"@hydrate": {},
|
|
||||||
"noMatrixServer": "{server1} nie jest serwerem Matriksa, czy chcesz zamiast niego użyć {server2}?",
|
"noMatrixServer": "{server1} nie jest serwerem Matriksa, czy chcesz zamiast niego użyć {server2}?",
|
||||||
"@noMatrixServer": {
|
"@noMatrixServer": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1935,7 +1915,6 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"unverified": "Niezweryfikowane",
|
"unverified": "Niezweryfikowane",
|
||||||
"@unverified": {},
|
|
||||||
"wipeChatBackup": "Wymazać kopię zapasową czatu, aby utworzyć nowy klucz odzyskiwania?",
|
"wipeChatBackup": "Wymazać kopię zapasową czatu, aby utworzyć nowy klucz odzyskiwania?",
|
||||||
"@wipeChatBackup": {
|
"@wipeChatBackup": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1947,11 +1926,8 @@
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"reportUser": "Zgłoś użytkownika",
|
"reportUser": "Zgłoś użytkownika",
|
||||||
"@reportUser": {},
|
|
||||||
"dismiss": "Odrzuć",
|
"dismiss": "Odrzuć",
|
||||||
"@dismiss": {},
|
|
||||||
"markAsRead": "Oznacz jako przeczytane",
|
"markAsRead": "Oznacz jako przeczytane",
|
||||||
"@markAsRead": {},
|
|
||||||
"passphraseOrKey": "fraza dostępu lub klucz odzyskiwania",
|
"passphraseOrKey": "fraza dostępu lub klucz odzyskiwania",
|
||||||
"@passphraseOrKey": {
|
"@passphraseOrKey": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -1969,38 +1945,26 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"commandHint_markasdm": "Oznacz jako pokój wiadomości bezpośrednich dla podanego Matrix ID",
|
"commandHint_markasdm": "Oznacz jako pokój wiadomości bezpośrednich dla podanego Matrix ID",
|
||||||
"@commandHint_markasdm": {},
|
|
||||||
"confirmMatrixId": "Potwierdź swój identyfikator Matrix w celu usunięcia konta.",
|
"confirmMatrixId": "Potwierdź swój identyfikator Matrix w celu usunięcia konta.",
|
||||||
"@confirmMatrixId": {},
|
|
||||||
"commandHint_markasgroup": "Oznacz jako grupę",
|
"commandHint_markasgroup": "Oznacz jako grupę",
|
||||||
"@commandHint_markasgroup": {},
|
|
||||||
"noEmotesFound": "Nie znaleziono żadnych emotikonów. 😕",
|
"noEmotesFound": "Nie znaleziono żadnych emotikonów. 😕",
|
||||||
"@noEmotesFound": {
|
"@noEmotesFound": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"dehydrate": "Eksportuj sesję i wymaż urządzenie",
|
"dehydrate": "Eksportuj sesję i wymaż urządzenie",
|
||||||
"@dehydrate": {},
|
|
||||||
"dehydrateWarning": "Tego nie można cofnąć. Upewnij się, że plik kopii zapasowej jest bezpiecznie przechowywany.",
|
"dehydrateWarning": "Tego nie można cofnąć. Upewnij się, że plik kopii zapasowej jest bezpiecznie przechowywany.",
|
||||||
"@dehydrateWarning": {},
|
"@dehydrateWarning": {},
|
||||||
"unsupportedAndroidVersion": "Nieobsługiwana wersja systemu Android",
|
"unsupportedAndroidVersion": "Nieobsługiwana wersja systemu Android",
|
||||||
"@unsupportedAndroidVersion": {},
|
"@unsupportedAndroidVersion": {},
|
||||||
"pinMessage": "Przypnij do pokoju",
|
"pinMessage": "Przypnij do pokoju",
|
||||||
"@pinMessage": {},
|
|
||||||
"confirmEventUnpin": "Czy na pewno chcesz trwale odpiąć wydarzenie?",
|
"confirmEventUnpin": "Czy na pewno chcesz trwale odpiąć wydarzenie?",
|
||||||
"@confirmEventUnpin": {},
|
|
||||||
"youJoinedTheChat": "Dołączono do czatu",
|
"youJoinedTheChat": "Dołączono do czatu",
|
||||||
"@youJoinedTheChat": {},
|
|
||||||
"user": "Użytkownik",
|
"user": "Użytkownik",
|
||||||
"@user": {},
|
|
||||||
"custom": "Własne",
|
"custom": "Własne",
|
||||||
"@custom": {},
|
|
||||||
"newGroup": "Nowa grupa",
|
"newGroup": "Nowa grupa",
|
||||||
"@newGroup": {},
|
|
||||||
"newSpace": "Nowa przestrzeń",
|
"newSpace": "Nowa przestrzeń",
|
||||||
"@newSpace": {},
|
|
||||||
"fileIsTooBigForServer": "Nie udało się wysłać! Ten serwer obsługuje załączniki o maksymalnej wielkości {max}.",
|
"fileIsTooBigForServer": "Nie udało się wysłać! Ten serwer obsługuje załączniki o maksymalnej wielkości {max}.",
|
||||||
"@fileIsTooBigForServer": {},
|
|
||||||
"youBannedUser": "Zbanowałeś/-aś {user}",
|
"youBannedUser": "Zbanowałeś/-aś {user}",
|
||||||
"@youBannedUser": {
|
"@youBannedUser": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
|
|
@ -2010,7 +1974,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"users": "Użytkownicy",
|
"users": "Użytkownicy",
|
||||||
"@users": {},
|
|
||||||
"countFiles": "{count} plików",
|
"countFiles": "{count} plików",
|
||||||
"@countFiles": {
|
"@countFiles": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
|
|
@ -2022,27 +1985,19 @@
|
||||||
"noOtherDevicesFound": "Nie znaleziono innych urządzeń",
|
"noOtherDevicesFound": "Nie znaleziono innych urządzeń",
|
||||||
"@noOtherDevicesFound": {},
|
"@noOtherDevicesFound": {},
|
||||||
"encryptThisChat": "Zaszyfruj ten czat",
|
"encryptThisChat": "Zaszyfruj ten czat",
|
||||||
"@encryptThisChat": {},
|
|
||||||
"disableEncryptionWarning": "Ze względów bezpieczeństwa nie można wyłączyć szyfrowania w czacie, w którym zostało ono wcześniej włączone.",
|
"disableEncryptionWarning": "Ze względów bezpieczeństwa nie można wyłączyć szyfrowania w czacie, w którym zostało ono wcześniej włączone.",
|
||||||
"@disableEncryptionWarning": {},
|
|
||||||
"deviceKeys": "Klucze urządzenia:",
|
"deviceKeys": "Klucze urządzenia:",
|
||||||
"@deviceKeys": {},
|
"@deviceKeys": {},
|
||||||
"saveKeyManuallyDescription": "Zapisz ten klucz ręcznie, uruchamiając systemowe okno dialogowe udostępniania lub schowek.",
|
"saveKeyManuallyDescription": "Zapisz ten klucz ręcznie, uruchamiając systemowe okno dialogowe udostępniania lub schowek.",
|
||||||
"@saveKeyManuallyDescription": {},
|
|
||||||
"screenSharingTitle": "udostępnianie ekranu",
|
"screenSharingTitle": "udostępnianie ekranu",
|
||||||
"@screenSharingTitle": {},
|
"@screenSharingTitle": {},
|
||||||
"noKeyForThisMessage": "Może się to zdarzyć, jeśli wiadomość została wysłana przed zalogowaniem się na to konto na tym urządzeniu.\n\nMożliwe jest również, że nadawca zablokował Twoje urządzenie lub coś poszło nie tak z połączeniem internetowym.\n\nJesteś w stanie odczytać wiadomość na innej sesji? W takim razie możesz przenieść z niej wiadomość! Wejdź w Ustawienia > Urządzenia i upewnij się, że Twoje urządzenia zweryfikowały się wzajemnie. Gdy następnym razem otworzysz pokój i obie sesje będą włączone, klucze zostaną przekazane automatycznie.\n\nNie chcesz stracić kluczy podczas wylogowania lub przełączania urządzeń? Upewnij się, że w ustawieniach masz włączoną kopię zapasową czatu.",
|
"noKeyForThisMessage": "Może się to zdarzyć, jeśli wiadomość została wysłana przed zalogowaniem się na to konto na tym urządzeniu.\n\nMożliwe jest również, że nadawca zablokował Twoje urządzenie lub coś poszło nie tak z połączeniem internetowym.\n\nJesteś w stanie odczytać wiadomość na innej sesji? W takim razie możesz przenieść z niej wiadomość! Wejdź w Ustawienia > Urządzenia i upewnij się, że Twoje urządzenia zweryfikowały się wzajemnie. Gdy następnym razem otworzysz pokój i obie sesje będą włączone, klucze zostaną przekazane automatycznie.\n\nNie chcesz stracić kluczy podczas wylogowania lub przełączania urządzeń? Upewnij się, że w ustawieniach masz włączoną kopię zapasową czatu.",
|
||||||
"@noKeyForThisMessage": {},
|
|
||||||
"sorryThatsNotPossible": "Przepraszamy... to nie jest możliwe",
|
"sorryThatsNotPossible": "Przepraszamy... to nie jest możliwe",
|
||||||
"@sorryThatsNotPossible": {},
|
|
||||||
"noBackupWarning": "Uwaga! Bez włączenia kopii zapasowej czatu, stracisz dostęp do swoich zaszyfrowanych wiadomości. Zaleca się włączenie kopii zapasowej czatu przed wylogowaniem.",
|
"noBackupWarning": "Uwaga! Bez włączenia kopii zapasowej czatu, stracisz dostęp do swoich zaszyfrowanych wiadomości. Zaleca się włączenie kopii zapasowej czatu przed wylogowaniem.",
|
||||||
"@noBackupWarning": {},
|
|
||||||
"commandHint_googly": "Wyślij kręcące się oczka",
|
"commandHint_googly": "Wyślij kręcące się oczka",
|
||||||
"@commandHint_googly": {},
|
"@commandHint_googly": {},
|
||||||
"storeInAndroidKeystore": "Przechowaj w Android KeyStore",
|
"storeInAndroidKeystore": "Przechowaj w Android KeyStore",
|
||||||
"@storeInAndroidKeystore": {},
|
|
||||||
"commandHint_cuddle": "Wyślij przytulenie",
|
"commandHint_cuddle": "Wyślij przytulenie",
|
||||||
"@commandHint_cuddle": {},
|
|
||||||
"googlyEyesContent": "{senderName} wysyła ci kręcące się oczka",
|
"googlyEyesContent": "{senderName} wysyła ci kręcące się oczka",
|
||||||
"@googlyEyesContent": {
|
"@googlyEyesContent": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2071,7 +2026,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"commandHint_hug": "Wyślij uścisk",
|
"commandHint_hug": "Wyślij uścisk",
|
||||||
"@commandHint_hug": {},
|
|
||||||
"reactedWith": "{sender} zareagował/-a z {reaction}",
|
"reactedWith": "{sender} zareagował/-a z {reaction}",
|
||||||
"@reactedWith": {
|
"@reactedWith": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2085,21 +2039,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"emojis": "Emoji",
|
"emojis": "Emoji",
|
||||||
"@emojis": {},
|
|
||||||
"placeCall": "Zadzwoń",
|
"placeCall": "Zadzwoń",
|
||||||
"@placeCall": {},
|
|
||||||
"voiceCall": "Połączenie głosowe",
|
"voiceCall": "Połączenie głosowe",
|
||||||
"@voiceCall": {},
|
|
||||||
"unsupportedAndroidVersionLong": "Ta funkcja wymaga nowszej wersji systemu Android. Sprawdź aktualizacje lub wsparcie Lineage OS.",
|
"unsupportedAndroidVersionLong": "Ta funkcja wymaga nowszej wersji systemu Android. Sprawdź aktualizacje lub wsparcie Lineage OS.",
|
||||||
"@unsupportedAndroidVersionLong": {},
|
|
||||||
"videoCallsBetaWarning": "Należy pamiętać, że połączenia wideo są obecnie w fazie beta. Mogą nie działać zgodnie z oczekiwaniami lub nie działać w ogóle na wszystkich platformach.",
|
"videoCallsBetaWarning": "Należy pamiętać, że połączenia wideo są obecnie w fazie beta. Mogą nie działać zgodnie z oczekiwaniami lub nie działać w ogóle na wszystkich platformach.",
|
||||||
"@videoCallsBetaWarning": {},
|
|
||||||
"experimentalVideoCalls": "Eksperymentalne połączenia wideo",
|
"experimentalVideoCalls": "Eksperymentalne połączenia wideo",
|
||||||
"@experimentalVideoCalls": {},
|
"@experimentalVideoCalls": {},
|
||||||
"youRejectedTheInvitation": "Odrzucono zaproszenie",
|
"youRejectedTheInvitation": "Odrzucono zaproszenie",
|
||||||
"@youRejectedTheInvitation": {},
|
|
||||||
"youAcceptedTheInvitation": "👍 Zaakceptowałeś/-aś zaproszenie",
|
"youAcceptedTheInvitation": "👍 Zaakceptowałeś/-aś zaproszenie",
|
||||||
"@youAcceptedTheInvitation": {},
|
|
||||||
"youHaveWithdrawnTheInvitationFor": "Wycofano zaproszenie dla {user}",
|
"youHaveWithdrawnTheInvitationFor": "Wycofano zaproszenie dla {user}",
|
||||||
"@youHaveWithdrawnTheInvitationFor": {
|
"@youHaveWithdrawnTheInvitationFor": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
|
|
@ -2149,15 +2096,10 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"unlockOldMessages": "Odblokuj stare wiadomości",
|
"unlockOldMessages": "Odblokuj stare wiadomości",
|
||||||
"@unlockOldMessages": {},
|
|
||||||
"storeInSecureStorageDescription": "Przechowaj klucz odzyskiwania w bezpiecznym magazynie tego urządzenia.",
|
"storeInSecureStorageDescription": "Przechowaj klucz odzyskiwania w bezpiecznym magazynie tego urządzenia.",
|
||||||
"@storeInSecureStorageDescription": {},
|
|
||||||
"storeInAppleKeyChain": "Przechowaj w pęku kluczy Apple",
|
"storeInAppleKeyChain": "Przechowaj w pęku kluczy Apple",
|
||||||
"@storeInAppleKeyChain": {},
|
|
||||||
"storeSecurlyOnThisDevice": "Przechowaj bezpiecznie na tym urządzeniu",
|
"storeSecurlyOnThisDevice": "Przechowaj bezpiecznie na tym urządzeniu",
|
||||||
"@storeSecurlyOnThisDevice": {},
|
|
||||||
"foregroundServiceRunning": "To powiadomienie pojawia się, gdy usługa w tle jest uruchomiona.",
|
"foregroundServiceRunning": "To powiadomienie pojawia się, gdy usługa w tle jest uruchomiona.",
|
||||||
"@foregroundServiceRunning": {},
|
|
||||||
"screenSharingDetail": "Udostępniasz swój ekran w FluffyChat",
|
"screenSharingDetail": "Udostępniasz swój ekran w FluffyChat",
|
||||||
"@screenSharingDetail": {},
|
"@screenSharingDetail": {},
|
||||||
"whyIsThisMessageEncrypted": "Dlaczego nie można odczytać tej wiadomości?",
|
"whyIsThisMessageEncrypted": "Dlaczego nie można odczytać tej wiadomości?",
|
||||||
|
|
@ -2165,7 +2107,6 @@
|
||||||
"allSpaces": "Wszystkie przestrzenie",
|
"allSpaces": "Wszystkie przestrzenie",
|
||||||
"@allSpaces": {},
|
"@allSpaces": {},
|
||||||
"doNotShowAgain": "Nie pokazuj ponownie",
|
"doNotShowAgain": "Nie pokazuj ponownie",
|
||||||
"@doNotShowAgain": {},
|
|
||||||
"wasDirectChatDisplayName": "Pusty czat (wcześniej {oldDisplayName})",
|
"wasDirectChatDisplayName": "Pusty czat (wcześniej {oldDisplayName})",
|
||||||
"@wasDirectChatDisplayName": {
|
"@wasDirectChatDisplayName": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2176,9 +2117,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"newSpaceDescription": "Przestrzenie pozwalają na konsolidację czatów i budowanie prywatnych lub publicznych społeczności.",
|
"newSpaceDescription": "Przestrzenie pozwalają na konsolidację czatów i budowanie prywatnych lub publicznych społeczności.",
|
||||||
"@newSpaceDescription": {},
|
|
||||||
"reopenChat": "Otwórz ponownie czat",
|
"reopenChat": "Otwórz ponownie czat",
|
||||||
"@reopenChat": {},
|
|
||||||
"fileHasBeenSavedAt": "Plik został zapisany w ścieżce {path}",
|
"fileHasBeenSavedAt": "Plik został zapisany w ścieżce {path}",
|
||||||
"@fileHasBeenSavedAt": {
|
"@fileHasBeenSavedAt": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2189,39 +2128,24 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"addToBundle": "Dodaj do pakietu",
|
"addToBundle": "Dodaj do pakietu",
|
||||||
"@addToBundle": {},
|
|
||||||
"bundleName": "Nazwa pakietu",
|
"bundleName": "Nazwa pakietu",
|
||||||
"@bundleName": {},
|
|
||||||
"editBundlesForAccount": "Edytuj pakiety dla tego konta",
|
"editBundlesForAccount": "Edytuj pakiety dla tego konta",
|
||||||
"@editBundlesForAccount": {},
|
|
||||||
"jumpToLastReadMessage": "Przejdź do ostatnio przeczytanej wiadomości",
|
"jumpToLastReadMessage": "Przejdź do ostatnio przeczytanej wiadomości",
|
||||||
"@jumpToLastReadMessage": {},
|
|
||||||
"readUpToHere": "Czytaj do tego miejsca",
|
"readUpToHere": "Czytaj do tego miejsca",
|
||||||
"@readUpToHere": {},
|
|
||||||
"jump": "Przejdź",
|
"jump": "Przejdź",
|
||||||
"@jump": {},
|
|
||||||
"removeFromBundle": "Usuń z tego pakietu",
|
"removeFromBundle": "Usuń z tego pakietu",
|
||||||
"@removeFromBundle": {},
|
|
||||||
"openLinkInBrowser": "Otwórz link w przeglądarce",
|
"openLinkInBrowser": "Otwórz link w przeglądarce",
|
||||||
"@openLinkInBrowser": {},
|
"@openLinkInBrowser": {},
|
||||||
"reportErrorDescription": "😭 O nie! Coś poszło nie tak. Spróbuj ponownie później. Jeśli chcesz, możesz zgłosić ten błąd autorom programu.",
|
"reportErrorDescription": "😭 O nie! Coś poszło nie tak. Spróbuj ponownie później. Jeśli chcesz, możesz zgłosić ten błąd autorom programu.",
|
||||||
"@reportErrorDescription": {},
|
|
||||||
"setColorTheme": "Ustal styl kolorów:",
|
"setColorTheme": "Ustal styl kolorów:",
|
||||||
"@setColorTheme": {},
|
|
||||||
"tryAgain": "Spróbuj ponownie",
|
"tryAgain": "Spróbuj ponownie",
|
||||||
"@tryAgain": {},
|
|
||||||
"messagesStyle": "Wiadomości:",
|
"messagesStyle": "Wiadomości:",
|
||||||
"@messagesStyle": {},
|
|
||||||
"chatDescription": "Opis czatu",
|
"chatDescription": "Opis czatu",
|
||||||
"@chatDescription": {},
|
|
||||||
"invalidServerName": "Nieprawidłowa nazwa serwera",
|
"invalidServerName": "Nieprawidłowa nazwa serwera",
|
||||||
"@invalidServerName": {},
|
|
||||||
"chatPermissions": "Uprawnienia w czacie",
|
"chatPermissions": "Uprawnienia w czacie",
|
||||||
"@chatPermissions": {},
|
"@chatPermissions": {},
|
||||||
"setChatDescription": "Ustaw opis czatu",
|
"setChatDescription": "Ustaw opis czatu",
|
||||||
"@setChatDescription": {},
|
|
||||||
"importFromZipFile": "Zaimportuj z pliku .zip",
|
"importFromZipFile": "Zaimportuj z pliku .zip",
|
||||||
"@importFromZipFile": {},
|
|
||||||
"redactedBy": "Usunięte przez {username}",
|
"redactedBy": "Usunięte przez {username}",
|
||||||
"@redactedBy": {
|
"@redactedBy": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2232,7 +2156,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"optionalRedactReason": "(Opcjonalnie) Powód usunięcia tej wiadomości...",
|
"optionalRedactReason": "(Opcjonalnie) Powód usunięcia tej wiadomości...",
|
||||||
"@optionalRedactReason": {},
|
|
||||||
"exportEmotePack": "Eksportuj pakiet emotikonów jako .zip",
|
"exportEmotePack": "Eksportuj pakiet emotikonów jako .zip",
|
||||||
"@exportEmotePack": {},
|
"@exportEmotePack": {},
|
||||||
"redactedByBecause": "Usunięte przez {username} z powodu „{reason}”",
|
"redactedByBecause": "Usunięte przez {username} z powodu „{reason}”",
|
||||||
|
|
@ -2248,13 +2171,10 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"redactMessageDescription": "Wiadomość zostanie usunięta u wszystkich uczestników tej rozmowy. Tego nie można cofnąć.",
|
"redactMessageDescription": "Wiadomość zostanie usunięta u wszystkich uczestników tej rozmowy. Tego nie można cofnąć.",
|
||||||
"@redactMessageDescription": {},
|
|
||||||
"invalidInput": "Nieprawidłowe dane!",
|
"invalidInput": "Nieprawidłowe dane!",
|
||||||
"@invalidInput": {},
|
|
||||||
"report": "zgłoś",
|
"report": "zgłoś",
|
||||||
"@report": {},
|
"@report": {},
|
||||||
"directChat": "Czat bezpośredni",
|
"directChat": "Czat bezpośredni",
|
||||||
"@directChat": {},
|
|
||||||
"wrongPinEntered": "Wprowadzono nieprawidłowy kod PIN! Spróbuj ponownie za {seconds} sekund...",
|
"wrongPinEntered": "Wprowadzono nieprawidłowy kod PIN! Spróbuj ponownie za {seconds} sekund...",
|
||||||
"@wrongPinEntered": {
|
"@wrongPinEntered": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2265,19 +2185,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sendTypingNotifications": "Wysyłaj powiadomienie o pisaniu",
|
"sendTypingNotifications": "Wysyłaj powiadomienie o pisaniu",
|
||||||
"@sendTypingNotifications": {},
|
|
||||||
"inviteGroupChat": "📨 Zaproszenie do rozmowy grupowej",
|
"inviteGroupChat": "📨 Zaproszenie do rozmowy grupowej",
|
||||||
"@inviteGroupChat": {},
|
"@inviteGroupChat": {},
|
||||||
"importEmojis": "Zaimportuj emotikony",
|
"importEmojis": "Zaimportuj emotikony",
|
||||||
"@importEmojis": {},
|
|
||||||
"noChatDescriptionYet": "Nie utworzono jeszcze opisu czatu.",
|
"noChatDescriptionYet": "Nie utworzono jeszcze opisu czatu.",
|
||||||
"@noChatDescriptionYet": {},
|
|
||||||
"notAnImage": "To nie jest plik obrazu.",
|
"notAnImage": "To nie jest plik obrazu.",
|
||||||
"@notAnImage": {},
|
|
||||||
"chatDescriptionHasBeenChanged": "Zmieniono opis czatu",
|
"chatDescriptionHasBeenChanged": "Zmieniono opis czatu",
|
||||||
"@chatDescriptionHasBeenChanged": {},
|
"@chatDescriptionHasBeenChanged": {},
|
||||||
"shareInviteLink": "Udostępnij link z zaproszeniem",
|
"shareInviteLink": "Udostępnij link z zaproszeniem",
|
||||||
"@shareInviteLink": {},
|
|
||||||
"emoteKeyboardNoRecents": "Tutaj pojawiają się ostatnio używane emotikony...",
|
"emoteKeyboardNoRecents": "Tutaj pojawiają się ostatnio używane emotikony...",
|
||||||
"@emoteKeyboardNoRecents": {
|
"@emoteKeyboardNoRecents": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2286,47 +2201,29 @@
|
||||||
"replace": "Zastąp",
|
"replace": "Zastąp",
|
||||||
"@replace": {},
|
"@replace": {},
|
||||||
"createGroup": "Utwórz grupę",
|
"createGroup": "Utwórz grupę",
|
||||||
"@createGroup": {},
|
|
||||||
"importNow": "Zaimportuj",
|
"importNow": "Zaimportuj",
|
||||||
"@importNow": {},
|
|
||||||
"invite": "Zaproszenie",
|
"invite": "Zaproszenie",
|
||||||
"@invite": {},
|
|
||||||
"block": "Zablokuj",
|
"block": "Zablokuj",
|
||||||
"@block": {},
|
|
||||||
"blockedUsers": "Zablokowani użytkownicy",
|
"blockedUsers": "Zablokowani użytkownicy",
|
||||||
"@blockedUsers": {},
|
|
||||||
"blockUsername": "Ignoruj użytkownika",
|
"blockUsername": "Ignoruj użytkownika",
|
||||||
"@blockUsername": {},
|
"@blockUsername": {},
|
||||||
"transparent": "Przezroczystość",
|
"transparent": "Przezroczystość",
|
||||||
"@transparent": {},
|
|
||||||
"select": "Zaznacz",
|
"select": "Zaznacz",
|
||||||
"@select": {},
|
|
||||||
"calls": "Połączenia",
|
"calls": "Połączenia",
|
||||||
"@calls": {},
|
|
||||||
"overview": "Podsumowanie",
|
"overview": "Podsumowanie",
|
||||||
"@overview": {},
|
|
||||||
"learnMore": "Dowiedz się więcej",
|
"learnMore": "Dowiedz się więcej",
|
||||||
"@learnMore": {},
|
|
||||||
"groupName": "Nazwa grupy",
|
"groupName": "Nazwa grupy",
|
||||||
"@groupName": {},
|
"@groupName": {},
|
||||||
"newPassword": "Nowe hasło",
|
"newPassword": "Nowe hasło",
|
||||||
"@newPassword": {},
|
|
||||||
"thisDevice": "To urządzenie:",
|
"thisDevice": "To urządzenie:",
|
||||||
"@thisDevice": {},
|
|
||||||
"gallery": "Galeria",
|
"gallery": "Galeria",
|
||||||
"@gallery": {},
|
|
||||||
"files": "Pliki",
|
"files": "Pliki",
|
||||||
"@files": {},
|
|
||||||
"discover": "Odkrywaj",
|
"discover": "Odkrywaj",
|
||||||
"@discover": {},
|
|
||||||
"restricted": "Ograniczone",
|
"restricted": "Ograniczone",
|
||||||
"@restricted": {},
|
"@restricted": {},
|
||||||
"nothingFound": "Nic nie odnaleziono...",
|
"nothingFound": "Nic nie odnaleziono...",
|
||||||
"@nothingFound": {},
|
|
||||||
"stickers": "Naklejki",
|
"stickers": "Naklejki",
|
||||||
"@stickers": {},
|
|
||||||
"noChatsFoundHere": "Nie jeszcze ma żadnych czatów. Wciśnij poniższy przycisk, aby rozpocząć nowy czat. ⤵️",
|
"noChatsFoundHere": "Nie jeszcze ma żadnych czatów. Wciśnij poniższy przycisk, aby rozpocząć nowy czat. ⤵️",
|
||||||
"@noChatsFoundHere": {},
|
|
||||||
"hideRedactedMessagesBody": "Usunięte wiadomości nie będą widoczne w czacie.",
|
"hideRedactedMessagesBody": "Usunięte wiadomości nie będą widoczne w czacie.",
|
||||||
"@hideRedactedMessagesBody": {},
|
"@hideRedactedMessagesBody": {},
|
||||||
"passwordRecoverySettings": "Ustawienia odzyskiwania hasła",
|
"passwordRecoverySettings": "Ustawienia odzyskiwania hasła",
|
||||||
|
|
@ -2340,9 +2237,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"archiveRoomDescription": "Czat zostanie przeniesiony do archiwum. Pozostali użytkownicy będą mogli zobaczyć, że opuściłeś/-aś czat.",
|
"archiveRoomDescription": "Czat zostanie przeniesiony do archiwum. Pozostali użytkownicy będą mogli zobaczyć, że opuściłeś/-aś czat.",
|
||||||
"@archiveRoomDescription": {},
|
|
||||||
"yourGlobalUserIdIs": "Twój globalny identyfikator to: ",
|
"yourGlobalUserIdIs": "Twój globalny identyfikator to: ",
|
||||||
"@yourGlobalUserIdIs": {},
|
|
||||||
"canceledKeyVerification": "{sender} anulował/-a weryfikację kluczy",
|
"canceledKeyVerification": "{sender} anulował/-a weryfikację kluczy",
|
||||||
"@canceledKeyVerification": {
|
"@canceledKeyVerification": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2362,27 +2257,17 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"commandHint_ignore": "Ignoruj podany identyfikator Matrix",
|
"commandHint_ignore": "Ignoruj podany identyfikator Matrix",
|
||||||
"@commandHint_ignore": {},
|
|
||||||
"commandHint_unignore": "Przestań ignorować podany identyfikator Matrix",
|
"commandHint_unignore": "Przestań ignorować podany identyfikator Matrix",
|
||||||
"@commandHint_unignore": {},
|
|
||||||
"changeTheChatPermissions": "Zmień uprawnienia w czacie",
|
"changeTheChatPermissions": "Zmień uprawnienia w czacie",
|
||||||
"@changeTheChatPermissions": {},
|
|
||||||
"changelog": "Lista zmian",
|
"changelog": "Lista zmian",
|
||||||
"@changelog": {},
|
|
||||||
"inviteOtherUsers": "Zaproś innych użytkowników do tego czatu",
|
"inviteOtherUsers": "Zaproś innych użytkowników do tego czatu",
|
||||||
"@inviteOtherUsers": {},
|
|
||||||
"blockListDescription": "Możesz zablokować uciążliwych użytkowników. Nie będziesz widzieć ani otrzymywać wiadomości oraz zaproszeń od nich.",
|
"blockListDescription": "Możesz zablokować uciążliwych użytkowników. Nie będziesz widzieć ani otrzymywać wiadomości oraz zaproszeń od nich.",
|
||||||
"@blockListDescription": {},
|
|
||||||
"formattedMessages": "Sformatowane wiadomości",
|
"formattedMessages": "Sformatowane wiadomości",
|
||||||
"@formattedMessages": {},
|
|
||||||
"banUserDescription": "Użytkownik zostanie zbanowany w czacie i nie będzie w stanie dołączyć do czatu do momentu odbanowania.",
|
"banUserDescription": "Użytkownik zostanie zbanowany w czacie i nie będzie w stanie dołączyć do czatu do momentu odbanowania.",
|
||||||
"@banUserDescription": {},
|
"@banUserDescription": {},
|
||||||
"sendReadReceipts": "Wysyłaj powiadomienia o przeczytaniu wiadomości",
|
"sendReadReceipts": "Wysyłaj powiadomienia o przeczytaniu wiadomości",
|
||||||
"@sendReadReceipts": {},
|
|
||||||
"verifyOtherDevice": "🔐 Zweryfikuj inne urządzenie",
|
"verifyOtherDevice": "🔐 Zweryfikuj inne urządzenie",
|
||||||
"@verifyOtherDevice": {},
|
|
||||||
"prepareSendingAttachment": "Przygotuj wysyłanie załącznika...",
|
"prepareSendingAttachment": "Przygotuj wysyłanie załącznika...",
|
||||||
"@prepareSendingAttachment": {},
|
|
||||||
"acceptedKeyVerification": "{sender} zaakceptował/-a weryfikację kluczy",
|
"acceptedKeyVerification": "{sender} zaakceptował/-a weryfikację kluczy",
|
||||||
"@acceptedKeyVerification": {
|
"@acceptedKeyVerification": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2393,7 +2278,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"databaseMigrationTitle": "Baza danych jest zoptymalizowana",
|
"databaseMigrationTitle": "Baza danych jest zoptymalizowana",
|
||||||
"@databaseMigrationTitle": {},
|
|
||||||
"hasKnocked": "{user} zapukał-/a",
|
"hasKnocked": "{user} zapukał-/a",
|
||||||
"@hasKnocked": {
|
"@hasKnocked": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
|
|
@ -2412,7 +2296,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"changeTheVisibilityOfChatHistory": "Zmień widoczność historii czatu",
|
"changeTheVisibilityOfChatHistory": "Zmień widoczność historii czatu",
|
||||||
"@changeTheVisibilityOfChatHistory": {},
|
|
||||||
"sendImages": "Wyślij {count} obrazów",
|
"sendImages": "Wyślij {count} obrazów",
|
||||||
"@sendImages": {
|
"@sendImages": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2446,11 +2329,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sendTypingNotificationsDescription": "Pozostali uczestnicy czatu mogą widzieć kiedy piszesz nową wiadomość.",
|
"sendTypingNotificationsDescription": "Pozostali uczestnicy czatu mogą widzieć kiedy piszesz nową wiadomość.",
|
||||||
"@sendTypingNotificationsDescription": {},
|
|
||||||
"sendReadReceiptsDescription": "Pozostali uczestnicy czatu mogą widzieć zobaczyć kiedy przeczytasz wiadomość.",
|
"sendReadReceiptsDescription": "Pozostali uczestnicy czatu mogą widzieć zobaczyć kiedy przeczytasz wiadomość.",
|
||||||
"@sendReadReceiptsDescription": {},
|
|
||||||
"noDatabaseEncryption": "Szyfrowanie bazy danych nie jest obsługiwane na tej platformie",
|
"noDatabaseEncryption": "Szyfrowanie bazy danych nie jest obsługiwane na tej platformie",
|
||||||
"@noDatabaseEncryption": {},
|
|
||||||
"thereAreCountUsersBlocked": "Obecnie jest {count} zablokowanych użytkowników.",
|
"thereAreCountUsersBlocked": "Obecnie jest {count} zablokowanych użytkowników.",
|
||||||
"@thereAreCountUsersBlocked": {
|
"@thereAreCountUsersBlocked": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2462,7 +2342,6 @@
|
||||||
"space": {}
|
"space": {}
|
||||||
},
|
},
|
||||||
"markAsUnread": "Oznacz jako nieprzeczytane",
|
"markAsUnread": "Oznacz jako nieprzeczytane",
|
||||||
"@markAsUnread": {},
|
|
||||||
"moderatorLevel": "{level} - Moderator",
|
"moderatorLevel": "{level} - Moderator",
|
||||||
"@moderatorLevel": {
|
"@moderatorLevel": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2482,25 +2361,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sendRoomNotifications": "Wysyłaj powiadomienia @room",
|
"sendRoomNotifications": "Wysyłaj powiadomienia @room",
|
||||||
"@sendRoomNotifications": {},
|
|
||||||
"chatPermissionsDescription": "Ustal jaki poziom uprawnień jest wymagany dla określonych czynności w czacie. Poziomy uprawnień 0, 50 i 100 zwykle dotyczą odpowiednio użytkowników, moderatorów i administratorów, ale możliwa jest dowolna gradacja.",
|
"chatPermissionsDescription": "Ustal jaki poziom uprawnień jest wymagany dla określonych czynności w czacie. Poziomy uprawnień 0, 50 i 100 zwykle dotyczą odpowiednio użytkowników, moderatorów i administratorów, ale możliwa jest dowolna gradacja.",
|
||||||
"@chatPermissionsDescription": {},
|
|
||||||
"changeTheCanonicalRoomAlias": "Zmień główny publiczny czatu",
|
"changeTheCanonicalRoomAlias": "Zmień główny publiczny czatu",
|
||||||
"@changeTheCanonicalRoomAlias": {},
|
|
||||||
"changeTheDescriptionOfTheGroup": "Zmień opis czatu",
|
"changeTheDescriptionOfTheGroup": "Zmień opis czatu",
|
||||||
"@changeTheDescriptionOfTheGroup": {},
|
|
||||||
"sendCanceled": "Anulowano wysyłanie",
|
"sendCanceled": "Anulowano wysyłanie",
|
||||||
"@sendCanceled": {},
|
"@sendCanceled": {},
|
||||||
"doesNotSeemToBeAValidHomeserver": "Wydaje się nie być kompatybilnym serwerem domowym. Niepoprawny adres URL?",
|
"doesNotSeemToBeAValidHomeserver": "Wydaje się nie być kompatybilnym serwerem domowym. Niepoprawny adres URL?",
|
||||||
"@doesNotSeemToBeAValidHomeserver": {},
|
|
||||||
"calculatingFileSize": "Obliczanie rozmiaru pliku...",
|
"calculatingFileSize": "Obliczanie rozmiaru pliku...",
|
||||||
"@calculatingFileSize": {},
|
|
||||||
"sendingAttachment": "Wysyłanie załącznika...",
|
"sendingAttachment": "Wysyłanie załącznika...",
|
||||||
"@sendingAttachment": {},
|
|
||||||
"generatingVideoThumbnail": "Generowanie podglądu filmu...",
|
"generatingVideoThumbnail": "Generowanie podglądu filmu...",
|
||||||
"@generatingVideoThumbnail": {},
|
|
||||||
"compressVideo": "Kompresowanie filmu...",
|
"compressVideo": "Kompresowanie filmu...",
|
||||||
"@compressVideo": {},
|
|
||||||
"sendingAttachmentCountOfCount": "Wysyłanie {index} z {length} części załącznika...",
|
"sendingAttachmentCountOfCount": "Wysyłanie {index} z {length} części załącznika...",
|
||||||
"@sendingAttachmentCountOfCount": {
|
"@sendingAttachmentCountOfCount": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
|
|
@ -2514,27 +2384,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"welcomeText": "No cześć! 👋 Tutaj FluffyChat. Możesz zapisać się do dowolnego serwera domowego, kompatybilnego z https://matrix.org i rozmawiać ze wszystkimi. To duża zdecentralizowana sieć czatów!",
|
"welcomeText": "No cześć! 👋 Tutaj FluffyChat. Możesz zapisać się do dowolnego serwera domowego, kompatybilnego z https://matrix.org i rozmawiać ze wszystkimi. To duża zdecentralizowana sieć czatów!",
|
||||||
"@welcomeText": {},
|
|
||||||
"blur": "Rozmazanie:",
|
"blur": "Rozmazanie:",
|
||||||
"@blur": {},
|
|
||||||
"opacity": "Przezroczystość:",
|
"opacity": "Przezroczystość:",
|
||||||
"@opacity": {},
|
|
||||||
"setWallpaper": "Ustaw tapetę",
|
"setWallpaper": "Ustaw tapetę",
|
||||||
"@setWallpaper": {},
|
|
||||||
"manageAccount": "Zarządzaj kontem",
|
"manageAccount": "Zarządzaj kontem",
|
||||||
"@manageAccount": {},
|
|
||||||
"noContactInformationProvided": "Serwer nie dostarcza żadnych poprawnych danych kontaktowych",
|
"noContactInformationProvided": "Serwer nie dostarcza żadnych poprawnych danych kontaktowych",
|
||||||
"@noContactInformationProvided": {},
|
|
||||||
"contactServerAdmin": "Skontaktuj się z administratorem serwera",
|
"contactServerAdmin": "Skontaktuj się z administratorem serwera",
|
||||||
"@contactServerAdmin": {},
|
|
||||||
"compress": "Skompresuj",
|
"compress": "Skompresuj",
|
||||||
"@compress": {},
|
|
||||||
"pleaseFillOut": "Proszę wypełnić",
|
"pleaseFillOut": "Proszę wypełnić",
|
||||||
"@pleaseFillOut": {},
|
|
||||||
"invalidUrl": "Niepoprawny adres URL",
|
"invalidUrl": "Niepoprawny adres URL",
|
||||||
"@invalidUrl": {},
|
"unableToJoinChat": "Nie udało się dołączyć do czatu. Rozmowa mogła zostać zakończona przez drugą stronę.",
|
||||||
"unableToJoinChat": "Nie udało się dołączyć do czatu. Może druga strona zakończyła już rozmowę?",
|
|
||||||
"@unableToJoinChat": {},
|
|
||||||
"aboutHomeserver": "O {homeserver}",
|
"aboutHomeserver": "O {homeserver}",
|
||||||
"@aboutHomeserver": {
|
"@aboutHomeserver": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2554,9 +2413,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"continueText": "Kontynuuj",
|
"continueText": "Kontynuuj",
|
||||||
"@continueText": {},
|
|
||||||
"noticeChatBackupDeviceVerification": "Uwaga: Urządzenia dodane do kopii zapasowej czatu automatycznie zostają zweryfikowane.",
|
"noticeChatBackupDeviceVerification": "Uwaga: Urządzenia dodane do kopii zapasowej czatu automatycznie zostają zweryfikowane.",
|
||||||
"@noticeChatBackupDeviceVerification": {},
|
|
||||||
"serverLimitReached": "Osiągnięto limit serwera. Czekanie {seconds} sekund...",
|
"serverLimitReached": "Osiągnięto limit serwera. Czekanie {seconds} sekund...",
|
||||||
"@serverLimitReached": {
|
"@serverLimitReached": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
|
|
@ -2567,35 +2424,21 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"oneOfYourDevicesIsNotVerified": "Jedno z Twoich urządzeń nie jest zweryfikowane",
|
"oneOfYourDevicesIsNotVerified": "Jedno z Twoich urządzeń nie jest zweryfikowane",
|
||||||
"@oneOfYourDevicesIsNotVerified": {},
|
|
||||||
"supportPage": "Strona obsługi użytkownika",
|
"supportPage": "Strona obsługi użytkownika",
|
||||||
"@supportPage": {},
|
|
||||||
"serverInformation": "Informacje o serwerze:",
|
"serverInformation": "Informacje o serwerze:",
|
||||||
"@serverInformation": {},
|
|
||||||
"name": "Nazwa",
|
"name": "Nazwa",
|
||||||
"@name": {},
|
|
||||||
"website": "Strona internetowa",
|
"website": "Strona internetowa",
|
||||||
"@website": {},
|
|
||||||
"contactServerSecurity": "Skontaktuj się z działem bezpieczeństwa serwera",
|
"contactServerSecurity": "Skontaktuj się z działem bezpieczeństwa serwera",
|
||||||
"@contactServerSecurity": {},
|
|
||||||
"version": "Wersja",
|
"version": "Wersja",
|
||||||
"@version": {},
|
|
||||||
"accessAndVisibility": "Dostęp i widoczność",
|
"accessAndVisibility": "Dostęp i widoczność",
|
||||||
"@accessAndVisibility": {},
|
|
||||||
"customEmojisAndStickers": "Własne emotikony i naklejki",
|
"customEmojisAndStickers": "Własne emotikony i naklejki",
|
||||||
"@customEmojisAndStickers": {},
|
|
||||||
"globalChatId": "Globalny identyfikator czatu",
|
"globalChatId": "Globalny identyfikator czatu",
|
||||||
"@globalChatId": {},
|
|
||||||
"accessAndVisibilityDescription": "Kto może dołączyć do tego czatu i w jaki sposób można ten czat znaleźć.",
|
"accessAndVisibilityDescription": "Kto może dołączyć do tego czatu i w jaki sposób można ten czat znaleźć.",
|
||||||
"@accessAndVisibilityDescription": {},
|
|
||||||
"customEmojisAndStickersBody": "Dodaj lub podziel się własnymi emotikonami i naklejkami, które będą mogły być użyte w dowolnym czacie.",
|
"customEmojisAndStickersBody": "Dodaj lub podziel się własnymi emotikonami i naklejkami, które będą mogły być użyte w dowolnym czacie.",
|
||||||
"@customEmojisAndStickersBody": {},
|
|
||||||
"hideRedactedMessages": "Nie pokazuj usuniętych wiadomości",
|
"hideRedactedMessages": "Nie pokazuj usuniętych wiadomości",
|
||||||
"@hideRedactedMessages": {},
|
|
||||||
"hideInvalidOrUnknownMessageFormats": "Ukryj niepoprawne lub nieznane typy wiadomości",
|
"hideInvalidOrUnknownMessageFormats": "Ukryj niepoprawne lub nieznane typy wiadomości",
|
||||||
"@hideInvalidOrUnknownMessageFormats": {},
|
"@hideInvalidOrUnknownMessageFormats": {},
|
||||||
"pushNotificationsNotAvailable": "Powiadomienia push nie są dostępne",
|
"pushNotificationsNotAvailable": "Powiadomienia push nie są dostępne",
|
||||||
"@pushNotificationsNotAvailable": {},
|
|
||||||
"noUsersFoundWithQuery": "Niestety nie udało się nikogo znaleźć poprzez \"{query}\". Proszę sprawdzić, czy w zapytaniu nie ma literówek.",
|
"noUsersFoundWithQuery": "Niestety nie udało się nikogo znaleźć poprzez \"{query}\". Proszę sprawdzić, czy w zapytaniu nie ma literówek.",
|
||||||
"@noUsersFoundWithQuery": {
|
"@noUsersFoundWithQuery": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2615,46 +2458,30 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"publicSpaces": "Przestrzenie publiczne",
|
"publicSpaces": "Przestrzenie publiczne",
|
||||||
"@publicSpaces": {},
|
|
||||||
"searchMore": "Szukaj dalej...",
|
"searchMore": "Szukaj dalej...",
|
||||||
"@searchMore": {},
|
|
||||||
"formattedMessagesDescription": "Używaj Markdown do wyświetlania dodatkowego formatowania w wiadomościach, jak np. pogrubienie tekstu.",
|
"formattedMessagesDescription": "Używaj Markdown do wyświetlania dodatkowego formatowania w wiadomościach, jak np. pogrubienie tekstu.",
|
||||||
"@formattedMessagesDescription": {},
|
|
||||||
"verifyOtherUser": "🔐 Zweryfikuj innego użytkownika",
|
"verifyOtherUser": "🔐 Zweryfikuj innego użytkownika",
|
||||||
"@verifyOtherUser": {},
|
|
||||||
"knockRestricted": "Pukanie jest ograniczone",
|
"knockRestricted": "Pukanie jest ograniczone",
|
||||||
"@knockRestricted": {},
|
|
||||||
"appLockDescription": "Zablokuj aplikację pinem kiedy nie jest używana",
|
"appLockDescription": "Zablokuj aplikację pinem kiedy nie jest używana",
|
||||||
"@appLockDescription": {},
|
|
||||||
"knocking": "Pukanie",
|
"knocking": "Pukanie",
|
||||||
"@knocking": {},
|
|
||||||
"pleaseChooseAStrongPassword": "Proszę wybrać silne hasło",
|
"pleaseChooseAStrongPassword": "Proszę wybrać silne hasło",
|
||||||
"@pleaseChooseAStrongPassword": {},
|
|
||||||
"usersMustKnock": "Użytkownicy muszą zapukać",
|
"usersMustKnock": "Użytkownicy muszą zapukać",
|
||||||
"@usersMustKnock": {},
|
|
||||||
"noOneCanJoin": "Nikt nie może dołączyć",
|
"noOneCanJoin": "Nikt nie może dołączyć",
|
||||||
"@noOneCanJoin": {},
|
|
||||||
"alwaysUse24HourFormat": "false",
|
"alwaysUse24HourFormat": "false",
|
||||||
"@alwaysUse24HourFormat": {
|
"@alwaysUse24HourFormat": {
|
||||||
"description": "Set to true to always display time of day in 24 hour format."
|
"description": "Set to true to always display time of day in 24 hour format."
|
||||||
},
|
},
|
||||||
"swipeRightToLeftToReply": "Przeciągnij w lewo, by odpowiedzieć",
|
"swipeRightToLeftToReply": "Przeciągnij w lewo, by odpowiedzieć",
|
||||||
"@swipeRightToLeftToReply": {},
|
|
||||||
"presencesToggle": "Pokazuj zmiany statusów innych użytkowników",
|
"presencesToggle": "Pokazuj zmiany statusów innych użytkowników",
|
||||||
"@presencesToggle": {
|
"@presencesToggle": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"hidePresences": "Ukryć listę statusów?",
|
"hidePresences": "Ukryć listę statusów?",
|
||||||
"@hidePresences": {},
|
|
||||||
"pleaseEnterANumber": "Proszę podać liczbę większą od 0",
|
"pleaseEnterANumber": "Proszę podać liczbę większą od 0",
|
||||||
"@pleaseEnterANumber": {},
|
|
||||||
"commandHint_sendraw": "Wyślij zwykły JSON",
|
"commandHint_sendraw": "Wyślij zwykły JSON",
|
||||||
"@commandHint_sendraw": {},
|
|
||||||
"databaseMigrationBody": "Proszę czekać. Może to potrwać chwilę.",
|
"databaseMigrationBody": "Proszę czekać. Może to potrwać chwilę.",
|
||||||
"@databaseMigrationBody": {},
|
|
||||||
"leaveEmptyToClearStatus": "Pozostaw puste, aby wyczyścić swój status.",
|
"leaveEmptyToClearStatus": "Pozostaw puste, aby wyczyścić swój status.",
|
||||||
"@leaveEmptyToClearStatus": {},
|
|
||||||
"sessionLostBody": "Twoja sesja została utracona. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}",
|
"sessionLostBody": "Twoja sesja została utracona. Prosimy zgłosić ten błąd autorom aplikacji na {url}. Treść błędu to: {error}",
|
||||||
"@sessionLostBody": {
|
"@sessionLostBody": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2668,7 +2495,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"publicChatAddresses": "Adresy publicznych czatów",
|
"publicChatAddresses": "Adresy publicznych czatów",
|
||||||
"@publicChatAddresses": {},
|
|
||||||
"createNewAddress": "Utwórz nowy adres",
|
"createNewAddress": "Utwórz nowy adres",
|
||||||
"@createNewAddress": {},
|
"@createNewAddress": {},
|
||||||
"completedKeyVerification": "{sender} zakończył/-a weryfikację kluczy",
|
"completedKeyVerification": "{sender} zakończył/-a weryfikację kluczy",
|
||||||
|
|
@ -2681,19 +2507,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"italicText": "Kursywa",
|
"italicText": "Kursywa",
|
||||||
"@italicText": {},
|
|
||||||
"boldText": "Pogrubienie",
|
"boldText": "Pogrubienie",
|
||||||
"@boldText": {},
|
|
||||||
"strikeThrough": "Przekreślenie",
|
"strikeThrough": "Przekreślenie",
|
||||||
"@strikeThrough": {},
|
|
||||||
"incomingMessages": "Wiadomości przychodzące",
|
"incomingMessages": "Wiadomości przychodzące",
|
||||||
"@incomingMessages": {},
|
"@incomingMessages": {},
|
||||||
"loginWithMatrixId": "Zaloguj się identyfikatorem Matrix",
|
"loginWithMatrixId": "Zaloguj się identyfikatorem Matrix",
|
||||||
"@loginWithMatrixId": {},
|
|
||||||
"passwordsDoNotMatch": "Hasła się nie zgadzają",
|
"passwordsDoNotMatch": "Hasła się nie zgadzają",
|
||||||
"@passwordsDoNotMatch": {},
|
|
||||||
"unbanUserDescription": "Użytkownik będzie w stanie dołączyć do czatu ponownie.",
|
"unbanUserDescription": "Użytkownik będzie w stanie dołączyć do czatu ponownie.",
|
||||||
"@unbanUserDescription": {},
|
|
||||||
"roomUpgradeDescription": "Czat zostanie przeniesiony do pokoju w nowej wersji. Wszyscy użytkownicy zostaną powiadomieni o konieczności dołączenia do nowego czatu. Możesz dowiedzieć się więcej o wersjach pokojów na https://spec.matrix.org/latest/rooms/",
|
"roomUpgradeDescription": "Czat zostanie przeniesiony do pokoju w nowej wersji. Wszyscy użytkownicy zostaną powiadomieni o konieczności dołączenia do nowego czatu. Możesz dowiedzieć się więcej o wersjach pokojów na https://spec.matrix.org/latest/rooms/",
|
||||||
"@roomUpgradeDescription": {},
|
"@roomUpgradeDescription": {},
|
||||||
"requestedKeyVerification": "{sender} poprosił/-a o weryfikację kluczy",
|
"requestedKeyVerification": "{sender} poprosił/-a o weryfikację kluczy",
|
||||||
|
|
@ -2708,9 +2528,7 @@
|
||||||
"changeGeneralChatSettings": "Zmień ogólne ustawienia czatu",
|
"changeGeneralChatSettings": "Zmień ogólne ustawienia czatu",
|
||||||
"@changeGeneralChatSettings": {},
|
"@changeGeneralChatSettings": {},
|
||||||
"verifyOtherUserDescription": "Jeśli zweryfikujesz innego użytkownika, możesz być pewien/-na z kim naprawdę piszesz. 💪\n\nKiedy rozpoczniesz weryfikację, Ty i ta druga osoba zobaczycie okienko dialogowe. Zobaczycie w nim serię emotikonów lub numery do porównania.\n\nNajlepiej potwierdzić ich zgodność osobiście lub przez wideorozmowę. 👭",
|
"verifyOtherUserDescription": "Jeśli zweryfikujesz innego użytkownika, możesz być pewien/-na z kim naprawdę piszesz. 💪\n\nKiedy rozpoczniesz weryfikację, Ty i ta druga osoba zobaczycie okienko dialogowe. Zobaczycie w nim serię emotikonów lub numery do porównania.\n\nNajlepiej potwierdzić ich zgodność osobiście lub przez wideorozmowę. 👭",
|
||||||
"@verifyOtherUserDescription": {},
|
|
||||||
"verifyOtherDeviceDescription": "Jeśli zweryfikujesz inne urządzenie, będzie mogło ono wymienić klucze z dotychczasowym, zwiększając ogólne bezpieczeństwo. 💪 Kiedy rozpoczniesz weryfikację, na obu urządzeniach wyświetli się okno dialogowe. Zobaczysz w nim serię emotikonów lub numery do porównania. Najlepiej mieć oba urządzenia pod ręką przed rozpoczęciem weryfikacji. 🤳",
|
"verifyOtherDeviceDescription": "Jeśli zweryfikujesz inne urządzenie, będzie mogło ono wymienić klucze z dotychczasowym, zwiększając ogólne bezpieczeństwo. 💪 Kiedy rozpoczniesz weryfikację, na obu urządzeniach wyświetli się okno dialogowe. Zobaczysz w nim serię emotikonów lub numery do porównania. Najlepiej mieć oba urządzenia pod ręką przed rozpoczęciem weryfikacji. 🤳",
|
||||||
"@verifyOtherDeviceDescription": {},
|
|
||||||
"unreadChatsInApp": "{appname}: {unread} nieprzeczytanych czatów",
|
"unreadChatsInApp": "{appname}: {unread} nieprzeczytanych czatów",
|
||||||
"@unreadChatsInApp": {
|
"@unreadChatsInApp": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2724,37 +2542,23 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"addLink": "Dodaj link",
|
"addLink": "Dodaj link",
|
||||||
"@addLink": {},
|
|
||||||
"unread": "Nieprzeczytane",
|
"unread": "Nieprzeczytane",
|
||||||
"@unread": {},
|
|
||||||
"space": "Przestrzeń",
|
"space": "Przestrzeń",
|
||||||
"@space": {},
|
|
||||||
"spaces": "Przestrzenie",
|
"spaces": "Przestrzenie",
|
||||||
"@spaces": {},
|
"@spaces": {},
|
||||||
"noMoreChatsFound": "Nie znaleziono więcej czatów...",
|
"noMoreChatsFound": "Nie znaleziono więcej czatów...",
|
||||||
"@noMoreChatsFound": {},
|
"@noMoreChatsFound": {},
|
||||||
"removeDevicesDescription": "Nastąpi wylogowanie z tego urządzenia. Nie będziesz w stanie odbierać na nim wiadomości.",
|
"removeDevicesDescription": "Nastąpi wylogowanie z tego urządzenia. Nie będziesz w stanie odbierać na nim wiadomości.",
|
||||||
"@removeDevicesDescription": {},
|
|
||||||
"makeAdminDescription": "Kiedy użytkownik zostanie adminem, nie będziesz móc tego cofnąć, bo nabierze takich samych uprawnień, jak Ty.",
|
"makeAdminDescription": "Kiedy użytkownik zostanie adminem, nie będziesz móc tego cofnąć, bo nabierze takich samych uprawnień, jak Ty.",
|
||||||
"@makeAdminDescription": {},
|
|
||||||
"searchChatsRooms": "Szukaj #czatów, @użytkowników...",
|
"searchChatsRooms": "Szukaj #czatów, @użytkowników...",
|
||||||
"@searchChatsRooms": {},
|
|
||||||
"createGroupAndInviteUsers": "Utwórz grupę i zaproś użytkowników",
|
"createGroupAndInviteUsers": "Utwórz grupę i zaproś użytkowników",
|
||||||
"@createGroupAndInviteUsers": {},
|
|
||||||
"groupCanBeFoundViaSearch": "Grupa może być znaleziona poprzez wyszukiwanie",
|
"groupCanBeFoundViaSearch": "Grupa może być znaleziona poprzez wyszukiwanie",
|
||||||
"@groupCanBeFoundViaSearch": {},
|
|
||||||
"wrongRecoveryKey": "Niestety to nie wygląda na poprawny klucz odzyskiwania.",
|
"wrongRecoveryKey": "Niestety to nie wygląda na poprawny klucz odzyskiwania.",
|
||||||
"@wrongRecoveryKey": {},
|
|
||||||
"searchForUsers": "Szukaj @użytkowników...",
|
"searchForUsers": "Szukaj @użytkowników...",
|
||||||
"@searchForUsers": {},
|
|
||||||
"pleaseEnterYourCurrentPassword": "Proszę podać swoje obecne hasło",
|
"pleaseEnterYourCurrentPassword": "Proszę podać swoje obecne hasło",
|
||||||
"@pleaseEnterYourCurrentPassword": {},
|
|
||||||
"passwordIsWrong": "Podano niepoprawne hasło",
|
"passwordIsWrong": "Podano niepoprawne hasło",
|
||||||
"@passwordIsWrong": {},
|
|
||||||
"joinSpace": "Dołącz do przestrzeni",
|
"joinSpace": "Dołącz do przestrzeni",
|
||||||
"@joinSpace": {},
|
|
||||||
"addChatOrSubSpace": "Dodaj czat lub podprzestrzeń",
|
"addChatOrSubSpace": "Dodaj czat lub podprzestrzeń",
|
||||||
"@addChatOrSubSpace": {},
|
|
||||||
"initAppError": "Wystąpił błąd podczas inicjalizacji aplikacji",
|
"initAppError": "Wystąpił błąd podczas inicjalizacji aplikacji",
|
||||||
"@initAppError": {},
|
"@initAppError": {},
|
||||||
"searchIn": "Szukaj w czacie \"{chat}\"...",
|
"searchIn": "Szukaj w czacie \"{chat}\"...",
|
||||||
|
|
@ -2767,7 +2571,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"kickUserDescription": "Użytkownik jest wyrzucony z czatu, ale nie zbanowany. Do czatu publicznego może dołączyć ponownie.",
|
"kickUserDescription": "Użytkownik jest wyrzucony z czatu, ale nie zbanowany. Do czatu publicznego może dołączyć ponownie.",
|
||||||
"@kickUserDescription": {},
|
|
||||||
"appWantsToUseForLogin": "Użyj serwera '{server}' do zalogowania się",
|
"appWantsToUseForLogin": "Użyj serwera '{server}' do zalogowania się",
|
||||||
"@appWantsToUseForLogin": {
|
"@appWantsToUseForLogin": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2778,83 +2581,44 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"appWantsToUseForLoginDescription": "Niniejszym zezwalasz aplikacji i witrynie na udostępnianie informacji o sobie.",
|
"appWantsToUseForLoginDescription": "Niniejszym zezwalasz aplikacji i witrynie na udostępnianie informacji o sobie.",
|
||||||
"@appWantsToUseForLoginDescription": {},
|
|
||||||
"open": "Otwórz",
|
"open": "Otwórz",
|
||||||
"@open": {},
|
|
||||||
"contentNotificationSettings": "Ustawienia powiadomień o treści",
|
"contentNotificationSettings": "Ustawienia powiadomień o treści",
|
||||||
"@contentNotificationSettings": {},
|
|
||||||
"generalNotificationSettings": "Ogólne ustawienia powiadomień",
|
"generalNotificationSettings": "Ogólne ustawienia powiadomień",
|
||||||
"@generalNotificationSettings": {},
|
|
||||||
"roomNotificationSettings": "Ustawienia powiadomień w pokoju",
|
"roomNotificationSettings": "Ustawienia powiadomień w pokoju",
|
||||||
"@roomNotificationSettings": {},
|
|
||||||
"userSpecificNotificationSettings": "Ustawienia powiadomień dla użytkownika",
|
"userSpecificNotificationSettings": "Ustawienia powiadomień dla użytkownika",
|
||||||
"@userSpecificNotificationSettings": {},
|
|
||||||
"otherNotificationSettings": "Inne ustawienia powiadomień",
|
"otherNotificationSettings": "Inne ustawienia powiadomień",
|
||||||
"@otherNotificationSettings": {},
|
|
||||||
"notificationRuleContainsUserName": "Włącz dla wiadomości z nazwą użytkownika",
|
"notificationRuleContainsUserName": "Włącz dla wiadomości z nazwą użytkownika",
|
||||||
"@notificationRuleContainsUserName": {},
|
|
||||||
"notificationRuleContainsUserNameDescription": "Włącza powiadomienia kiedy wiadomość zawiera Twoją nazwę użytkownika.",
|
"notificationRuleContainsUserNameDescription": "Włącza powiadomienia kiedy wiadomość zawiera Twoją nazwę użytkownika.",
|
||||||
"@notificationRuleContainsUserNameDescription": {},
|
|
||||||
"notificationRuleMaster": "Wyłącz wszystkie powiadomienia",
|
"notificationRuleMaster": "Wyłącz wszystkie powiadomienia",
|
||||||
"@notificationRuleMaster": {},
|
|
||||||
"notificationRuleMasterDescription": "Zastępuje inne reguły i wyłącza wszystkie powiadomienia.",
|
"notificationRuleMasterDescription": "Zastępuje inne reguły i wyłącza wszystkie powiadomienia.",
|
||||||
"@notificationRuleMasterDescription": {},
|
|
||||||
"notificationRuleSuppressNotices": "Wyłącz dla automatycznych wiadomości",
|
"notificationRuleSuppressNotices": "Wyłącz dla automatycznych wiadomości",
|
||||||
"@notificationRuleSuppressNotices": {},
|
|
||||||
"notificationRuleSuppressNoticesDescription": "Wyłącza powiadomienia z automatycznych klientów, takich jak boty.",
|
"notificationRuleSuppressNoticesDescription": "Wyłącza powiadomienia z automatycznych klientów, takich jak boty.",
|
||||||
"@notificationRuleSuppressNoticesDescription": {},
|
|
||||||
"notificationRuleInviteForMe": "Włącz dla zaproszeń",
|
"notificationRuleInviteForMe": "Włącz dla zaproszeń",
|
||||||
"@notificationRuleInviteForMe": {},
|
|
||||||
"notificationRuleInviteForMeDescription": "Włącza powiadomienia o zaproszeniach do pokoju.",
|
"notificationRuleInviteForMeDescription": "Włącza powiadomienia o zaproszeniach do pokoju.",
|
||||||
"@notificationRuleInviteForMeDescription": {},
|
|
||||||
"notificationRuleMemberEvent": "Wyłącz dla zmian członkostwa",
|
"notificationRuleMemberEvent": "Wyłącz dla zmian członkostwa",
|
||||||
"@notificationRuleMemberEvent": {},
|
|
||||||
"notificationRuleMemberEventDescription": "Wyłącza powiadomienia o zmianach członkostwa w pokoju.",
|
"notificationRuleMemberEventDescription": "Wyłącza powiadomienia o zmianach członkostwa w pokoju.",
|
||||||
"@notificationRuleMemberEventDescription": {},
|
|
||||||
"notificationRuleIsUserMention": "Włącz dla wzmianek",
|
"notificationRuleIsUserMention": "Włącz dla wzmianek",
|
||||||
"@notificationRuleIsUserMention": {},
|
|
||||||
"notificationRuleIsUserMentionDescription": "Włącza powiadomienia o byciu wzmiankowanym w wiadomości.",
|
"notificationRuleIsUserMentionDescription": "Włącza powiadomienia o byciu wzmiankowanym w wiadomości.",
|
||||||
"@notificationRuleIsUserMentionDescription": {},
|
|
||||||
"notificationRuleContainsDisplayName": "Włącz dla wiadomości z nazwą wyświetlaną",
|
"notificationRuleContainsDisplayName": "Włącz dla wiadomości z nazwą wyświetlaną",
|
||||||
"@notificationRuleContainsDisplayName": {},
|
|
||||||
"notificationRuleContainsDisplayNameDescription": "Włącza powiadomienia o wiadomościach zawierających Twoją nazwę wyświetlaną.",
|
"notificationRuleContainsDisplayNameDescription": "Włącza powiadomienia o wiadomościach zawierających Twoją nazwę wyświetlaną.",
|
||||||
"@notificationRuleContainsDisplayNameDescription": {},
|
|
||||||
"notificationRuleIsRoomMention": "Włącz dla wzmianek pokoju",
|
"notificationRuleIsRoomMention": "Włącz dla wzmianek pokoju",
|
||||||
"@notificationRuleIsRoomMention": {},
|
|
||||||
"notificationRuleIsRoomMentionDescription": "Włącza powiadomienia o wzmiankowaniu całego pokoju.",
|
"notificationRuleIsRoomMentionDescription": "Włącza powiadomienia o wzmiankowaniu całego pokoju.",
|
||||||
"@notificationRuleIsRoomMentionDescription": {},
|
|
||||||
"notificationRuleRoomnotif": "Włącz dla powiadomień w pokoju",
|
"notificationRuleRoomnotif": "Włącz dla powiadomień w pokoju",
|
||||||
"@notificationRuleRoomnotif": {},
|
|
||||||
"notificationRuleRoomnotifDescription": "Włącza powiadomienia o wiadomościach zawierających „@room”.",
|
"notificationRuleRoomnotifDescription": "Włącza powiadomienia o wiadomościach zawierających „@room”.",
|
||||||
"@notificationRuleRoomnotifDescription": {},
|
|
||||||
"notificationRuleTombstone": "Włącz dla „nagrobków”",
|
"notificationRuleTombstone": "Włącz dla „nagrobków”",
|
||||||
"@notificationRuleTombstone": {},
|
|
||||||
"notificationRuleTombstoneDescription": "Włącza powiadomienia o komunikatach dezaktywacji pokojów.",
|
"notificationRuleTombstoneDescription": "Włącza powiadomienia o komunikatach dezaktywacji pokojów.",
|
||||||
"@notificationRuleTombstoneDescription": {},
|
|
||||||
"notificationRuleReaction": "Wyłącz dla reakcji",
|
"notificationRuleReaction": "Wyłącz dla reakcji",
|
||||||
"@notificationRuleReaction": {},
|
|
||||||
"notificationRuleReactionDescription": "Wyłącza powiadomienia o reakcjach.",
|
"notificationRuleReactionDescription": "Wyłącza powiadomienia o reakcjach.",
|
||||||
"@notificationRuleReactionDescription": {},
|
|
||||||
"notificationRuleSuppressEdits": "Wyłącz dla edycji",
|
"notificationRuleSuppressEdits": "Wyłącz dla edycji",
|
||||||
"@notificationRuleSuppressEdits": {},
|
|
||||||
"notificationRuleSuppressEditsDescription": "Wyłącza powiadomienia o edycjach wiadomości.",
|
"notificationRuleSuppressEditsDescription": "Wyłącza powiadomienia o edycjach wiadomości.",
|
||||||
"@notificationRuleSuppressEditsDescription": {},
|
|
||||||
"notificationRuleCall": "Włącz dla połączeń",
|
"notificationRuleCall": "Włącz dla połączeń",
|
||||||
"@notificationRuleCall": {},
|
|
||||||
"notificationRuleRoomServerAclDescription": "Wyłącza powiadomienia dla list kontroli dostępu (ACL) serwera.",
|
"notificationRuleRoomServerAclDescription": "Wyłącza powiadomienia dla list kontroli dostępu (ACL) serwera.",
|
||||||
"@notificationRuleRoomServerAclDescription": {},
|
|
||||||
"notificationRuleRoomServerAcl": "Wyłącz dla list kontroli dostępu serwera",
|
"notificationRuleRoomServerAcl": "Wyłącz dla list kontroli dostępu serwera",
|
||||||
"@notificationRuleRoomServerAcl": {},
|
|
||||||
"notificationRuleEncryptedRoomOneToOne": "Włącz dla szyfrowanych pokojów „jeden na jeden”",
|
"notificationRuleEncryptedRoomOneToOne": "Włącz dla szyfrowanych pokojów „jeden na jeden”",
|
||||||
"@notificationRuleEncryptedRoomOneToOne": {},
|
|
||||||
"notificationRuleCallDescription": "Włącza powiadomienia o przychodzących połączeniach.",
|
"notificationRuleCallDescription": "Włącza powiadomienia o przychodzących połączeniach.",
|
||||||
"@notificationRuleCallDescription": {},
|
|
||||||
"notificationRuleRoomOneToOne": "Włącz dla pokojów „jeden na jeden”",
|
"notificationRuleRoomOneToOne": "Włącz dla pokojów „jeden na jeden”",
|
||||||
"@notificationRuleRoomOneToOne": {},
|
|
||||||
"notificationRuleRoomOneToOneDescription": "Włącza powiadomienia o wiadomościach w pokojach „jeden na jeden” (one-to-one).",
|
"notificationRuleRoomOneToOneDescription": "Włącza powiadomienia o wiadomościach w pokojach „jeden na jeden” (one-to-one).",
|
||||||
"@notificationRuleRoomOneToOneDescription": {},
|
|
||||||
"notificationRuleMessage": "Włącz dla wiadomości",
|
"notificationRuleMessage": "Włącz dla wiadomości",
|
||||||
"@notificationRuleMessage": {},
|
|
||||||
"unknownPushRule": "Nieznana reguła: '{rule}'",
|
"unknownPushRule": "Nieznana reguła: '{rule}'",
|
||||||
"@unknownPushRule": {
|
"@unknownPushRule": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2865,23 +2629,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notificationRuleEncryptedRoomOneToOneDescription": "Włącza powiadomienia o wiadomościach w szyfrowanych pokojach „jeden na jeden” (one-to-one).",
|
"notificationRuleEncryptedRoomOneToOneDescription": "Włącza powiadomienia o wiadomościach w szyfrowanych pokojach „jeden na jeden” (one-to-one).",
|
||||||
"@notificationRuleEncryptedRoomOneToOneDescription": {},
|
|
||||||
"notificationRuleEncrypted": "Włącz dla zaszyfrowanych pokojów",
|
"notificationRuleEncrypted": "Włącz dla zaszyfrowanych pokojów",
|
||||||
"@notificationRuleEncrypted": {},
|
|
||||||
"notificationRuleJitsi": "Włącz dla Jitsi",
|
"notificationRuleJitsi": "Włącz dla Jitsi",
|
||||||
"@notificationRuleJitsi": {},
|
|
||||||
"notificationRuleServerAcl": "Wyłącz dla komunikatów o listach kontroli dostępu serwera",
|
"notificationRuleServerAcl": "Wyłącz dla komunikatów o listach kontroli dostępu serwera",
|
||||||
"@notificationRuleServerAcl": {},
|
|
||||||
"notificationRuleJitsiDescription": "Włącza powiadomienia o komunikatach widżetów Jitsi.",
|
"notificationRuleJitsiDescription": "Włącza powiadomienia o komunikatach widżetów Jitsi.",
|
||||||
"@notificationRuleJitsiDescription": {},
|
|
||||||
"notificationRuleMessageDescription": "Włącza powiadomienia o ogólnych wiadomościach.",
|
"notificationRuleMessageDescription": "Włącza powiadomienia o ogólnych wiadomościach.",
|
||||||
"@notificationRuleMessageDescription": {},
|
|
||||||
"notificationRuleEncryptedDescription": "Włącza powiadomienia o wiadomościach w zaszyfrowanych pokojach.",
|
"notificationRuleEncryptedDescription": "Włącza powiadomienia o wiadomościach w zaszyfrowanych pokojach.",
|
||||||
"@notificationRuleEncryptedDescription": {},
|
|
||||||
"notificationRuleServerAclDescription": "Wyłącza powiadomienia o komunikatach o listach kontroli dostępu (ACL) serwera.",
|
"notificationRuleServerAclDescription": "Wyłącza powiadomienia o komunikatach o listach kontroli dostępu (ACL) serwera.",
|
||||||
"@notificationRuleServerAclDescription": {},
|
|
||||||
"newChatRequest": "📩 Nowa prośba o czat",
|
"newChatRequest": "📩 Nowa prośba o czat",
|
||||||
"@newChatRequest": {},
|
|
||||||
"synchronizingPleaseWaitCounter": " Synchronizowanie… ({percentage}%)",
|
"synchronizingPleaseWaitCounter": " Synchronizowanie… ({percentage}%)",
|
||||||
"@synchronizingPleaseWaitCounter": {
|
"@synchronizingPleaseWaitCounter": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2894,37 +2649,21 @@
|
||||||
"waitingForServer": "Oczekiwanie na serwer...",
|
"waitingForServer": "Oczekiwanie na serwer...",
|
||||||
"@waitingForServer": {},
|
"@waitingForServer": {},
|
||||||
"previous": "Poprzedni",
|
"previous": "Poprzedni",
|
||||||
"@previous": {},
|
|
||||||
"otherPartyNotLoggedIn": "Druga strona nie jest obecnie zalogowana i dlatego nie może odbierać wiadomości!",
|
"otherPartyNotLoggedIn": "Druga strona nie jest obecnie zalogowana i dlatego nie może odbierać wiadomości!",
|
||||||
"@otherPartyNotLoggedIn": {},
|
|
||||||
"deletePushRuleCanNotBeUndone": "Jeśli skasujesz to ustawienie powiadomień, nie będzie się dało tego cofnąć.",
|
"deletePushRuleCanNotBeUndone": "Jeśli skasujesz to ustawienie powiadomień, nie będzie się dało tego cofnąć.",
|
||||||
"@deletePushRuleCanNotBeUndone": {},
|
|
||||||
"more": "Więcej",
|
"more": "Więcej",
|
||||||
"@more": {},
|
|
||||||
"shareKeysWith": "Udostępnij klucze...",
|
"shareKeysWith": "Udostępnij klucze...",
|
||||||
"@shareKeysWith": {},
|
|
||||||
"crossVerifiedDevicesIfEnabled": "Urządzenia zweryfikowane krzyżowo, jeśli włączone",
|
"crossVerifiedDevicesIfEnabled": "Urządzenia zweryfikowane krzyżowo, jeśli włączone",
|
||||||
"@crossVerifiedDevicesIfEnabled": {},
|
|
||||||
"crossVerifiedDevices": "Urządzenia zweryfikowane krzyżowo",
|
"crossVerifiedDevices": "Urządzenia zweryfikowane krzyżowo",
|
||||||
"@crossVerifiedDevices": {},
|
|
||||||
"takeAPhoto": "Zrób zdjęcie",
|
"takeAPhoto": "Zrób zdjęcie",
|
||||||
"@takeAPhoto": {},
|
|
||||||
"recordAVideo": "Nagraj film",
|
"recordAVideo": "Nagraj film",
|
||||||
"@recordAVideo": {},
|
|
||||||
"optionalMessage": "(Opcjonalna) wiadomość...",
|
"optionalMessage": "(Opcjonalna) wiadomość...",
|
||||||
"@optionalMessage": {},
|
|
||||||
"verifiedDevicesOnly": "Tylko zweryfikowane urządzenia",
|
"verifiedDevicesOnly": "Tylko zweryfikowane urządzenia",
|
||||||
"@verifiedDevicesOnly": {},
|
|
||||||
"shareKeysWithDescription": "Które urządzenia powinny być zaufane, aby mogły odczytywać Twoje wiadomości w zaszyfrowanych czatach?",
|
"shareKeysWithDescription": "Które urządzenia powinny być zaufane, aby mogły odczytywać Twoje wiadomości w zaszyfrowanych czatach?",
|
||||||
"@shareKeysWithDescription": {},
|
|
||||||
"allDevices": "Wszystkie urządzenia",
|
"allDevices": "Wszystkie urządzenia",
|
||||||
"@allDevices": {},
|
|
||||||
"notSupportedOnThisDevice": "Niewspierane na tym urządzeniu",
|
"notSupportedOnThisDevice": "Niewspierane na tym urządzeniu",
|
||||||
"@notSupportedOnThisDevice": {},
|
|
||||||
"commandHint_roomupgrade": "Zaktualizuj ten pokój do podanej wersji",
|
"commandHint_roomupgrade": "Zaktualizuj ten pokój do podanej wersji",
|
||||||
"@commandHint_roomupgrade": {},
|
|
||||||
"enterNewChat": "Dołącz do nowego czatu",
|
"enterNewChat": "Dołącz do nowego czatu",
|
||||||
"@enterNewChat": {},
|
|
||||||
"countInvited": "{count} zaproszonych",
|
"countInvited": "{count} zaproszonych",
|
||||||
"@countInvited": {
|
"@countInvited": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2951,21 +2690,13 @@
|
||||||
"ignoreUser": "Ignoruj użytkownika",
|
"ignoreUser": "Ignoruj użytkownika",
|
||||||
"@ignoreUser": {},
|
"@ignoreUser": {},
|
||||||
"approve": "Zaakceptuj",
|
"approve": "Zaakceptuj",
|
||||||
"@approve": {},
|
|
||||||
"youHaveKnocked": "Zapukałeś/-aś",
|
"youHaveKnocked": "Zapukałeś/-aś",
|
||||||
"@youHaveKnocked": {},
|
|
||||||
"pleaseWaitUntilInvited": "Proszę zaczekać na zaproszenie przez kogoś z pokoju.",
|
"pleaseWaitUntilInvited": "Proszę zaczekać na zaproszenie przez kogoś z pokoju.",
|
||||||
"@pleaseWaitUntilInvited": {},
|
|
||||||
"commandHint_logout": "Wyloguj bieżące urządzenie",
|
"commandHint_logout": "Wyloguj bieżące urządzenie",
|
||||||
"@commandHint_logout": {},
|
|
||||||
"commandHint_logoutall": "Wyloguj wszystkie aktywne urządzenia",
|
"commandHint_logoutall": "Wyloguj wszystkie aktywne urządzenia",
|
||||||
"@commandHint_logoutall": {},
|
|
||||||
"displayNavigationRail": "Pokazuj pasek nawigacyjny na urządzeniach mobilnych",
|
"displayNavigationRail": "Pokazuj pasek nawigacyjny na urządzeniach mobilnych",
|
||||||
"@displayNavigationRail": {},
|
|
||||||
"customReaction": "Własna reakcja",
|
"customReaction": "Własna reakcja",
|
||||||
"@customReaction": {},
|
|
||||||
"moreEvents": "Więcej zdarzeń",
|
"moreEvents": "Więcej zdarzeń",
|
||||||
"@moreEvents": {},
|
|
||||||
"declineInvitation": "Odrzuć zaproszenie",
|
"declineInvitation": "Odrzuć zaproszenie",
|
||||||
"@declineInvitation": {}
|
"@declineInvitation": {}
|
||||||
}
|
}
|
||||||
|
|
@ -2689,7 +2689,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Doar",
|
|
||||||
"startedAPoll": "{username} iniciou uma enquete.",
|
"startedAPoll": "{username} iniciou uma enquete.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2640,7 +2640,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Пожертвовать",
|
|
||||||
"startedAPoll": "{username} начал опрос.",
|
"startedAPoll": "{username} начал опрос.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2606,7 +2606,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Donera",
|
|
||||||
"answerOption": "Svarsalternativ",
|
"answerOption": "Svarsalternativ",
|
||||||
"addAnswerOption": "Lägg till svarsalternativ",
|
"addAnswerOption": "Lägg till svarsalternativ",
|
||||||
"allowMultipleAnswers": "Tillåt flera svar",
|
"allowMultipleAnswers": "Tillåt flera svar",
|
||||||
|
|
|
||||||
5743
lib/l10n/intl_ta.arb
5743
lib/l10n/intl_ta.arb
File diff suppressed because it is too large
Load diff
|
|
@ -2690,7 +2690,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Задонатити",
|
|
||||||
"startedAPoll": "Нове опитування від {username}.",
|
"startedAPoll": "Нове опитування від {username}.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2598,7 +2598,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "Xayriya qilmoq",
|
|
||||||
"startedAPoll": "{username} so‘rovnoma boshladi.",
|
"startedAPoll": "{username} so‘rovnoma boshladi.",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
|
||||||
|
|
@ -2690,7 +2690,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"donate": "捐赠",
|
|
||||||
"startedAPoll": "{username} 启动了投票。",
|
"startedAPoll": "{username} 启动了投票。",
|
||||||
"@startedAPoll": {
|
"@startedAPoll": {
|
||||||
"type": "String",
|
"type": "String",
|
||||||
|
|
@ -2787,5 +2786,19 @@
|
||||||
"removeAdminRights": "删除管理员权限",
|
"removeAdminRights": "删除管理员权限",
|
||||||
"powerLevel": "权限级别",
|
"powerLevel": "权限级别",
|
||||||
"setPowerLevelDescription": "权限级别定义群成员在这个聊天室中可以做什么,取值范围 0 到 100。",
|
"setPowerLevelDescription": "权限级别定义群成员在这个聊天室中可以做什么,取值范围 0 到 100。",
|
||||||
"owner": "所有者"
|
"owner": "所有者",
|
||||||
}
|
"mute": "静音",
|
||||||
|
"@mute": {
|
||||||
|
"description": "This should be a very short string because there is not much space in the button!"
|
||||||
|
},
|
||||||
|
"createNewChat": "新建聊天",
|
||||||
|
"reset": "重置",
|
||||||
|
"supportFluffyChat": "支持 FluffyChat",
|
||||||
|
"support": "支持",
|
||||||
|
"fluffyChatSupportBannerMessage": "FluffyChat 需要您的帮助!\n❤️❤️❤️\nFluffyChat 将始终免费,但开发和托管仍然要花钱。\n项目的未来仰赖像您这样的人的支持。",
|
||||||
|
"skipSupportingFluffyChat": "跳过支持 FluffyChar",
|
||||||
|
"iDoNotWantToSupport": "我不想支持",
|
||||||
|
"iAlreadySupportFluffyChat": "我已支持 FluffyChat",
|
||||||
|
"setLowPriority": "设置低优先级",
|
||||||
|
"unsetLowPriority": "取消设置低优先级"
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -462,21 +462,18 @@ class ChatController extends State<ChatPageWithRoom>
|
||||||
scrollUpBannerEventId = eventId;
|
scrollUpBannerEventId = eventId;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
bool firstUpdateReceived = false;
|
||||||
|
|
||||||
void updateView() {
|
void updateView() {
|
||||||
if (!mounted) return;
|
if (!mounted) return;
|
||||||
setReadMarker();
|
setReadMarker();
|
||||||
setState(() {});
|
setState(() {
|
||||||
|
firstUpdateReceived = true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void>? loadTimelineFuture;
|
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 {
|
Future<void> _getTimeline({String? eventContextId}) async {
|
||||||
await Matrix.of(context).client.roomsLoading;
|
await Matrix.of(context).client.roomsLoading;
|
||||||
await Matrix.of(context).client.accountDataLoading;
|
await Matrix.of(context).client.accountDataLoading;
|
||||||
|
|
@ -489,15 +486,11 @@ class ChatController extends State<ChatPageWithRoom>
|
||||||
timeline = await room.getTimeline(
|
timeline = await room.getTimeline(
|
||||||
onUpdate: updateView,
|
onUpdate: updateView,
|
||||||
eventContextId: eventContextId,
|
eventContextId: eventContextId,
|
||||||
onInsert: onInsert,
|
|
||||||
);
|
);
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Logs().w('Unable to load timeline on event ID $eventContextId', e, s);
|
Logs().w('Unable to load timeline on event ID $eventContextId', e, s);
|
||||||
if (!mounted) return;
|
if (!mounted) return;
|
||||||
timeline = await room.getTimeline(
|
timeline = await room.getTimeline(onUpdate: updateView);
|
||||||
onUpdate: updateView,
|
|
||||||
onInsert: onInsert,
|
|
||||||
);
|
|
||||||
if (!mounted) return;
|
if (!mounted) return;
|
||||||
if (e is TimeoutException || e is IOException) {
|
if (e is TimeoutException || e is IOException) {
|
||||||
_showScrollUpMaterialBanner(eventContextId!);
|
_showScrollUpMaterialBanner(eventContextId!);
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,6 @@ class ChatEventList extends StatelessWidget {
|
||||||
final events = timeline.events.filterByVisibleInGui(
|
final events = timeline.events.filterByVisibleInGui(
|
||||||
threadId: controller.activeThreadId,
|
threadId: controller.activeThreadId,
|
||||||
);
|
);
|
||||||
final animateInEventIndex = controller.animateInEventIndex;
|
|
||||||
|
|
||||||
// create a map of eventId --> index to greatly improve performance of
|
// create a map of eventId --> index to greatly improve performance of
|
||||||
// ListView's findChildIndexCallback
|
// ListView's findChildIndexCallback
|
||||||
|
|
@ -120,10 +119,7 @@ class ChatEventList extends StatelessWidget {
|
||||||
|
|
||||||
// The message at this index:
|
// The message at this index:
|
||||||
final event = events[i];
|
final event = events[i];
|
||||||
final animateIn =
|
final animateIn = i == 0 && controller.firstUpdateReceived;
|
||||||
animateInEventIndex != null &&
|
|
||||||
timeline.events.length > animateInEventIndex &&
|
|
||||||
event == timeline.events[animateInEventIndex];
|
|
||||||
|
|
||||||
final nextEvent = i + 1 < events.length ? events[i + 1] : null;
|
final nextEvent = i + 1 < events.length ? events[i + 1] : null;
|
||||||
final previousEvent = i > 0 ? 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);
|
!controller.expandedEventIds.contains(event.eventId);
|
||||||
|
|
||||||
return AutoScrollTag(
|
return AutoScrollTag(
|
||||||
key: ValueKey(event.eventId),
|
key: ValueKey(event.transactionId ?? event.eventId),
|
||||||
index: i,
|
index: i,
|
||||||
controller: controller.scrollController,
|
controller: controller.scrollController,
|
||||||
child: Message(
|
child: Message(
|
||||||
event,
|
event,
|
||||||
bigEmojis: controller.bigEmojis,
|
bigEmojis: controller.bigEmojis,
|
||||||
animateIn: animateIn,
|
animateIn: animateIn,
|
||||||
resetAnimateIn: () {
|
|
||||||
controller.animateInEventIndex = null;
|
|
||||||
},
|
|
||||||
onSwipe: () => controller.replyAction(replyTo: event),
|
onSwipe: () => controller.replyAction(replyTo: event),
|
||||||
onInfoTab: controller.showEventInfo,
|
onInfoTab: controller.showEventInfo,
|
||||||
onMention: () => controller.sendController.text +=
|
onMention: () => controller.sendController.text +=
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:animations/animations.dart';
|
|
||||||
import 'package:emoji_picker_flutter/locales/default_emoji_set_locale.dart';
|
import 'package:emoji_picker_flutter/locales/default_emoji_set_locale.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
|
|
||||||
|
|
@ -273,27 +272,11 @@ class ChatInputRow extends StatelessWidget {
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
tooltip: L10n.of(context).emojis,
|
tooltip: L10n.of(context).emojis,
|
||||||
color: theme.colorScheme.onPrimaryContainer,
|
color: theme.colorScheme.onPrimaryContainer,
|
||||||
icon: PageTransitionSwitcher(
|
icon: Icon(
|
||||||
transitionBuilder:
|
controller.showEmojiPicker
|
||||||
(
|
? Icons.keyboard
|
||||||
Widget child,
|
: Icons.add_reaction_outlined,
|
||||||
Animation<double> primaryAnimation,
|
key: ValueKey(controller.showEmojiPicker),
|
||||||
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),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
onPressed: controller.emojiPickerAction,
|
onPressed: controller.emojiPickerAction,
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ import 'package:just_audio/just_audio.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart';
|
import 'package:opus_caf_converter_dart/opus_caf_converter_dart.dart';
|
||||||
import 'package:path_provider/path_provider.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/app_config.dart';
|
||||||
import 'package:fluffychat/config/themes.dart';
|
import 'package:fluffychat/config/themes.dart';
|
||||||
|
|
@ -166,11 +165,11 @@ class AudioPlayerState extends State<AudioPlayerWidget> {
|
||||||
: null,
|
: null,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!kIsWeb) {
|
final attachmentUrl = widget.event.attachmentOrThumbnailMxcUrl();
|
||||||
|
|
||||||
|
if (!kIsWeb && attachmentUrl != null) {
|
||||||
final tempDir = await getTemporaryDirectory();
|
final tempDir = await getTemporaryDirectory();
|
||||||
final fileName = Uri.encodeComponent(
|
final fileName = Uri.encodeComponent(attachmentUrl.pathSegments.last);
|
||||||
widget.event.attachmentOrThumbnailMxcUrl()!.pathSegments.last,
|
|
||||||
);
|
|
||||||
file = File('${tempDir.path}/${fileName}_${matrixFile.name}');
|
file = File('${tempDir.path}/${fileName}_${matrixFile.name}');
|
||||||
|
|
||||||
await file.writeAsBytes(matrixFile.bytes);
|
await file.writeAsBytes(matrixFile.bytes);
|
||||||
|
|
@ -203,12 +202,12 @@ class AudioPlayerState extends State<AudioPlayerWidget> {
|
||||||
|
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
audioPlayer.setFilePath(file.path);
|
audioPlayer.setFilePath(file.path);
|
||||||
} else if (kIsWeb) {
|
|
||||||
final blob = html.Blob([matrixFile.bytes], matrixFile.mimeType);
|
|
||||||
final url = html.Url.createObjectUrlFromBlob(blob);
|
|
||||||
await audioPlayer.setAudioSource(AudioSource.uri(Uri.parse(url)));
|
|
||||||
} else {
|
} else {
|
||||||
throw Exception('No audio file provided!');
|
await audioPlayer.setAudioSource(
|
||||||
|
AudioSource.uri(
|
||||||
|
Uri.dataFromBytes(matrixFile.bytes, mimeType: matrixFile.mimeType),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
audioPlayer.play().onError(
|
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/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:async/async.dart' show Result;
|
||||||
import 'package:cross_file/cross_file.dart';
|
import 'package:cross_file/cross_file.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart' hide Result;
|
||||||
import 'package:mime/mime.dart';
|
import 'package:mime/mime.dart';
|
||||||
|
|
||||||
import 'package:fluffychat/config/app_config.dart';
|
import 'package:fluffychat/config/app_config.dart';
|
||||||
|
|
@ -53,8 +54,9 @@ class SendFileDialogState extends State<SendFileDialog> {
|
||||||
}
|
}
|
||||||
scaffoldMessenger.showLoadingSnackBar(l10n.prepareSendingAttachment);
|
scaffoldMessenger.showLoadingSnackBar(l10n.prepareSendingAttachment);
|
||||||
Navigator.of(context, rootNavigator: false).pop();
|
Navigator.of(context, rootNavigator: false).pop();
|
||||||
final clientConfig = await widget.room.client.getConfig();
|
final clientConfig = await Result.capture(widget.room.client.getConfig());
|
||||||
final maxUploadSize = clientConfig.mUploadSize ?? 100 * 1000 * 1000;
|
final maxUploadSize =
|
||||||
|
clientConfig.asValue?.value.mUploadSize ?? 100 * 1000 * 1000;
|
||||||
|
|
||||||
for (final xfile in widget.files) {
|
for (final xfile in widget.files) {
|
||||||
final MatrixFile file;
|
final MatrixFile file;
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,18 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:developer';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
import 'package:app_links/app_links.dart';
|
|
||||||
import 'package:cross_file/cross_file.dart';
|
import 'package:cross_file/cross_file.dart';
|
||||||
import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart';
|
import 'package:flutter_shortcuts_new/flutter_shortcuts_new.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:matrix/matrix.dart' as sdk;
|
import 'package:matrix/matrix.dart' as sdk;
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
import 'package:receive_sharing_intent/receive_sharing_intent.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/l10n/l10n.dart';
|
||||||
import 'package:fluffychat/pages/chat_list/chat_list_view.dart';
|
import 'package:fluffychat/pages/chat_list/chat_list_view.dart';
|
||||||
import 'package:fluffychat/utils/localized_exception_extension.dart';
|
import 'package:fluffychat/utils/localized_exception_extension.dart';
|
||||||
|
|
@ -71,8 +73,6 @@ class ChatListController extends State<ChatList>
|
||||||
|
|
||||||
StreamSubscription? _intentFileStreamSubscription;
|
StreamSubscription? _intentFileStreamSubscription;
|
||||||
|
|
||||||
StreamSubscription? _intentUriStreamSubscription;
|
|
||||||
|
|
||||||
late ActiveFilter activeFilter;
|
late ActiveFilter activeFilter;
|
||||||
|
|
||||||
String? _activeSpaceId;
|
String? _activeSpaceId;
|
||||||
|
|
@ -308,6 +308,12 @@ class ChatListController extends State<ChatList>
|
||||||
void _processIncomingSharedMedia(List<SharedMediaFile> files) {
|
void _processIncomingSharedMedia(List<SharedMediaFile> files) {
|
||||||
if (files.isEmpty) return;
|
if (files.isEmpty) return;
|
||||||
|
|
||||||
|
if (files.singleOrNull?.path.startsWith(AppConfig.deepLinkPrefix) == true) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
inspect(files);
|
||||||
|
|
||||||
showScaffoldDialog(
|
showScaffoldDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (context) => ShareScaffoldDialog(
|
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() {
|
void _initReceiveSharingIntent() {
|
||||||
if (!PlatformInfos.isMobile) return;
|
if (!PlatformInfos.isMobile) return;
|
||||||
|
|
||||||
|
|
@ -347,11 +345,6 @@ class ChatListController extends State<ChatList>
|
||||||
_processIncomingSharedMedia,
|
_processIncomingSharedMedia,
|
||||||
);
|
);
|
||||||
|
|
||||||
// For receiving shared Uris
|
|
||||||
_intentUriStreamSubscription = AppLinks().uriLinkStream.listen(
|
|
||||||
_processIncomingUris,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (PlatformInfos.isAndroid) {
|
if (PlatformInfos.isAndroid) {
|
||||||
final shortcuts = FlutterShortcuts();
|
final shortcuts = FlutterShortcuts();
|
||||||
shortcuts.initialize().then(
|
shortcuts.initialize().then(
|
||||||
|
|
@ -374,6 +367,7 @@ class ChatListController extends State<ChatList>
|
||||||
_hackyWebRTCFixForWeb();
|
_hackyWebRTCFixForWeb();
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
|
_showLastSeenSupportBanner();
|
||||||
searchServer = Matrix.of(
|
searchServer = Matrix.of(
|
||||||
context,
|
context,
|
||||||
).store.getString(_serverStoreNamespace);
|
).store.getString(_serverStoreNamespace);
|
||||||
|
|
@ -394,11 +388,86 @@ class ChatListController extends State<ChatList>
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_intentDataStreamSubscription?.cancel();
|
_intentDataStreamSubscription?.cancel();
|
||||||
_intentFileStreamSubscription?.cancel();
|
_intentFileStreamSubscription?.cancel();
|
||||||
_intentUriStreamSubscription?.cancel();
|
|
||||||
scrollController.removeListener(_onScroll);
|
scrollController.removeListener(_onScroll);
|
||||||
super.dispose();
|
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(
|
Future<void> chatContextAction(
|
||||||
Room room,
|
Room room,
|
||||||
BuildContext posContext, [
|
BuildContext posContext, [
|
||||||
|
|
@ -509,23 +578,44 @@ class ChatListController extends State<ChatList>
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
PopupMenuItem(
|
if (!room.isLowPriority)
|
||||||
value: ChatContextAction.favorite,
|
PopupMenuItem(
|
||||||
child: Row(
|
value: ChatContextAction.favorite,
|
||||||
mainAxisSize: .min,
|
child: Row(
|
||||||
children: [
|
mainAxisSize: .min,
|
||||||
Icon(
|
children: [
|
||||||
room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined,
|
Icon(
|
||||||
),
|
room.isFavourite ? Icons.push_pin : Icons.push_pin_outlined,
|
||||||
const SizedBox(width: 12),
|
),
|
||||||
Text(
|
const SizedBox(width: 12),
|
||||||
room.isFavourite
|
Text(
|
||||||
? L10n.of(context).unpin
|
room.isFavourite
|
||||||
: L10n.of(context).pin,
|
? 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)
|
if (spacesWithPowerLevels.isNotEmpty)
|
||||||
PopupMenuItem(
|
PopupMenuItem(
|
||||||
value: ChatContextAction.addToSpace,
|
value: ChatContextAction.addToSpace,
|
||||||
|
|
@ -659,6 +749,12 @@ class ChatListController extends State<ChatList>
|
||||||
context: context,
|
context: context,
|
||||||
future: () => space.setSpaceChild(room.id),
|
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,
|
open,
|
||||||
goToSpace,
|
goToSpace,
|
||||||
favorite,
|
favorite,
|
||||||
|
lowPriority,
|
||||||
markUnread,
|
markUnread,
|
||||||
mute,
|
mute,
|
||||||
leave,
|
leave,
|
||||||
|
|
|
||||||
|
|
@ -191,6 +191,17 @@ class ChatListItem extends StatelessWidget {
|
||||||
padding: EdgeInsets.only(left: 4.0),
|
padding: EdgeInsets.only(left: 4.0),
|
||||||
child: Icon(Icons.notifications_off_outlined, size: 16),
|
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)
|
if (room.isFavourite)
|
||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import 'package:go_router/go_router.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
import 'package:url_launcher/url_launcher_string.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/config/themes.dart';
|
||||||
import 'package:fluffychat/l10n/l10n.dart';
|
import 'package:fluffychat/l10n/l10n.dart';
|
||||||
import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
|
import 'package:fluffychat/widgets/adaptive_dialogs/show_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(
|
PopupMenuItem(
|
||||||
value: SettingsAction.settings,
|
value: SettingsAction.settings,
|
||||||
child: Row(
|
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(),
|
const PopupMenuDivider(),
|
||||||
for (final bundle in bundles) ...[
|
for (final bundle in bundles) ...[
|
||||||
if (matrix.accountBundles[bundle]!.length != 1 ||
|
if (matrix.accountBundles[bundle]!.length != 1 ||
|
||||||
|
|
@ -224,7 +222,9 @@ class ClientChooserButton extends StatelessWidget {
|
||||||
FluffyShare.shareInviteLink(context);
|
FluffyShare.shareInviteLink(context);
|
||||||
break;
|
break;
|
||||||
case SettingsAction.support:
|
case SettingsAction.support:
|
||||||
launchUrlString(AppConfig.donationUrl);
|
launchUrlString(
|
||||||
|
'https://fluffychat.im/faq/#how_can_i_support_fluffychat',
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
case SettingsAction.settings:
|
case SettingsAction.settings:
|
||||||
context.go('/rooms/settings');
|
context.go('/rooms/settings');
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:chewie/chewie.dart';
|
import 'package:chewie/chewie.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
import 'package:path_provider/path_provider.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:video_player/video_player.dart';
|
||||||
|
|
||||||
import 'package:fluffychat/utils/localized_exception_extension.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.
|
// Create the VideoPlayerController from the contents of videoFile.
|
||||||
if (kIsWeb) {
|
if (kIsWeb) {
|
||||||
final blob = html.Blob([videoFile.bytes], videoFile.mimeType);
|
videoPlayerController = VideoPlayerController.networkUrl(
|
||||||
final networkUri = Uri.parse(html.Url.createObjectUrlFromBlob(blob));
|
Uri.dataFromBytes(videoFile.bytes, mimeType: videoFile.mimeType),
|
||||||
videoPlayerController = VideoPlayerController.networkUrl(networkUri);
|
);
|
||||||
} else {
|
} else {
|
||||||
final tempDir = await getTemporaryDirectory();
|
final tempDir = await getTemporaryDirectory();
|
||||||
final fileName = Uri.encodeComponent(
|
final fileName = Uri.encodeComponent(
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,9 @@ import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:flutter_linkify/flutter_linkify.dart';
|
import 'package:flutter_linkify/flutter_linkify.dart';
|
||||||
import 'package:go_router/go_router.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: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/l10n/l10n.dart';
|
||||||
import 'package:fluffychat/pages/intro/flows/restore_backup_flow.dart';
|
import 'package:fluffychat/pages/intro/flows/restore_backup_flow.dart';
|
||||||
import 'package:fluffychat/utils/platform_infos.dart';
|
import 'package:fluffychat/utils/platform_infos.dart';
|
||||||
|
|
@ -58,7 +57,7 @@ class IntroPage extends StatelessWidget {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
PopupMenuItem(
|
PopupMenuItem(
|
||||||
onTap: () => launchUrl(AppConfig.privacyUrl),
|
onTap: () => launchUrlString(AppSettings.privacyPolicy.value),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: .min,
|
mainAxisSize: .min,
|
||||||
children: [
|
children: [
|
||||||
|
|
@ -69,7 +68,7 @@ class IntroPage extends StatelessWidget {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
PopupMenuItem(
|
PopupMenuItem(
|
||||||
value: () => PlatformInfos.showDialog(context),
|
onTap: () => PlatformInfos.showDialog(context),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: .min,
|
mainAxisSize: .min,
|
||||||
children: [
|
children: [
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,7 @@ class _IntroPagePresenterState extends State<IntroPagePresenter> {
|
||||||
final client = await Matrix.of(context).getLoginClient();
|
final client = await Matrix.of(context).getLoginClient();
|
||||||
await client.checkHomeserver(homeserverUrl);
|
await client.checkHomeserver(homeserverUrl);
|
||||||
await client.oidcLogin(session: session, code: code, state: state);
|
await client.oidcLogin(session: session, code: code, state: state);
|
||||||
|
if (context.mounted) context.go('/backup');
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
Logs().w('Unable to login via OIDC', e, s);
|
Logs().w('Unable to login via OIDC', e, s);
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
|
|
|
||||||
|
|
@ -191,10 +191,9 @@ class _InviteContactListTile extends StatelessWidget {
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
style: TextStyle(color: theme.colorScheme.secondary),
|
style: TextStyle(color: theme.colorScheme.secondary),
|
||||||
),
|
),
|
||||||
trailing: TextButton.icon(
|
trailing: TextButton(
|
||||||
onPressed: isMember ? null : onTap,
|
onPressed: isMember ? null : onTap,
|
||||||
label: Text(isMember ? l10n.participant : l10n.invite),
|
child: Text(isMember ? l10n.participant : l10n.invite),
|
||||||
icon: Icon(isMember ? Icons.check : Icons.add),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@ import 'package:fluffychat/widgets/matrix.dart';
|
||||||
import '../../widgets/adaptive_dialogs/user_dialog.dart';
|
import '../../widgets/adaptive_dialogs/user_dialog.dart';
|
||||||
|
|
||||||
class NewPrivateChat extends StatefulWidget {
|
class NewPrivateChat extends StatefulWidget {
|
||||||
const NewPrivateChat({super.key});
|
final String? deeplink;
|
||||||
|
const NewPrivateChat({super.key, required this.deeplink});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
NewPrivateChatController createState() => NewPrivateChatController();
|
NewPrivateChatController createState() => NewPrivateChatController();
|
||||||
|
|
@ -33,6 +34,18 @@ class NewPrivateChatController extends State<NewPrivateChat> {
|
||||||
|
|
||||||
static const Duration _coolDown = Duration(milliseconds: 500);
|
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 {
|
Future<void> searchUsers([String? input]) async {
|
||||||
final searchTerm = input ?? controller.text;
|
final searchTerm = input ?? controller.text;
|
||||||
if (searchTerm.isEmpty) {
|
if (searchTerm.isEmpty) {
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,9 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
import 'package:url_launcher/url_launcher.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/l10n/l10n.dart';
|
||||||
import 'package:fluffychat/utils/fluffy_share.dart';
|
import 'package:fluffychat/utils/fluffy_share.dart';
|
||||||
import 'package:fluffychat/utils/platform_infos.dart';
|
import 'package:fluffychat/utils/platform_infos.dart';
|
||||||
|
|
@ -200,7 +201,7 @@ class SettingsView extends StatelessWidget {
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(Icons.privacy_tip_outlined),
|
leading: const Icon(Icons.privacy_tip_outlined),
|
||||||
title: Text(L10n.of(context).privacy),
|
title: Text(L10n.of(context).privacy),
|
||||||
onTap: () => launchUrl(AppConfig.privacyUrl),
|
onTap: () => launchUrlString(AppSettings.privacyPolicy.value),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(Icons.info_outline_rounded),
|
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:file_picker/file_picker.dart';
|
||||||
|
|
||||||
import 'package:fluffychat/config/app_config.dart';
|
|
||||||
import 'package:fluffychat/config/setting_keys.dart';
|
import 'package:fluffychat/config/setting_keys.dart';
|
||||||
import 'package:fluffychat/utils/account_config.dart';
|
import 'package:fluffychat/utils/account_config.dart';
|
||||||
import 'package:fluffychat/utils/file_selector.dart';
|
import 'package:fluffychat/utils/file_selector.dart';
|
||||||
|
|
@ -111,32 +110,6 @@ class SettingsStyleController extends State<SettingsStyle> {
|
||||||
ThemeMode get currentTheme => ThemeController.of(context).themeMode;
|
ThemeMode get currentTheme => ThemeController.of(context).themeMode;
|
||||||
Color? get currentColor => ThemeController.of(context).primaryColor;
|
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) {
|
void switchTheme(ThemeMode? newTheme) {
|
||||||
if (newTheme == null) return;
|
if (newTheme == null) return;
|
||||||
switch (newTheme) {
|
switch (newTheme) {
|
||||||
|
|
|
||||||
|
|
@ -82,14 +82,13 @@ class SettingsStyleView extends StatelessWidget {
|
||||||
Theme.of(context).brightness == Brightness.light
|
Theme.of(context).brightness == Brightness.light
|
||||||
? light?.primary
|
? light?.primary
|
||||||
: dark?.primary;
|
: dark?.primary;
|
||||||
final colors = List<Color?>.from(
|
final colors = [null, AppConfig.chatColor, ...Colors.primaries];
|
||||||
SettingsStyleController.customColors,
|
|
||||||
);
|
|
||||||
if (systemColor == null) {
|
if (systemColor == null) {
|
||||||
colors.remove(null);
|
colors.remove(null);
|
||||||
}
|
}
|
||||||
return GridView.builder(
|
return GridView.builder(
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
|
physics: NeverScrollableScrollPhysics(),
|
||||||
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
|
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
|
||||||
maxCrossAxisExtent: 64,
|
maxCrossAxisExtent: 64,
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -98,19 +98,11 @@ class SignInPage extends StatelessWidget {
|
||||||
final website = server.website;
|
final website = server.website;
|
||||||
return Semantics(
|
return Semantics(
|
||||||
identifier: 'homeserver_tile_$i',
|
identifier: 'homeserver_tile_$i',
|
||||||
child: RadioListTile.adaptive(
|
child: RadioListTile(
|
||||||
value: server,
|
value: server,
|
||||||
enabled:
|
enabled:
|
||||||
state.loginLoading.connectionState !=
|
state.loginLoading.connectionState !=
|
||||||
ConnectionState.waiting,
|
ConnectionState.waiting,
|
||||||
radioScaleFactor:
|
|
||||||
FluffyThemes.isColumnMode(context) ||
|
|
||||||
{
|
|
||||||
TargetPlatform.iOS,
|
|
||||||
TargetPlatform.macOS,
|
|
||||||
}.contains(theme.platform)
|
|
||||||
? 2
|
|
||||||
: 1,
|
|
||||||
title: Row(
|
title: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(
|
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/app_config.dart';
|
||||||
import 'package:fluffychat/config/setting_keys.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/model/public_homeserver_data.dart';
|
||||||
import 'package:fluffychat/pages/sign_in/view_model/sign_in_state.dart';
|
import 'package:fluffychat/pages/sign_in/view_model/sign_in_state.dart';
|
||||||
import 'package:fluffychat/widgets/matrix.dart';
|
import 'package:fluffychat/widgets/matrix.dart';
|
||||||
|
|
@ -39,7 +38,9 @@ class SignInViewModel extends ValueNotifier<SignInState> {
|
||||||
)
|
)
|
||||||
.toList() ??
|
.toList() ??
|
||||||
[];
|
[];
|
||||||
if (Uri.tryParse(filterText) != null &&
|
if (filterText.length >= 3 &&
|
||||||
|
(filterText.contains('.') || filterText == 'localhost') &&
|
||||||
|
Uri.tryParse(filterText) != null &&
|
||||||
!filteredPublicHomeservers.any(
|
!filteredPublicHomeservers.any(
|
||||||
(homeserver) => homeserver.name == filterText,
|
(homeserver) => homeserver.name == filterText,
|
||||||
)) {
|
)) {
|
||||||
|
|
@ -72,8 +73,6 @@ class SignInViewModel extends ValueNotifier<SignInState> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
publicHomeservers.sort(sortHomeservers);
|
|
||||||
|
|
||||||
final defaultServer = publicHomeservers.singleWhereOrNull(
|
final defaultServer = publicHomeservers.singleWhereOrNull(
|
||||||
(server) => server.name == AppSettings.defaultHomeserver.value,
|
(server) => server.name == AppSettings.defaultHomeserver.value,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,9 @@ abstract class ClientManager {
|
||||||
// To make room emotes work
|
// To make room emotes work
|
||||||
'im.ponies.room_emotes',
|
'im.ponies.room_emotes',
|
||||||
},
|
},
|
||||||
customImageResizer: customImageResizer,
|
customImageResizer: PlatformInfos.supportsCustomImageResizer
|
||||||
|
? customImageResizer
|
||||||
|
: null,
|
||||||
logLevel: kReleaseMode ? Level.warning : Level.verbose,
|
logLevel: kReleaseMode ? Level.warning : Level.verbose,
|
||||||
database: await flutterMatrixSdkDatabaseBuilder(clientName),
|
database: await flutterMatrixSdkDatabaseBuilder(clientName),
|
||||||
supportedLoginTypes: {
|
supportedLoginTypes: {
|
||||||
|
|
@ -141,6 +143,9 @@ abstract class ClientManager {
|
||||||
onSoftLogout: enableSoftLogout
|
onSoftLogout: enableSoftLogout
|
||||||
? (client) => client.refreshAccessToken()
|
? (client) => client.refreshAccessToken()
|
||||||
: null,
|
: 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:matrix/matrix.dart';
|
||||||
|
|
||||||
import 'package:fluffychat/l10n/l10n.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/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 'package:fluffychat/utils/push_helper.dart';
|
||||||
import '../config/app_config.dart';
|
import '../config/app_config.dart';
|
||||||
import '../config/setting_keys.dart';
|
import '../config/setting_keys.dart';
|
||||||
|
|
@ -172,91 +169,15 @@ Future<void> notificationTap(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final eventId = await room.sendTextEvent(
|
await room.sendTextEvent(
|
||||||
input,
|
input,
|
||||||
parseCommands: false,
|
parseCommands: false,
|
||||||
displayPendingEvent: false,
|
displayPendingEvent: false,
|
||||||
);
|
);
|
||||||
|
case FluffyChatNotificationActions.mute:
|
||||||
if (PlatformInfos.isAndroid) {
|
await room.setPushRuleState(PushRuleState.mentionsOnly);
|
||||||
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(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum FluffyChatNotificationActions { markAsRead, reply }
|
enum FluffyChatNotificationActions { markAsRead, reply, mute }
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,9 @@ abstract class PlatformInfos {
|
||||||
static bool get supportsVideoPlayer =>
|
static bool get supportsVideoPlayer =>
|
||||||
!PlatformInfos.isWindows && !PlatformInfos.isLinux;
|
!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
|
/// Web could also record in theory but currently only wav which is too large
|
||||||
static bool get platformCanRecord => (isMobile || isMacOS || isWeb);
|
static bool get platformCanRecord => (isMobile || isMacOS || isWeb);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -162,43 +162,15 @@ Future<void> _tryPushHelper(
|
||||||
? avatar
|
? avatar
|
||||||
: event.senderFromMemoryOrFallback.avatarUrl;
|
: event.senderFromMemoryOrFallback.avatarUrl;
|
||||||
|
|
||||||
Uint8List? roomAvatarFile, senderAvatarFile;
|
final ownUser = event.room.unsafeGetUserFromMemoryOrFallback(client.userID!);
|
||||||
try {
|
|
||||||
roomAvatarFile = avatar == null
|
final userAvatarFile = await client.tryDownloadNotificationAvatar(
|
||||||
? null
|
ownUser.avatarUrl,
|
||||||
: await client
|
);
|
||||||
.downloadMxcCached(
|
final roomAvatarFile = await client.tryDownloadNotificationAvatar(avatar);
|
||||||
avatar,
|
final senderAvatarFile = await client.tryDownloadNotificationAvatar(
|
||||||
thumbnailMethod: ThumbnailMethod.crop,
|
senderAvatar,
|
||||||
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 id = notification.roomId.hashCode;
|
final id = notification.roomId.hashCode;
|
||||||
|
|
||||||
|
|
@ -262,12 +234,11 @@ Future<void> _tryPushHelper(
|
||||||
messagingStyleInformation ??
|
messagingStyleInformation ??
|
||||||
MessagingStyleInformation(
|
MessagingStyleInformation(
|
||||||
Person(
|
Person(
|
||||||
name: senderName,
|
name: ownUser.calcDisplayname(),
|
||||||
icon: roomAvatarFile == null
|
icon: userAvatarFile == null
|
||||||
? null
|
? null
|
||||||
: ByteArrayAndroidIcon(roomAvatarFile),
|
: ByteArrayAndroidIcon(userAvatarFile),
|
||||||
key: event.roomId,
|
key: event.room.client.userID,
|
||||||
important: event.room.isFavourite,
|
|
||||||
),
|
),
|
||||||
conversationTitle: event.room.isDirectChat ? null : roomName,
|
conversationTitle: event.room.isDirectChat ? null : roomName,
|
||||||
groupConversation: !event.room.isDirectChat,
|
groupConversation: !event.room.isDirectChat,
|
||||||
|
|
@ -293,7 +264,6 @@ Future<void> _tryPushHelper(
|
||||||
inputs: [
|
inputs: [
|
||||||
AndroidNotificationActionInput(label: l10n.writeAMessage),
|
AndroidNotificationActionInput(label: l10n.writeAMessage),
|
||||||
],
|
],
|
||||||
cancelNotification: false,
|
|
||||||
allowGeneratedReplies: true,
|
allowGeneratedReplies: true,
|
||||||
semanticAction: SemanticAction.reply,
|
semanticAction: SemanticAction.reply,
|
||||||
),
|
),
|
||||||
|
|
@ -302,6 +272,11 @@ Future<void> _tryPushHelper(
|
||||||
l10n.markAsRead,
|
l10n.markAsRead,
|
||||||
semanticAction: SemanticAction.markAsRead,
|
semanticAction: SemanticAction.markAsRead,
|
||||||
),
|
),
|
||||||
|
AndroidNotificationAction(
|
||||||
|
FluffyChatNotificationActions.mute.name,
|
||||||
|
l10n.mute,
|
||||||
|
semanticAction: SemanticAction.mute,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
const iOSPlatformChannelSpecifics = DarwinNotificationDetails();
|
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:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:matrix/matrix.dart';
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
import 'package:fluffychat/config/setting_keys.dart';
|
import 'package:fluffychat/config/setting_keys.dart';
|
||||||
|
|
@ -51,7 +52,7 @@ Future<void> connectToHomeserverFlow(
|
||||||
if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) {
|
if (authMetadata != null && AppSettings.enableMatrixNativeOIDC.value) {
|
||||||
await oidcLoginFlow(client, context, signUp);
|
await oidcLoginFlow(client, context, signUp);
|
||||||
} else if (supportsSso) {
|
} else if (supportsSso) {
|
||||||
await ssoLoginFlow(client, context, signUp);
|
await ssoLoginFlow(client, context, signUp, loginFlows);
|
||||||
} else {
|
} else {
|
||||||
if (signUp && regLink != null) {
|
if (signUp && regLink != null) {
|
||||||
await launchUrlString(regLink);
|
await launchUrlString(regLink);
|
||||||
|
|
@ -73,6 +74,7 @@ Future<void> connectToHomeserverFlow(
|
||||||
context.go('/backup');
|
context.go('/backup');
|
||||||
}
|
}
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
|
Logs().w('Unable to login', e, s);
|
||||||
setState(AsyncSnapshot.withError(ConnectionState.done, e, s));
|
setState(AsyncSnapshot.withError(ConnectionState.done, e, s));
|
||||||
if (!context.mounted) return;
|
if (!context.mounted) return;
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
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:flutter_web_auth_2/flutter_web_auth_2.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.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/config/setting_keys.dart';
|
||||||
import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart';
|
import 'package:fluffychat/utils/matrix_sdk_extensions/oidc_session_json_extension.dart';
|
||||||
import 'package:fluffychat/utils/platform_infos.dart';
|
import 'package:fluffychat/utils/platform_infos.dart';
|
||||||
|
import 'package:fluffychat/utils/sign_in_flows/calc_redirect_url.dart';
|
||||||
|
|
||||||
Future<void> oidcLoginFlow(
|
Future<void> oidcLoginFlow(
|
||||||
Client client,
|
Client client,
|
||||||
|
|
@ -19,24 +18,16 @@ Future<void> oidcLoginFlow(
|
||||||
bool signUp,
|
bool signUp,
|
||||||
) async {
|
) async {
|
||||||
Logs().i('Starting Matrix Native OIDC Flow...');
|
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 =
|
final (redirectUrl, urlScheme) = calcRedirectUrl();
|
||||||
(PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
|
|
||||||
? redirectUrl.scheme
|
|
||||||
: 'http://localhost:3001';
|
|
||||||
|
|
||||||
final clientUri = Uri.parse(AppConfig.website);
|
final clientUri = Uri.parse(AppSettings.website.value);
|
||||||
final supportWebPlatform =
|
final supportWebPlatform =
|
||||||
kIsWeb &&
|
kIsWeb &&
|
||||||
kReleaseMode &&
|
kReleaseMode &&
|
||||||
redirectUrl.scheme == 'https' &&
|
redirectUrl.scheme == 'https' &&
|
||||||
redirectUrl.host.contains(clientUri.host);
|
redirectUrl.host.contains(clientUri.host);
|
||||||
if (!supportWebPlatform) {
|
if (kIsWeb && !supportWebPlatform) {
|
||||||
Logs().w(
|
Logs().w(
|
||||||
'OIDC Application Type web is not supported. Using native now. Please use this instance not in production!',
|
'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(
|
clientInformation: OidcClientInformation(
|
||||||
clientName: AppSettings.applicationName.value,
|
clientName: AppSettings.applicationName.value,
|
||||||
clientUri: clientUri,
|
clientUri: clientUri,
|
||||||
logoUri: Uri.parse('https://fluffy.chat/assets/favicon.png'),
|
logoUri: Uri.parse(AppSettings.logoUrl.value),
|
||||||
tosUri: null,
|
tosUri: Uri.parse(AppSettings.tos.value),
|
||||||
policyUri: AppConfig.privacyUrl,
|
policyUri: Uri.parse(AppSettings.privacyPolicy.value),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,39 +1,60 @@
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
|
import 'package:flutter_web_auth_2/flutter_web_auth_2.dart';
|
||||||
import 'package:matrix/matrix.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/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(
|
Future<void> ssoLoginFlow(
|
||||||
Client client,
|
Client client,
|
||||||
BuildContext context,
|
BuildContext context,
|
||||||
bool signUp,
|
bool signUp,
|
||||||
|
List<LoginFlow> loginFlows,
|
||||||
) async {
|
) async {
|
||||||
Logs().i('Starting legacy SSO Flow...');
|
final (redirectUrl, urlScheme) = calcRedirectUrl(withAuthHtmlPath: true);
|
||||||
final redirectUrl = kIsWeb
|
|
||||||
? Uri.parse(
|
Logs().i('Starting legacy SSO Flow with redirect URL', redirectUrl);
|
||||||
html.window.location.href,
|
|
||||||
).resolveUri(Uri(pathSegments: ['auth.html'])).toString()
|
final ssoProviders =
|
||||||
: (PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
|
(loginFlows
|
||||||
? '${AppConfig.appOpenUrlScheme.toLowerCase()}://login'
|
.firstWhere((flow) => flow.type == 'm.login.sso')
|
||||||
: 'http://localhost:3001//login';
|
.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(
|
final url = client.homeserver!.replace(
|
||||||
path: '/_matrix/client/v3/login/sso/redirect',
|
path:
|
||||||
|
'/_matrix/client/v3/login/sso/redirect${provider == null ? '' : '/${provider.id}'}',
|
||||||
queryParameters: {
|
queryParameters: {
|
||||||
'redirectUrl': redirectUrl,
|
'redirectUrl': redirectUrl.toString(),
|
||||||
'action': signUp ? 'register' : 'login',
|
'action': signUp ? 'register' : 'login',
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
final urlScheme =
|
|
||||||
(PlatformInfos.isMobile || PlatformInfos.isWeb || PlatformInfos.isMacOS)
|
|
||||||
? Uri.parse(redirectUrl).scheme
|
|
||||||
: 'http://localhost:3001';
|
|
||||||
final result = await FlutterWebAuth2.authenticate(
|
final result = await FlutterWebAuth2.authenticate(
|
||||||
url: url.toString(),
|
url: url.toString(),
|
||||||
callbackUrlScheme: urlScheme,
|
callbackUrlScheme: urlScheme,
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ class AdaptiveDialogAction extends StatelessWidget {
|
||||||
|
|
||||||
class AdaptiveDialogInkWell extends StatelessWidget {
|
class AdaptiveDialogInkWell extends StatelessWidget {
|
||||||
final Widget child;
|
final Widget child;
|
||||||
final VoidCallback onTap;
|
final VoidCallback? onTap;
|
||||||
final EdgeInsets padding;
|
final EdgeInsets padding;
|
||||||
|
|
||||||
const AdaptiveDialogInkWell({
|
const AdaptiveDialogInkWell({
|
||||||
|
|
@ -108,7 +108,9 @@ class AdaptiveDialogInkWell extends StatelessWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return Material(
|
return Material(
|
||||||
color: theme.colorScheme.surfaceBright,
|
color: onTap == null
|
||||||
|
? theme.colorScheme.surfaceContainer
|
||||||
|
: theme.colorScheme.surfaceBright,
|
||||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2),
|
borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2),
|
borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2),
|
||||||
|
|
@ -125,7 +127,7 @@ class AdaptiveDialogInkWell extends StatelessWidget {
|
||||||
class AdaptiveIconTextButton extends StatelessWidget {
|
class AdaptiveIconTextButton extends StatelessWidget {
|
||||||
final String label;
|
final String label;
|
||||||
final IconData icon;
|
final IconData icon;
|
||||||
final VoidCallback onTap;
|
final VoidCallback? onTap;
|
||||||
const AdaptiveIconTextButton({
|
const AdaptiveIconTextButton({
|
||||||
super.key,
|
super.key,
|
||||||
required this.label,
|
required this.label,
|
||||||
|
|
|
||||||
|
|
@ -185,6 +185,7 @@ class PublicRoomDialog extends StatelessWidget {
|
||||||
style: theme.textTheme.bodyMedium
|
style: theme.textTheme.bodyMedium
|
||||||
?.copyWith(fontSize: 10),
|
?.copyWith(fontSize: 10),
|
||||||
),
|
),
|
||||||
|
maxLines: 1,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ class UserDialog extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final client = Matrix.of(context).client;
|
final client = Matrix.of(context).client;
|
||||||
|
final directChatRoomId = client.getDirectChatFromUserId(profile.userId);
|
||||||
final displayname =
|
final displayname =
|
||||||
profile.displayName ??
|
profile.displayName ??
|
||||||
profile.userId.localpart ??
|
profile.userId.localpart ??
|
||||||
|
|
@ -194,35 +195,39 @@ class UserDialog extends StatelessWidget {
|
||||||
AdaptiveIconTextButton(
|
AdaptiveIconTextButton(
|
||||||
label: L10n.of(context).block,
|
label: L10n.of(context).block,
|
||||||
icon: Icons.block_outlined,
|
icon: Icons.block_outlined,
|
||||||
onTap: () {
|
onTap: client.userID == profile.userId
|
||||||
final router = GoRouter.of(context);
|
? null
|
||||||
Navigator.of(context).pop();
|
: () {
|
||||||
router.go(
|
final router = GoRouter.of(context);
|
||||||
'/rooms/settings/security/ignorelist',
|
Navigator.of(context).pop();
|
||||||
extra: profile.userId,
|
router.go(
|
||||||
);
|
'/rooms/settings/security/ignorelist',
|
||||||
},
|
extra: profile.userId,
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
AdaptiveIconTextButton(
|
AdaptiveIconTextButton(
|
||||||
label: L10n.of(context).report,
|
label: L10n.of(context).report,
|
||||||
icon: Icons.gavel_outlined,
|
icon: Icons.gavel_outlined,
|
||||||
onTap: () async {
|
onTap: client.userID == profile.userId
|
||||||
Navigator.of(context).pop();
|
? null
|
||||||
final reason = await showTextInputDialog(
|
: () async {
|
||||||
context: context,
|
Navigator.of(context).pop();
|
||||||
title: L10n.of(context).whyDoYouWantToReportThis,
|
final reason = await showTextInputDialog(
|
||||||
okLabel: L10n.of(context).report,
|
context: context,
|
||||||
cancelLabel: L10n.of(context).cancel,
|
title: L10n.of(context).whyDoYouWantToReportThis,
|
||||||
hintText: L10n.of(context).reason,
|
okLabel: L10n.of(context).report,
|
||||||
);
|
cancelLabel: L10n.of(context).cancel,
|
||||||
if (reason == null || reason.isEmpty) return;
|
hintText: L10n.of(context).reason,
|
||||||
await showFutureLoadingDialog(
|
);
|
||||||
context: context,
|
if (reason == null || reason.isEmpty) return;
|
||||||
future: () => Matrix.of(
|
await showFutureLoadingDialog(
|
||||||
context,
|
context: context,
|
||||||
).client.reportUser(profile.userId, reason),
|
future: () => Matrix.of(
|
||||||
);
|
context,
|
||||||
},
|
).client.reportUser(profile.userId, reason),
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
AdaptiveIconTextButton(
|
AdaptiveIconTextButton(
|
||||||
label: L10n.of(context).share,
|
label: L10n.of(context).share,
|
||||||
|
|
@ -235,19 +240,23 @@ class UserDialog extends StatelessWidget {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
AdaptiveDialogInkWell(
|
AdaptiveDialogInkWell(
|
||||||
onTap: () async {
|
onTap: client.userID == profile.userId
|
||||||
final router = GoRouter.of(context);
|
? null
|
||||||
final roomIdResult = await showFutureLoadingDialog(
|
: () async {
|
||||||
context: context,
|
final router = GoRouter.of(context);
|
||||||
future: () => client.startDirectChat(profile.userId),
|
final roomIdResult = await showFutureLoadingDialog(
|
||||||
);
|
context: context,
|
||||||
final roomId = roomIdResult.result;
|
future: () => client.startDirectChat(profile.userId),
|
||||||
if (roomId == null) return;
|
);
|
||||||
if (context.mounted) Navigator.of(context).pop();
|
final roomId = roomIdResult.result;
|
||||||
router.go('/rooms/$roomId');
|
if (roomId == null) return;
|
||||||
},
|
if (context.mounted) Navigator.of(context).pop();
|
||||||
|
router.go('/rooms/$roomId');
|
||||||
|
},
|
||||||
child: Text(
|
child: Text(
|
||||||
L10n.of(context).sendAMessage,
|
directChatRoomId == null
|
||||||
|
? L10n.of(context).createNewChat
|
||||||
|
: L10n.of(context).sendAMessage,
|
||||||
style: TextStyle(color: theme.colorScheme.secondary),
|
style: TextStyle(color: theme.colorScheme.secondary),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@ class ConfigViewer extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ConfigViewerState extends State<ConfigViewer> {
|
class _ConfigViewerState extends State<ConfigViewer> {
|
||||||
|
String _searchQuery = '';
|
||||||
|
|
||||||
Future<void> _changeSetting(
|
Future<void> _changeSetting(
|
||||||
AppSettings appSetting,
|
AppSettings appSetting,
|
||||||
SharedPreferences store,
|
SharedPreferences store,
|
||||||
|
|
@ -48,15 +50,32 @@ class _ConfigViewerState extends State<ConfigViewer> {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _reset() async {
|
||||||
|
await AppSettings.reset();
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
|
final normalizedQuery = _searchQuery.trim().toLowerCase();
|
||||||
|
final filteredSettings = AppSettings.values
|
||||||
|
.where((setting) {
|
||||||
|
if (normalizedQuery.isEmpty) return true;
|
||||||
|
return setting.name.toLowerCase().contains(normalizedQuery);
|
||||||
|
})
|
||||||
|
.toList(growable: false);
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(L10n.of(context).advancedConfigurations),
|
title: Text(L10n.of(context).advancedConfigurations),
|
||||||
leading: BackButton(onPressed: () => context.go('/')),
|
leading: BackButton(onPressed: () => context.go('/')),
|
||||||
|
actions: [
|
||||||
|
TextButton(onPressed: _reset, child: Text(L10n.of(context).reset)),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
body: Column(
|
body: Column(
|
||||||
|
crossAxisAlignment: .stretch,
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
margin: const EdgeInsets.all(16),
|
margin: const EdgeInsets.all(16),
|
||||||
|
|
@ -67,12 +86,29 @@ class _ConfigViewerState extends State<ConfigViewer> {
|
||||||
style: TextStyle(color: theme.colorScheme.onErrorContainer),
|
style: TextStyle(color: theme.colorScheme.onErrorContainer),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||||
|
child: TextField(
|
||||||
|
onChanged: (value) => setState(() => _searchQuery = value),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
hintText: 'Search config key',
|
||||||
|
prefixIcon: const Icon(Icons.search),
|
||||||
|
border: const OutlineInputBorder(),
|
||||||
|
isDense: true,
|
||||||
|
filled: true,
|
||||||
|
fillColor: theme.colorScheme.surfaceContainerHighest.withAlpha(
|
||||||
|
128,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 8),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: ListView.builder(
|
child: ListView.builder(
|
||||||
itemCount: AppSettings.values.length,
|
itemCount: filteredSettings.length,
|
||||||
itemBuilder: (context, i) {
|
itemBuilder: (context, i) {
|
||||||
final store = Matrix.of(context).store;
|
final store = Matrix.of(context).store;
|
||||||
final appSetting = AppSettings.values[i];
|
final appSetting = filteredSettings[i];
|
||||||
var value = '';
|
var value = '';
|
||||||
if (appSetting is AppSettings<String>) {
|
if (appSetting is AppSettings<String>) {
|
||||||
value = appSetting.value;
|
value = appSetting.value;
|
||||||
|
|
@ -81,7 +117,13 @@ class _ConfigViewerState extends State<ConfigViewer> {
|
||||||
value = appSetting.value.toString();
|
value = appSetting.value.toString();
|
||||||
}
|
}
|
||||||
if (appSetting is AppSettings<bool>) {
|
if (appSetting is AppSettings<bool>) {
|
||||||
value = appSetting.value.toString();
|
return SwitchListTile.adaptive(
|
||||||
|
title: Text(appSetting.name),
|
||||||
|
subtitle: Text(value),
|
||||||
|
value: appSetting.value,
|
||||||
|
onChanged: (value) =>
|
||||||
|
_changeSetting(appSetting, store, (!value).toString()),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (appSetting is AppSettings<double>) {
|
if (appSetting is AppSettings<double>) {
|
||||||
value = appSetting.value.toString();
|
value = appSetting.value.toString();
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'package:go_router/go_router.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
import 'package:fluffychat/config/app_config.dart';
|
||||||
import 'package:fluffychat/config/routes.dart';
|
import 'package:fluffychat/config/routes.dart';
|
||||||
import 'package:fluffychat/config/setting_keys.dart';
|
import 'package:fluffychat/config/setting_keys.dart';
|
||||||
import 'package:fluffychat/config/themes.dart';
|
import 'package:fluffychat/config/themes.dart';
|
||||||
|
|
@ -37,6 +38,12 @@ class FluffyChatApp extends StatelessWidget {
|
||||||
static final GoRouter router = GoRouter(
|
static final GoRouter router = GoRouter(
|
||||||
routes: AppRoutes.routes,
|
routes: AppRoutes.routes,
|
||||||
debugLogDiagnostics: true,
|
debugLogDiagnostics: true,
|
||||||
|
redirect: (context, state) {
|
||||||
|
if (state.uri.toString().startsWith(AppConfig.deepLinkPrefix)) {
|
||||||
|
return '/rooms/newprivatechat?deeplink=${state.uri}';
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:particles_network/particles_network.dart';
|
import 'package:particles_network/particles_network.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
import 'package:fluffychat/config/app_config.dart';
|
import 'package:fluffychat/config/app_config.dart';
|
||||||
|
import 'package:fluffychat/config/setting_keys.dart';
|
||||||
import 'package:fluffychat/config/themes.dart';
|
import 'package:fluffychat/config/themes.dart';
|
||||||
import 'package:fluffychat/l10n/l10n.dart';
|
import 'package:fluffychat/l10n/l10n.dart';
|
||||||
import 'package:fluffychat/utils/platform_infos.dart';
|
import 'package:fluffychat/utils/platform_infos.dart';
|
||||||
|
|
@ -118,7 +118,7 @@ class _PrivacyButtons extends StatelessWidget {
|
||||||
mainAxisAlignment: mainAxisAlignment,
|
mainAxisAlignment: mainAxisAlignment,
|
||||||
children: [
|
children: [
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () => launchUrlString(AppConfig.website),
|
onPressed: () => launchUrlString(AppSettings.website.value),
|
||||||
child: Text(L10n.of(context).website, style: shadowTextStyle),
|
child: Text(L10n.of(context).website, style: shadowTextStyle),
|
||||||
),
|
),
|
||||||
TextButton(
|
TextButton(
|
||||||
|
|
@ -126,7 +126,7 @@ class _PrivacyButtons extends StatelessWidget {
|
||||||
child: Text(L10n.of(context).help, style: shadowTextStyle),
|
child: Text(L10n.of(context).help, style: shadowTextStyle),
|
||||||
),
|
),
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () => launchUrl(AppConfig.privacyUrl),
|
onPressed: () => launchUrlString(AppSettings.privacyPolicy.value),
|
||||||
child: Text(L10n.of(context).privacy, style: shadowTextStyle),
|
child: Text(L10n.of(context).privacy, style: shadowTextStyle),
|
||||||
),
|
),
|
||||||
TextButton(
|
TextButton(
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,6 @@ import 'package:fluffychat/widgets/fluffy_chat_app.dart';
|
||||||
import 'package:fluffychat/widgets/matrix.dart';
|
import 'package:fluffychat/widgets/matrix.dart';
|
||||||
|
|
||||||
extension LocalNotificationsExtension on MatrixState {
|
extension LocalNotificationsExtension on MatrixState {
|
||||||
static final html.AudioElement _audioPlayer = html.AudioElement()
|
|
||||||
..src = 'assets/assets/sounds/notification.ogg'
|
|
||||||
..load();
|
|
||||||
|
|
||||||
Future<void> showLocalNotification(Event event) async {
|
Future<void> showLocalNotification(Event event) async {
|
||||||
final roomId = event.room.id;
|
final roomId = event.room.id;
|
||||||
if (activeRoomId == roomId) {
|
if (activeRoomId == roomId) {
|
||||||
|
|
@ -74,8 +70,6 @@ extension LocalNotificationsExtension on MatrixState {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
_audioPlayer.play();
|
|
||||||
|
|
||||||
html.Notification(
|
html.Notification(
|
||||||
title,
|
title,
|
||||||
body: body,
|
body: body,
|
||||||
|
|
|
||||||
|
|
@ -257,7 +257,7 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
|
||||||
});
|
});
|
||||||
onLogoutSub[name] ??= c.onLoginStateChanged.stream
|
onLogoutSub[name] ??= c.onLoginStateChanged.stream
|
||||||
.where((state) => state == LoginState.loggedOut)
|
.where((state) => state == LoginState.loggedOut)
|
||||||
.listen((state) {
|
.listen((_) {
|
||||||
final loggedInWithMultipleClients = widget.clients.length > 1;
|
final loggedInWithMultipleClients = widget.clients.length > 1;
|
||||||
|
|
||||||
_cancelSubs(c.clientName);
|
_cancelSubs(c.clientName);
|
||||||
|
|
@ -272,11 +272,9 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
|
||||||
).showSnackBar(
|
).showSnackBar(
|
||||||
SnackBar(content: Text(L10n.of(context).oneClientLoggedOut)),
|
SnackBar(content: Text(L10n.of(context).oneClientLoggedOut)),
|
||||||
);
|
);
|
||||||
|
return;
|
||||||
if (state != LoginState.loggedIn) {
|
|
||||||
FluffyChatApp.router.go('/rooms');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
FluffyChatApp.router.go('/');
|
||||||
});
|
});
|
||||||
onUiaRequest[name] ??= c.onUiaRequest.stream.listen(uiaRequestHandler);
|
onUiaRequest[name] ??= c.onUiaRequest.stream.listen(uiaRequestHandler);
|
||||||
if (PlatformInfos.isWeb || PlatformInfos.isLinux) {
|
if (PlatformInfos.isWeb || PlatformInfos.isLinux) {
|
||||||
|
|
@ -341,7 +339,7 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> createVoipPlugin() async {
|
Future<void> createVoipPlugin() async {
|
||||||
if (AppSettings.experimentalVoip.value) {
|
if (!AppSettings.experimentalVoip.value) {
|
||||||
voipPlugin = null;
|
voipPlugin = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ Future<int?> showPermissionChooser(
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: .min,
|
mainAxisSize: .min,
|
||||||
crossAxisAlignment: .stretch,
|
crossAxisAlignment: .stretch,
|
||||||
spacing: 12.0,
|
spacing: 16.0,
|
||||||
children: [
|
children: [
|
||||||
Text(L10n.of(context).setPowerLevelDescription),
|
Text(L10n.of(context).setPowerLevelDescription),
|
||||||
ValueListenableBuilder(
|
ValueListenableBuilder(
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,11 @@ class QrCodeViewer extends StatelessWidget {
|
||||||
margin: const EdgeInsets.all(32.0),
|
margin: const EdgeInsets.all(32.0),
|
||||||
padding: const EdgeInsets.all(32.0),
|
padding: const EdgeInsets.all(32.0),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: theme.colorScheme.primaryContainer,
|
border: Border.all(
|
||||||
|
color: theme.colorScheme.onPrimaryContainer,
|
||||||
|
width: 4,
|
||||||
|
),
|
||||||
|
color: theme.colorScheme.surfaceBright,
|
||||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
||||||
),
|
),
|
||||||
child: Column(
|
child: Column(
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@
|
||||||
#include <file_selector_linux/file_selector_plugin.h>
|
#include <file_selector_linux/file_selector_plugin.h>
|
||||||
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
|
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
|
||||||
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
|
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
|
||||||
#include <gtk/gtk_plugin.h>
|
|
||||||
#include <handy_window/handy_window_plugin.h>
|
#include <handy_window/handy_window_plugin.h>
|
||||||
#include <record_linux/record_linux_plugin.h>
|
#include <record_linux/record_linux_plugin.h>
|
||||||
#include <screen_retriever_linux/screen_retriever_linux_plugin.h>
|
#include <screen_retriever_linux/screen_retriever_linux_plugin.h>
|
||||||
|
|
@ -45,9 +44,6 @@ void fl_register_plugins(FlPluginRegistry* registry) {
|
||||||
g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar =
|
g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin");
|
||||||
flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar);
|
flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar);
|
||||||
g_autoptr(FlPluginRegistrar) gtk_registrar =
|
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin");
|
|
||||||
gtk_plugin_register_with_registrar(gtk_registrar);
|
|
||||||
g_autoptr(FlPluginRegistrar) handy_window_registrar =
|
g_autoptr(FlPluginRegistrar) handy_window_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "HandyWindowPlugin");
|
||||||
handy_window_plugin_register_with_registrar(handy_window_registrar);
|
handy_window_plugin_register_with_registrar(handy_window_registrar);
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
file_selector_linux
|
file_selector_linux
|
||||||
flutter_secure_storage_linux
|
flutter_secure_storage_linux
|
||||||
flutter_webrtc
|
flutter_webrtc
|
||||||
gtk
|
|
||||||
handy_window
|
handy_window
|
||||||
record_linux
|
record_linux
|
||||||
screen_retriever_linux
|
screen_retriever_linux
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@
|
||||||
import FlutterMacOS
|
import FlutterMacOS
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
import app_links
|
|
||||||
import audio_session
|
import audio_session
|
||||||
import desktop_drop
|
import desktop_drop
|
||||||
import desktop_webview_window
|
import desktop_webview_window
|
||||||
|
|
@ -36,7 +35,6 @@ import window_manager
|
||||||
import window_to_front
|
import window_to_front
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin"))
|
|
||||||
AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin"))
|
AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin"))
|
||||||
DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin"))
|
DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin"))
|
||||||
DesktopWebviewWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWebviewWindowPlugin"))
|
DesktopWebviewWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWebviewWindowPlugin"))
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
PODS:
|
PODS:
|
||||||
- app_links (6.4.1):
|
|
||||||
- FlutterMacOS
|
|
||||||
- audio_session (0.0.1):
|
- audio_session (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- desktop_drop (0.0.1):
|
- desktop_drop (0.0.1):
|
||||||
|
|
@ -76,7 +74,6 @@ PODS:
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`)
|
|
||||||
- audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`)
|
- audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`)
|
||||||
- desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`)
|
- desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`)
|
||||||
- desktop_webview_window (from `Flutter/ephemeral/.symlinks/plugins/desktop_webview_window/macos`)
|
- desktop_webview_window (from `Flutter/ephemeral/.symlinks/plugins/desktop_webview_window/macos`)
|
||||||
|
|
@ -114,8 +111,6 @@ SPEC REPOS:
|
||||||
- WebRTC-SDK
|
- WebRTC-SDK
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
app_links:
|
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/app_links/macos
|
|
||||||
audio_session:
|
audio_session:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos
|
||||||
desktop_drop:
|
desktop_drop:
|
||||||
|
|
@ -178,7 +173,6 @@ EXTERNAL SOURCES:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/window_to_front/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/window_to_front/macos
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
app_links: 05a6ec2341985eb05e9f97dc63f5837c39895c3f
|
|
||||||
audio_session: eaca2512cf2b39212d724f35d11f46180ad3a33e
|
audio_session: eaca2512cf2b39212d724f35d11f46180ad3a33e
|
||||||
desktop_drop: 10a3e6a7fa9dbe350541f2574092fecfa345a07b
|
desktop_drop: 10a3e6a7fa9dbe350541f2574092fecfa345a07b
|
||||||
desktop_webview_window: 7e37af677d6d19294cb433d9b1d878ef78dffa4d
|
desktop_webview_window: 7e37af677d6d19294cb433d9b1d878ef78dffa4d
|
||||||
|
|
@ -187,7 +181,7 @@ SPEC CHECKSUMS:
|
||||||
emoji_picker_flutter: 51ca408e289d84d1e460016b2a28721ec754fcf7
|
emoji_picker_flutter: 51ca408e289d84d1e460016b2a28721ec754fcf7
|
||||||
file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a
|
file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a
|
||||||
file_selector_macos: 9e9e068e90ebee155097d00e89ae91edb2374db7
|
file_selector_macos: 9e9e068e90ebee155097d00e89ae91edb2374db7
|
||||||
flutter_local_notifications: 4bf37a31afde695b56091b4ae3e4d9c7a7e6cda0
|
flutter_local_notifications: 1fc7ffb10a83d6a2eeeeddb152d43f1944b0aad0
|
||||||
flutter_new_badger: 6fe9bf7e42793a164032c21f164c0ad9985cd0f2
|
flutter_new_badger: 6fe9bf7e42793a164032c21f164c0ad9985cd0f2
|
||||||
flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23
|
flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23
|
||||||
flutter_vodozemac: fd2ea9cb3e2a37beaac883a369811fbfe042fc53
|
flutter_vodozemac: fd2ea9cb3e2a37beaac883a369811fbfe042fc53
|
||||||
|
|
|
||||||
189
pubspec.lock
189
pubspec.lock
|
|
@ -25,14 +25,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.13.6"
|
version: "0.13.6"
|
||||||
animations:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: animations
|
|
||||||
sha256: "18938cefd7dcc04e1ecac0db78973761a01e4bc2d6bfae0cfa596bfeac9e96ab"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "2.1.1"
|
|
||||||
ansicolor:
|
ansicolor:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -41,38 +33,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.3"
|
version: "2.0.3"
|
||||||
app_links:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: app_links
|
|
||||||
sha256: "5f88447519add627fe1cbcab4fd1da3d4fed15b9baf29f28b22535c95ecee3e8"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "6.4.1"
|
|
||||||
app_links_linux:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: app_links_linux
|
|
||||||
sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "1.0.3"
|
|
||||||
app_links_platform_interface:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: app_links_platform_interface
|
|
||||||
sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "2.0.2"
|
|
||||||
app_links_web:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: app_links_web
|
|
||||||
sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "1.0.4"
|
|
||||||
archive:
|
archive:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -282,7 +242,7 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.2"
|
version: "1.0.2"
|
||||||
cupertino_icons:
|
cupertino_icons:
|
||||||
dependency: "direct main"
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: cupertino_icons
|
name: cupertino_icons
|
||||||
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
|
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
|
||||||
|
|
@ -502,11 +462,6 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
flutter_driver:
|
|
||||||
dependency: transitive
|
|
||||||
description: flutter
|
|
||||||
source: sdk
|
|
||||||
version: "0.0.0"
|
|
||||||
flutter_foreground_task:
|
flutter_foreground_task:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -535,34 +490,34 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications
|
name: flutter_local_notifications
|
||||||
sha256: "2b50e938a275e1ad77352d6a25e25770f4130baa61eaf02de7a9a884680954ad"
|
sha256: "0d9035862236fe38250fe1644d7ed3b8254e34a21b2c837c9f539fbb3bba5ef1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "20.1.0"
|
version: "21.0.0"
|
||||||
flutter_local_notifications_linux:
|
flutter_local_notifications_linux:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications_linux
|
name: flutter_local_notifications_linux
|
||||||
sha256: dce0116868cedd2cdf768af0365fc37ff1cbef7c02c4f51d0587482e625868d0
|
sha256: e0f25e243c6c44c825bbbc6b2b2e76f7d9222362adcfe9fd780bf01923c840bd
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.0.0"
|
version: "8.0.0"
|
||||||
flutter_local_notifications_platform_interface:
|
flutter_local_notifications_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications_platform_interface
|
name: flutter_local_notifications_platform_interface
|
||||||
sha256: "23de31678a48c084169d7ae95866df9de5c9d2a44be3e5915a2ff067aeeba899"
|
sha256: e7db3d5b49c2b7ecc68deba4aaaa67a348f92ee0fef34c8e4b4459dbef0d7307
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.0"
|
version: "11.0.0"
|
||||||
flutter_local_notifications_windows:
|
flutter_local_notifications_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: flutter_local_notifications_windows
|
name: flutter_local_notifications_windows
|
||||||
sha256: e97a1a3016512437d9c0b12fae7d1491c3c7b9aa7f03a69b974308840656b02a
|
sha256: "3a2654ba104fbb52c618ebed9def24ef270228470718c43b3a6afcd5c81bef0c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.1"
|
version: "3.0.0"
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
@ -714,11 +669,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0"
|
version: "4.0.0"
|
||||||
fuchsia_remote_debug_protocol:
|
|
||||||
dependency: transitive
|
|
||||||
description: flutter
|
|
||||||
source: sdk
|
|
||||||
version: "0.0.0"
|
|
||||||
geoclue:
|
geoclue:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -807,14 +757,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.8"
|
version: "0.2.8"
|
||||||
gtk:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: gtk
|
|
||||||
sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "2.1.0"
|
|
||||||
handy_window:
|
handy_window:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -959,11 +901,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.6.0"
|
version: "4.6.0"
|
||||||
integration_test:
|
|
||||||
dependency: "direct dev"
|
|
||||||
description: flutter
|
|
||||||
source: sdk
|
|
||||||
version: "0.0.0"
|
|
||||||
intl:
|
intl:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
@ -1061,7 +998,7 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.6.2"
|
version: "1.6.2"
|
||||||
linkify:
|
linkify:
|
||||||
dependency: "direct main"
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: linkify
|
name: linkify
|
||||||
sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832"
|
sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832"
|
||||||
|
|
@ -1112,10 +1049,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: matcher
|
name: matcher
|
||||||
sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
|
sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.12.18"
|
version: "0.12.19"
|
||||||
material_color_utilities:
|
material_color_utilities:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -1128,10 +1065,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: matrix
|
name: matrix
|
||||||
sha256: c0214ee99a73957d3c02d54a60afcf9acee577b0924749085d6fdf556e8eba42
|
sha256: "5bb38e98212bc4c3244c762a1af787f7239a38d2cfdf44488258283ff899f77c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.1"
|
version: "6.2.0"
|
||||||
meta:
|
meta:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -1300,54 +1237,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.0"
|
version: "2.3.0"
|
||||||
permission_handler:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: permission_handler
|
|
||||||
sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "12.0.1"
|
|
||||||
permission_handler_android:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: permission_handler_android
|
|
||||||
sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "13.0.1"
|
|
||||||
permission_handler_apple:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: permission_handler_apple
|
|
||||||
sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "9.4.7"
|
|
||||||
permission_handler_html:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: permission_handler_html
|
|
||||||
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.1.3+5"
|
|
||||||
permission_handler_platform_interface:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: permission_handler_platform_interface
|
|
||||||
sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "4.3.0"
|
|
||||||
permission_handler_windows:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: permission_handler_windows
|
|
||||||
sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.2.1"
|
|
||||||
petitparser:
|
petitparser:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -1849,14 +1738,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.0"
|
version: "0.3.0"
|
||||||
sync_http:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: sync_http
|
|
||||||
sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.3.1"
|
|
||||||
synchronized:
|
synchronized:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -1877,34 +1758,34 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test
|
name: test
|
||||||
sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a"
|
sha256: "280d6d890011ca966ad08df7e8a4ddfab0fb3aa49f96ed6de56e3521347a9ae7"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.29.0"
|
version: "1.30.0"
|
||||||
test_api:
|
test_api:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
|
sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.9"
|
version: "0.7.10"
|
||||||
test_core:
|
test_core:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_core
|
name: test_core
|
||||||
sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943"
|
sha256: "0381bd1585d1a924763c308100f2138205252fb90c9d4eeaf28489ee65ccde51"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.15"
|
version: "0.6.16"
|
||||||
timezone:
|
timezone:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: timezone
|
name: timezone
|
||||||
sha256: dd14a3b83cfd7cb19e7888f1cbc20f258b8d71b54c06f79ac585f14093a287d1
|
sha256: "784a5e34d2eb62e1326f24d6f600aaaee452eb8ca8ef2f384a59244e292d158b"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.10.1"
|
version: "0.11.0"
|
||||||
tint:
|
tint:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -1917,10 +1798,10 @@ packages:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: translations_cleaner
|
name: translations_cleaner
|
||||||
sha256: "811f42be32f024fdf083903f198d3625f6ee6927601e3a53a29b85b90508b88c"
|
sha256: c6e5051cb5d4fe4c5b2cc1ef83a6964f27063f9cf5b6166f445709bea8f81ad3
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.0"
|
version: "0.1.1"
|
||||||
typed_data:
|
typed_data:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -2109,10 +1990,10 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: video_player
|
name: video_player
|
||||||
sha256: "08bfba72e311d48219acad4e191b1f9c27ff8cf928f2c7234874592d9c9d7341"
|
sha256: "48a7bdaa38a3d50ec10c78627abdbfad863fdf6f0d6e08c7c3c040cfd80ae36f"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.11.0"
|
version: "2.11.1"
|
||||||
video_player_android:
|
video_player_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -2165,18 +2046,18 @@ packages:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: wakelock_plus
|
name: wakelock_plus
|
||||||
sha256: "9296d40c9adbedaba95d1e704f4e0b434be446e2792948d0e4aa977048104228"
|
sha256: e4e125b7c1a2f0e491e5452afdc0e25ab77b2d2775a7caa231fcc1c1f2162c47
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.0"
|
version: "1.5.0"
|
||||||
wakelock_plus_platform_interface:
|
wakelock_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: wakelock_plus_platform_interface
|
name: wakelock_plus_platform_interface
|
||||||
sha256: "036deb14cd62f558ca3b73006d52ce049fabcdcb2eddfe0bf0fe4e8a943b5cf2"
|
sha256: "24b84143787220a403491c2e5de0877fbbb87baf3f0b18a2a988973863db4b03"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
version: "1.4.0"
|
||||||
watcher:
|
watcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -2218,14 +2099,6 @@ packages:
|
||||||
url: "https://github.com/google/webcrypto.dart.git"
|
url: "https://github.com/google/webcrypto.dart.git"
|
||||||
source: git
|
source: git
|
||||||
version: "0.6.0"
|
version: "0.6.0"
|
||||||
webdriver:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: webdriver
|
|
||||||
sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.1.0"
|
|
||||||
webkit_inspection_protocol:
|
webkit_inspection_protocol:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
@ -2315,5 +2188,5 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.3"
|
version: "3.1.3"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.10.3 <4.0.0"
|
dart: ">=3.11.1 <4.0.0"
|
||||||
flutter: ">=3.38.4"
|
flutter: ">=3.38.4"
|
||||||
|
|
|
||||||
21
pubspec.yaml
21
pubspec.yaml
|
|
@ -4,14 +4,12 @@ publish_to: none
|
||||||
# On version bump please also increase:
|
# On version bump please also increase:
|
||||||
# 1. The build number (for F-Droid)
|
# 1. The build number (for F-Droid)
|
||||||
# 2. The version in /snap/snapcraft.yaml
|
# 2. The version in /snap/snapcraft.yaml
|
||||||
version: 2.4.0+3546
|
version: 2.5.0+3547
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.10.0 <4.0.0"
|
sdk: ">=3.11.1 <4.0.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
animations: ^2.1.1
|
|
||||||
app_links: ^6.4.1
|
|
||||||
archive: ^4.0.7
|
archive: ^4.0.7
|
||||||
async: ^2.11.0
|
async: ^2.11.0
|
||||||
badges: ^3.1.2
|
badges: ^3.1.2
|
||||||
|
|
@ -19,7 +17,6 @@ dependencies:
|
||||||
chewie: ^1.13.0
|
chewie: ^1.13.0
|
||||||
collection: ^1.18.0
|
collection: ^1.18.0
|
||||||
cross_file: ^0.3.5
|
cross_file: ^0.3.5
|
||||||
cupertino_icons: any
|
|
||||||
desktop_drop: ^0.7.0
|
desktop_drop: ^0.7.0
|
||||||
desktop_notifications: ^0.6.3
|
desktop_notifications: ^0.6.3
|
||||||
device_info_plus: ^12.3.0
|
device_info_plus: ^12.3.0
|
||||||
|
|
@ -31,7 +28,7 @@ dependencies:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_foreground_task: ^9.2.1
|
flutter_foreground_task: ^9.2.1
|
||||||
flutter_linkify: ^6.0.0
|
flutter_linkify: ^6.0.0
|
||||||
flutter_local_notifications: ^20.1.0
|
flutter_local_notifications: ^21.0.0
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_map: ^8.2.2
|
flutter_map: ^8.2.2
|
||||||
|
|
@ -52,8 +49,7 @@ dependencies:
|
||||||
intl: any
|
intl: any
|
||||||
just_audio: ^0.10.5
|
just_audio: ^0.10.5
|
||||||
latlong2: ^0.9.1
|
latlong2: ^0.9.1
|
||||||
linkify: ^5.0.0
|
matrix: ^6.2.0
|
||||||
matrix: ^6.1.1
|
|
||||||
mime: ^2.0.0
|
mime: ^2.0.0
|
||||||
native_imaging: ^0.4.0
|
native_imaging: ^0.4.0
|
||||||
opus_caf_converter_dart: ^1.0.1
|
opus_caf_converter_dart: ^1.0.1
|
||||||
|
|
@ -61,7 +57,6 @@ dependencies:
|
||||||
particles_network: ^1.9.3
|
particles_network: ^1.9.3
|
||||||
path: ^1.9.0
|
path: ^1.9.0
|
||||||
path_provider: ^2.1.2
|
path_provider: ^2.1.2
|
||||||
permission_handler: ^12.0.1
|
|
||||||
pretty_qr_code: ^3.6.0
|
pretty_qr_code: ^3.6.0
|
||||||
provider: ^6.0.2
|
provider: ^6.0.2
|
||||||
punycode: ^1.0.0
|
punycode: ^1.0.0
|
||||||
|
|
@ -81,8 +76,8 @@ dependencies:
|
||||||
universal_html: ^2.3.0
|
universal_html: ^2.3.0
|
||||||
url_launcher: ^6.3.2
|
url_launcher: ^6.3.2
|
||||||
video_compress: ^3.1.4
|
video_compress: ^3.1.4
|
||||||
video_player: ^2.10.1
|
video_player: ^2.11.1
|
||||||
wakelock_plus: ^1.3.3
|
wakelock_plus: ^1.5.0
|
||||||
webrtc_interface: ^1.3.0
|
webrtc_interface: ^1.3.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
|
@ -92,10 +87,8 @@ dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
import_sorter: ^4.6.0
|
import_sorter: ^4.6.0
|
||||||
integration_test:
|
|
||||||
sdk: flutter
|
|
||||||
license_checker: ^1.6.2
|
license_checker: ^1.6.2
|
||||||
translations_cleaner: ^0.1.0
|
translations_cleaner: ^0.1.1
|
||||||
|
|
||||||
import_sorter:
|
import_sorter:
|
||||||
ignored_files: # Optional, defaults to []
|
ignored_files: # Optional, defaults to []
|
||||||
|
|
|
||||||
|
|
@ -10,16 +10,6 @@
|
||||||
"English"
|
"English"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "converser.eu",
|
|
||||||
"website": "https://converser.eu",
|
|
||||||
"description": "A free and decentralized communication server.",
|
|
||||||
"reg_method": "oidc",
|
|
||||||
"languages": [
|
|
||||||
"All",
|
|
||||||
"Français"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "mozilla.org",
|
"name": "mozilla.org",
|
||||||
"website": "https://mozilla.org",
|
"website": "https://mozilla.org",
|
||||||
|
|
@ -31,11 +21,13 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "magdeburg.jetzt",
|
"name": "tchncs.de",
|
||||||
"website": "https://magdeburg.jetzt",
|
"website": "https://tchncs.de",
|
||||||
|
"description": "A general homeserver. Owner also hosts other FOSS services.",
|
||||||
"reg_method": "oidc",
|
"reg_method": "oidc",
|
||||||
"languages": [
|
"languages": [
|
||||||
"All",
|
"All",
|
||||||
|
"English",
|
||||||
"Deutsch"
|
"Deutsch"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
name: fluffychat
|
name: fluffychat
|
||||||
title: FluffyChat
|
title: FluffyChat
|
||||||
base: core24
|
base: core24
|
||||||
version: 2.4.0
|
version: 2.5.0
|
||||||
license: AGPL-3.0
|
license: AGPL-3.0
|
||||||
summary: The cutest messenger in the Matrix network
|
summary: The cutest messenger in the Matrix network
|
||||||
description: |
|
description: |
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
#include <app_links/app_links_plugin_c_api.h>
|
|
||||||
#include <desktop_drop/desktop_drop_plugin.h>
|
#include <desktop_drop/desktop_drop_plugin.h>
|
||||||
#include <desktop_webview_window/desktop_webview_window_plugin.h>
|
#include <desktop_webview_window/desktop_webview_window_plugin.h>
|
||||||
#include <dynamic_color/dynamic_color_plugin_c_api.h>
|
#include <dynamic_color/dynamic_color_plugin_c_api.h>
|
||||||
|
|
@ -15,7 +14,6 @@
|
||||||
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
|
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
|
||||||
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
|
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
|
||||||
#include <geolocator_windows/geolocator_windows.h>
|
#include <geolocator_windows/geolocator_windows.h>
|
||||||
#include <permission_handler_windows/permission_handler_windows_plugin.h>
|
|
||||||
#include <record_windows/record_windows_plugin_c_api.h>
|
#include <record_windows/record_windows_plugin_c_api.h>
|
||||||
#include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h>
|
#include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h>
|
||||||
#include <share_plus/share_plus_windows_plugin_c_api.h>
|
#include <share_plus/share_plus_windows_plugin_c_api.h>
|
||||||
|
|
@ -26,8 +24,6 @@
|
||||||
#include <window_to_front/window_to_front_plugin.h>
|
#include <window_to_front/window_to_front_plugin.h>
|
||||||
|
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
AppLinksPluginCApiRegisterWithRegistrar(
|
|
||||||
registry->GetRegistrarForPlugin("AppLinksPluginCApi"));
|
|
||||||
DesktopDropPluginRegisterWithRegistrar(
|
DesktopDropPluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("DesktopDropPlugin"));
|
registry->GetRegistrarForPlugin("DesktopDropPlugin"));
|
||||||
DesktopWebviewWindowPluginRegisterWithRegistrar(
|
DesktopWebviewWindowPluginRegisterWithRegistrar(
|
||||||
|
|
@ -44,8 +40,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
registry->GetRegistrarForPlugin("FlutterWebRTCPlugin"));
|
registry->GetRegistrarForPlugin("FlutterWebRTCPlugin"));
|
||||||
GeolocatorWindowsRegisterWithRegistrar(
|
GeolocatorWindowsRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("GeolocatorWindows"));
|
registry->GetRegistrarForPlugin("GeolocatorWindows"));
|
||||||
PermissionHandlerWindowsPluginRegisterWithRegistrar(
|
|
||||||
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
|
|
||||||
RecordWindowsPluginCApiRegisterWithRegistrar(
|
RecordWindowsPluginCApiRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("RecordWindowsPluginCApi"));
|
registry->GetRegistrarForPlugin("RecordWindowsPluginCApi"));
|
||||||
ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar(
|
ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar(
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
app_links
|
|
||||||
desktop_drop
|
desktop_drop
|
||||||
desktop_webview_window
|
desktop_webview_window
|
||||||
dynamic_color
|
dynamic_color
|
||||||
|
|
@ -12,7 +11,6 @@ list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
flutter_secure_storage_windows
|
flutter_secure_storage_windows
|
||||||
flutter_webrtc
|
flutter_webrtc
|
||||||
geolocator_windows
|
geolocator_windows
|
||||||
permission_handler_windows
|
|
||||||
record_windows
|
record_windows
|
||||||
screen_retriever_windows
|
screen_retriever_windows
|
||||||
share_plus
|
share_plus
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue